Logs on 2024-04-06 (liberachat/#haskell)
| 00:00:00 | <Inst> | it'd be really cool to have haddock be able to automatically generate examples of code, but guess what? |
| 00:00:14 | <Inst> | massive security hole :( |
| 00:08:33 | × | Inst quits (~Inst@120.244.192.170) (Changing host) |
| 00:08:33 | → | Inst joins (~Inst@user/Inst) |
| 00:13:14 | × | ephemient quits (uid407513@id-407513.lymington.irccloud.com) (Changing host) |
| 00:13:14 | → | ephemient joins (uid407513@user/ephemient) |
| 00:16:56 | × | dbaoty quits (~dbaoty@tptn-04-0838.dsl.iowatelecom.net) (Quit: Leaving.) |
| 00:29:46 | × | oo_miguel quits (~Thunderbi@78-11-181-16.static.ip.netia.com.pl) (Quit: oo_miguel) |
| 00:30:37 | × | peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 256 seconds) |
| 00:34:23 | × | fbytez_ quits (~uid@user/fbytez) (Quit: byte byte) |
| 00:34:50 | → | fbytez joins (~uid@user/fbytez) |
| 00:37:09 | → | sroso joins (~sroso@user/SrOso) |
| 00:38:51 | × | polyphem quits (~rod@p200300ef271ab1008634ba5d8231450c.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 00:39:08 | → | rosco joins (~rosco@i222-150-140-233.s41.a013.ap.plala.or.jp) |
| 00:40:44 | → | polyphem joins (~rod@p200300ef273784005840865d4515fb32.dip0.t-ipconnect.de) |
| 00:41:05 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 00:44:05 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 252 seconds) |
| 00:45:39 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 268 seconds) |
| 00:57:15 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 01:00:53 | → | Guest54 joins (~Guest54@p10645008-ipngn27601marunouchi.tokyo.ocn.ne.jp) |
| 01:01:05 | × | Guest54 quits (~Guest54@p10645008-ipngn27601marunouchi.tokyo.ocn.ne.jp) (Client Quit) |
| 01:04:07 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 01:10:38 | × | sadie_ quits (~sadie@c-76-155-235-153.hsd1.co.comcast.net) (Remote host closed the connection) |
| 01:17:34 | × | migas97 quits (~migas@static.140.65.63.178.clients.your-server.de) (Quit: The Lounge - https://thelounge.github.io) |
| 01:20:58 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 264 seconds) |
| 01:22:30 | × | rosco quits (~rosco@i222-150-140-233.s41.a013.ap.plala.or.jp) (Quit: Lost terminal) |
| 01:26:26 | × | waleee quits (~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 252 seconds) |
| 01:28:03 | → | dbaoty joins (~dbaoty@tptn-04-0838.dsl.iowatelecom.net) |
| 01:33:17 | × | peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 240 seconds) |
| 01:33:36 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 01:35:42 | × | JSharp quits (sid4580@id-4580.lymington.irccloud.com) (Changing host) |
| 01:35:42 | → | JSharp joins (sid4580@user/JSharp) |
| 01:39:53 | × | gabiruh quits (~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in) |
| 01:57:48 | × | otto_s quits (~user@p5de2f5c3.dip0.t-ipconnect.de) (Ping timeout: 268 seconds) |
| 01:58:50 | × | dbaoty quits (~dbaoty@tptn-04-0838.dsl.iowatelecom.net) (Quit: Leaving.) |
| 01:59:26 | → | otto_s joins (~user@p4ff27a75.dip0.t-ipconnect.de) |
| 02:03:17 | → | gabiruh joins (~gabiruh@191.252.222.55) |
| 02:11:29 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 02:17:22 | × | dsmith quits (~dsmith@024-029-202-168.inf.spectrum.com) (Changing host) |
| 02:17:22 | → | dsmith joins (~dsmith@user/dsmith) |
| 02:22:28 | → | gaff joins (~gaff@49.207.205.255) |
| 02:23:40 | <gaff> | I have this type defined: `newtype Logger a b = Logger { execLogger :: (b, [a]) } `. Is it possible to create Alternative and MonadPlus instances for this type? |
| 02:25:05 | <gaff> | Sorry, it should be `newtype Logger a b = Logger ( execLogger :: (b, [a]) )`. |
| 02:27:22 | <geekosaur> | that's just a simplified Writer, isn't it? should allow Applicative, Alternative, Monad, and MonadPlus |
| 02:29:30 | <c_wraith> | What kind of MonadPlus instance does that give you? what's mempty? |
| 02:29:48 | <c_wraith> | err, mzero |
| 02:30:02 | <geekosaur> | mm, right, need some Monoid constraints |
| 02:30:21 | <c_wraith> | I don't think that's enough. you also need a b value |
| 02:32:53 | <c_wraith> | you're only getting one of those with a bottom. And I suppose a bottom satisfies the contract, such as it is... |
| 02:32:59 | <c_wraith> | But it's not a useful instance |
| 02:35:01 | <c_wraith> | Alternative actually has stricter laws, saying the instance should be a monoid. that implies "everything is a bottom" isn't good enough. |
| 02:36:15 | <EvanR> | is everything is a bottom not a monoid instance |
| 02:39:05 | <c_wraith> | not unless it's an empty data type |
| 02:39:18 | <c_wraith> | otherwise the identity laws fail |
| 02:42:05 | <EvanR> | bottom * bottom = bottom |
| 02:42:18 | <c_wraith> | but that's only the test if the data type is empty |
| 02:42:24 | <EvanR> | oh, yeah, then not everything is bottom |
| 02:47:27 | <gaff> | c_wraith: I don't think there is a way to define mzero for this MonadPlus instance. |
| 02:47:45 | <gaff> | how would you define it? beats me. |
| 02:47:53 | <c_wraith> | gaff: I don't see a useful way. |
| 02:48:47 | <gaff> | You coudl do this, but that would be largely futile: `mzero = Logger (undefined, [])` |
| 02:49:14 | <c_wraith> | and it wouldn't be law-abiding on the Alternative side, as I was talking about above. |
| 02:50:00 | <c_wraith> | Alternative tells us it's creating a monoid. That implementation can't obey the monoid requirement that it be an identity |
| 02:52:34 | <gaff> | c_wraith: you could easily define a Monoid instance for this type and have `instance Monoid b => Monoid (Logger a b) where mempty = Logger (mempty, []) ...` and in the MonadPlus instance have mzero = mempty, but that doesn't compile either. |
| 02:53:27 | <c_wraith> | You can't do that, because Alternative and MonadPlus apply to the higher-kinded type |
| 02:53:42 | <c_wraith> | That is, they apply to `Logger a' |
| 02:53:49 | <c_wraith> | There's nowhere in that to add a constraint to `b` |
| 02:53:56 | <geekosaur> | oh, that was the part I was missing |
| 02:54:04 | <gaff> | c_wraith: I see. thank you. |
| 02:55:00 | <gaff> | c_wraith: so in general, as this type here shows, it ain't possible to define MonadPlus and Alternative instances for all types? |
| 02:55:14 | <c_wraith> | it absolutely is not, even if they have the right kind :) |
| 02:56:01 | <gaff> | c_wraith: I see. Unfortunately, this aspect is not mentioned in any of the MoandPlus and Alternative discussions I have read so far. |
| 02:56:13 | <EvanR> | the monoidness kind of implies that |
| 02:56:26 | <EvanR> | since there are laws there |
| 02:56:37 | <c_wraith> | It's kind of implicit in the fact that classes usually come with laws the implementations must obey |
| 02:57:00 | <c_wraith> | That wouldn't be much of a limitation if there was always an implementation that obeys the laws |
| 02:57:05 | × | td_ quits (~td@i53870915.versanet.de) (Ping timeout: 272 seconds) |
| 02:57:45 | <gaff> | c_wraith: I see. So in this case MonadPlus and Alternative, those laws would tell us what can be made instances of these classes? Intuitively, what would they be? |
| 02:58:18 | <EvanR> | this is all feeding into haskell's reputation for bondage and discipline. I can't write whatever the hell I want in an instance? |
| 02:58:29 | → | td_ joins (~td@i53870929.versanet.de) |
| 02:59:10 | <c_wraith> | MonadPlus historically hasn't had the greatest story with being consistent there. But Alternative specifically says that it describes a monoid. Then it sort of leaves it up to you to know what that means. |
| 02:59:49 | <c_wraith> | I think you're expected to have run into these things in other classes first :) |
| 03:00:51 | <gaff> | c_wraith: In this case of Logger type, even the operation (<|>) doesn't make any sense. I mean intuitively what in the world would that be, you know? |
| 03:01:27 | <c_wraith> | gaff: In the specific case of Logger... yeah. What *does* that mean? |
| 03:01:46 | <c_wraith> | FWIW, that's why laws are often in terms of the interactions between multiple operations |
| 03:02:22 | <gaff> | c_wraith: it doesn't mean anything sensible unless you can cook up something on your own, which would invariably make no sense. |
| 03:03:38 | <c_wraith> | I think this is also an area why Haskell's type system is doing a lot of underrated work. It's rejecting a lot of "just make it work" implementations before anyone else has to run into them. |
| 03:03:49 | <c_wraith> | an area *where* |
| 03:03:57 | <gaff> | yes |
| 03:06:24 | <gaff> | c_wraith: you mentioned earlier that Alternative says it describes a monoid. The Alternative class definition starts off this way: `class Applicative f => Alternative f where ... ` I didn't see any mention of Monoid anywhere. Are you implying that the Monoid stuff is implicit in the Alternative laws? |
| 03:07:01 | <c_wraith> | Oh, I'm looking at the docs: https://hackage.haskell.org/package/base-4.19.1.0/docs/GHC-Base.html#t:Alternative "A monoid on applicative functors." |
| 03:08:23 | <gaff> | c_wraith: Ah, I see that now. Thank you! |
| 03:09:14 | <gaff> | You could easily define Alternative for Either I think. |
| 03:10:47 | <c_wraith> | It still gives you trouble with what to do with `Right 5' <|> `Right 7`. |
| 03:11:07 | <c_wraith> | There *are* things you can do, but none of them are obviously right |
| 03:11:15 | <EvanR> | > Right 5 <|> Right 7 |
| 03:11:17 | <lambdabot> | error: |
| 03:11:17 | <lambdabot> | • Ambiguous type variable ‘a0’ arising from a use of ‘show_M458786900715... |
| 03:11:17 | <lambdabot> | prevents the constraint ‘(Show a0)’ from being solved. |
| 03:11:30 | <EvanR> | cmon |
| 03:11:33 | <c_wraith> | You can use a First or a Last style implementation |
| 03:11:52 | <c_wraith> | Both are valid, but neither one is more obviously correct than the other |
| 03:12:24 | <gaff> | c_wraith: I see. Well, in case of Maybe, you do have Just 5 <|> Just 10 = Just 5 I think (not sure). |
| 03:12:41 | <c_wraith> | Looks like Either does have a First-like instance |
| 03:12:48 | <c_wraith> | So I'm sure Maybe does too |
| 03:13:56 | <gaff> | c_wraith: Maybe is listed as having an instance of Alternative, but I don't see Either listed there. |
| 03:14:09 | <c_wraith> | > Right 5 <|> Right 7 :: Either String Int |
| 03:14:10 | <lambdabot> | Right 5 |
| 03:14:17 | <c_wraith> | Well, *something* defined one! :) |
| 03:14:30 | <gaff> | c_wraith: :) |
| 03:15:47 | <gaff> | it isnt there in ghc 8.10.4 |
| 03:15:54 | <c_wraith> | Huh. Yeah, that's not in an obvious place. Not sure where lambdabot's getting it |
| 03:16:42 | <c_wraith> | this is the downside to lambdabot having a lot of libraries imported by default |
| 03:17:56 | <gaff> | c_wraith: One of the ideas people talk about in favour of using Alternative or MonadPlus is that it makes the code more general and not specific to a monad. But they don't mention that you can't define instances for these for all monads! |
| 03:20:17 | × | machinedgod quits (~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 252 seconds) |
| 03:23:22 | <EvanR> | great episode in the story of not using stuff just because it's there |
| 03:23:38 | <EvanR> | at least wait until there's a good reason |
| 03:23:43 | <c_wraith> | In fact, you'll find APIs tend to move away from that sort of thing. |
| 03:24:31 | <c_wraith> | If you look at Data.Map.lookup in containers 0.1.0.0... man, that was silly. Even when Monad contained fail. Containers stopped working that was long before fail was moved out of the class. |
| 03:24:31 | → | aforemny_ joins (~aforemny@2001:9e8:6ccc:cd00:83d5:fd83:d24c:2c05) |
| 03:24:38 | × | ec_ quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 260 seconds) |
| 03:24:56 | <c_wraith> | stopped working that *way* long before.. |
| 03:25:55 | × | aforemny quits (~aforemny@i59F516F4.versanet.de) (Ping timeout: 260 seconds) |
| 03:26:05 | <gaff> | EvanR: yeah, wait until there is a good reason. Quite often, there isn't any. |
| 03:28:08 | <c_wraith> | A lot of the time, polymorphism doesn't add anything. I'm a big fan of concrete types when there is only one correct way they can work. |
| 03:28:55 | <gaff> | EvanR: what you have stated is a tried and tested piece of wisdom, but very often people, including myself, tend to forget it and overdo things. |
| 03:29:15 | <c_wraith> | On the other hand, I'm a big fan of polymorphism when it lets the caller have more power or the implementation be simpler. |
| 03:29:47 | <c_wraith> | But if the polymorphism works out to something like "this is just an obscure way of writing Either", who is it helping? |
| 03:32:22 | <gaff> | c_wraith: one idea behind polymorphism is that it removes code duplication. But you have to first see that such a duplication is indeed a reality. Very often, people tend to jump right into polymorphism before seeing such duplication. |
| 04:01:49 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 04:01:56 | → | ddellacosta joins (~ddellacos@ool-44c73d29.dyn.optonline.net) |
| 04:27:32 | → | ec_ joins (~ec@gateway/tor-sasl/ec) |
| 04:35:22 | × | ddellacosta quits (~ddellacos@ool-44c73d29.dyn.optonline.net) (Ping timeout: 264 seconds) |
| 04:37:10 | → | ddellacosta joins (~ddellacos@ool-44c73d29.dyn.optonline.net) |
| 04:40:16 | → | gaff joins (~gaff@49.207.205.255) |
| 04:54:33 | × | gaff quits (~gaff@49.207.205.255) (Ping timeout: 256 seconds) |
| 04:55:00 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 05:01:38 | → | gaff joins (~gaff@49.207.205.255) |
| 05:14:09 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:14:27 | → | gaff joins (~gaff@49.207.205.255) |
| 05:14:56 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:15:13 | → | gaff joins (~gaff@49.207.205.255) |
| 05:15:44 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:16:19 | → | gaff joins (~gaff@49.207.205.255) |
| 05:16:48 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:17:06 | → | gaff joins (~gaff@49.207.205.255) |
| 05:17:36 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:17:54 | → | gaff joins (~gaff@49.207.205.255) |
| 05:18:23 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:18:41 | → | gaff joins (~gaff@49.207.205.255) |
| 05:19:11 | × | gaff quits (~gaff@49.207.205.255) (Remote host closed the connection) |
| 05:19:47 | → | gaff joins (~gaff@49.207.205.255) |
| 05:24:09 | × | gaff quits (~gaff@49.207.205.255) (Ping timeout: 256 seconds) |
| 05:44:16 | × | notzmv quits (~daniel@user/notzmv) (Ping timeout: 260 seconds) |
| 05:54:23 | → | gaff joins (~gaff@49.207.205.255) |
| 05:58:09 | × | jle` quits (~jle`@2603-8001-3b02-84d4-fb26-0043-58fe-e57b.res6.spectrum.com) (Quit: WeeChat 4.2.1) |
| 05:58:41 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 252 seconds) |
| 05:59:04 | → | Square2 joins (~Square@user/square) |
| 06:00:39 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 06:03:49 | × | gaff quits (~gaff@49.207.205.255) (Ping timeout: 256 seconds) |
| 06:09:03 | → | cawfee joins (~root@2406:3003:2077:1c50::babe) |
| 06:20:38 | → | causal joins (~eric@50.35.88.207) |
| 06:21:40 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 06:22:31 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 256 seconds) |
| 06:24:01 | → | sadie_ joins (~sadie@c-76-155-235-153.hsd1.co.comcast.net) |
| 06:25:26 | × | philopsos quits (~caecilius@user/philopsos) (Ping timeout: 268 seconds) |
| 06:26:04 | → | qqq joins (~qqq@92.43.167.61) |
| 06:31:21 | → | gmg joins (~user@user/gehmehgeh) |
| 06:32:31 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 06:33:57 | → | gmg joins (~user@user/gehmehgeh) |
| 06:35:51 | → | gaff joins (~gaff@49.207.205.255) |
| 06:41:05 | × | ubert quits (~Thunderbi@p200300ecdf39578eeee93514f98d266d.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 06:41:13 | → | ubert1 joins (~Thunderbi@p200300ecdf395731c4a2a707ba473843.dip0.t-ipconnect.de) |
| 06:42:31 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 06:43:26 | → | euleritian joins (~euleritia@dynamic-176-006-191-173.176.6.pool.telefonica.de) |
| 06:43:30 | ubert1 | is now known as ubert |
| 06:46:24 | × | gaff quits (~gaff@49.207.205.255) (Ping timeout: 268 seconds) |
| 06:54:33 | → | caconym joins (~caconym@user/caconym) |
| 06:54:42 | → | gaff joins (~gaff@49.207.205.255) |
| 06:55:34 | × | ec_ quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 260 seconds) |
| 06:59:20 | × | phma quits (~phma@host-67-44-208-145.hnremote.net) (Read error: Connection reset by peer) |
| 07:00:31 | → | phma joins (phma@2001:5b0:211c:1c38:cf4e:d6e:98f0:9ef7) |
| 07:08:13 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 07:15:19 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 07:16:06 | × | califax quits (~califax@user/califx) (Ping timeout: 260 seconds) |
| 07:18:28 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 268 seconds) |
| 07:19:54 | × | sefidel quits (~sefidel@user/sefidel) (Remote host closed the connection) |
| 07:20:45 | → | sefidel joins (~sefidel@user/sefidel) |
| 07:24:55 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 07:28:07 | → | califax joins (~califax@user/califx) |
| 07:29:38 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 07:36:54 | → | acidjnk_new joins (~acidjnk@p200300d6e714dc22c1009207f5f0377f.dip0.t-ipconnect.de) |
| 07:42:08 | → | yeitrafferin joins (~user@2a04:4540:7217:ac00:2df5:a77c:945d:95ef) |
| 07:55:15 | × | gaff quits (~gaff@49.207.205.255) () |
| 07:55:35 | → | notzmv joins (~daniel@user/notzmv) |
| 07:57:25 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 07:58:13 | → | jle` joins (~jle`@2603-8001-3b02-84d4-fc90-a9ba-a756-93bd.res6.spectrum.com) |
| 08:02:57 | → | bionade24 joins (~quassel@2a03:4000:33:45b::1) |
| 08:03:50 | × | econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
| 08:09:26 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 08:09:52 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 08:11:45 | × | TMA quits (tma@twin.jikos.cz) (Ping timeout: 256 seconds) |
| 08:16:54 | → | Unhammer joins (~Unhammer@user/unhammer) |
| 08:19:22 | → | _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
| 08:20:28 | <Unhammer> | anyone know if there's a simple trick to get ghci to show Text stuff with unicode characters like ö instead of \246? |
| 08:21:02 | <Unhammer> | like if my SongClassifier.hs has metal = "döh" :: Text |
| 08:21:12 | <Unhammer> | λ> metal |
| 08:21:14 | <Unhammer> | "d\246h" |
| 08:22:42 | <mauke> | T.putStrLn metal |
| 08:23:23 | <Unhammer> | heh well yeah |
| 08:23:37 | <Unhammer> | but it's often inside deeper structures |
| 08:24:32 | <mauke> | https://hackage.haskell.org/package/unicode-show-0.1.1.1/docs/Text-Show-Unicode.html |
| 08:24:58 | <Unhammer> | oh nice! |
| 08:35:58 | <tomsmeding> | Unhammer: be aware that unicode-show is a bit of a hack; if replaces anyhing that looks like a (printable) character escape in the Show output with the original unicode character |
| 08:36:11 | <tomsmeding> | regardless of whether it was in a string or not, originally |
| 08:36:16 | <Unhammer> | :O |
| 08:36:19 | <Unhammer> | ok |
| 08:36:22 | <tomsmeding> | may be suitable for debugging, though :) |
| 08:36:39 | <tomsmeding> | (Show output is generally only suitable for debugging anyway) |
| 08:40:13 | <Unhammer> | yeah, but nice to know about the limitations still |
| 08:48:58 | → | sawilagar joins (~sawilagar@user/sawilagar) |
| 08:51:11 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 08:53:15 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 255 seconds) |
| 08:54:55 | → | Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) |
| 08:55:05 | × | tzh quits (~tzh@c-73-164-206-160.hsd1.or.comcast.net) (Quit: zzz) |
| 08:57:45 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 09:20:45 | anon1123 | is now known as anon8697 |
| 09:25:12 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 09:26:49 | × | tomsmeding quits (~tomsmedin@2a01:4f8:c0c:5e5e::2) (Quit: ZNC 1.9.0 - https://znc.in) |
| 09:27:09 | × | gabiruh quits (~gabiruh@191.252.222.55) (Quit: ZNC 1.7.5 - https://znc.in) |
| 09:27:11 | → | tomsmeding joins (~tomsmedin@2a01:4f8:c0c:5e5e::2) |
| 09:27:47 | × | tomsmeding quits (~tomsmedin@2a01:4f8:c0c:5e5e::2) (Remote host closed the connection) |
| 09:28:14 | → | tomsmeding joins (~tomsmedin@static.21.109.88.23.clients.your-server.de) |
| 09:29:51 | × | ircbrowse_tom quits (~ircbrowse@2a01:4f8:1c1c:9319::1) (ZNC 1.8.2+deb2build5 - https://znc.in) |
| 09:30:08 | → | ircbrowse_tom joins (~ircbrowse@2a01:4f8:1c1c:9319::1) |
| 09:30:16 | Server | sets mode +Cnt |
| 09:30:24 | Server | sets mode +Cnt |
| 09:37:50 | × | hovsater quits (sid499516@id-499516.lymington.irccloud.com) (Changing host) |
| 09:37:50 | → | hovsater joins (sid499516@user/kevinsjoberg) |
| 09:41:37 | → | gabiruh joins (~gabiruh@vps19177.publiccloud.com.br) |
| 09:44:42 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 256 seconds) |
| 09:49:58 | × | hovsater quits (sid499516@user/kevinsjoberg) (Changing host) |
| 09:49:58 | → | hovsater joins (sid499516@user/hovsater) |
| 09:53:13 | × | hovsater quits (sid499516@user/hovsater) (Quit: Updating details, brb) |
| 09:53:26 | → | hovsater joins (sid499516@user/hovsater) |
| 09:55:43 | → | lisbeths joins (uid135845@id-135845.lymington.irccloud.com) |
| 09:56:33 | × | hovsater quits (sid499516@user/hovsater) (Client Quit) |
| 09:56:46 | → | hovsater joins (sid499516@user/hovsater) |
| 09:59:20 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
| 10:09:49 | × | iphy quits (sid67735@id-67735.lymington.irccloud.com) (Changing host) |
| 10:09:49 | → | iphy joins (sid67735@user/iphy) |
| 10:12:33 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 10:14:19 | → | TMA joins (tma@twin.jikos.cz) |
| 10:26:51 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 10:26:51 | × | vnogueira quits (~vnogueira@user/vnogueira) (Remote host closed the connection) |
| 10:26:51 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Read error: Connection reset by peer) |
| 10:26:51 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 10:26:52 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 10:27:12 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 10:27:14 | → | vnogueira joins (~vnogueira@user/vnogueira) |
| 10:27:25 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 10:27:45 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 10:28:00 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 10:29:20 | → | waleee joins (~waleee@h-176-10-144-38.NA.cust.bahnhof.se) |
| 10:33:09 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 255 seconds) |
| 10:33:10 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 10:33:10 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 10:33:41 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 10:34:02 | → | Nixkernal joins (~Nixkernal@240.17.194.178.dynamic.wline.res.cust.swisscom.ch) |
| 10:34:08 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 10:34:11 | → | Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915) |
| 10:36:08 | × | emmanuelux quits (~emmanuelu@user/emmanuelux) (Read error: Connection reset by peer) |
| 10:36:56 | → | emmanuelux joins (~emmanuelu@user/emmanuelux) |
| 10:53:56 | → | random-jellyfish joins (~developer@2a02:2f04:11e:c600:7d1b:5f1a:4e91:ac) |
| 10:53:56 | × | random-jellyfish quits (~developer@2a02:2f04:11e:c600:7d1b:5f1a:4e91:ac) (Changing host) |
| 10:53:56 | → | random-jellyfish joins (~developer@user/random-jellyfish) |
| 11:00:57 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 11:01:20 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 11:03:01 | × | random-jellyfish quits (~developer@user/random-jellyfish) (Ping timeout: 256 seconds) |
| 11:05:43 | × | polyphem quits (~rod@p200300ef273784005840865d4515fb32.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 11:22:57 | × | euleritian quits (~euleritia@dynamic-176-006-191-173.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 11:23:20 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 11:23:40 | × | biberu quits (~biberu@user/biberu) (Quit: ZNC - https://znc.in) |
| 11:24:02 | → | biberu joins (~biberu@user/biberu) |
| 11:27:27 | × | ftweedal quits (~ftweedal@211.30.152.176) (Read error: Connection reset by peer) |
| 11:31:47 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 11:32:44 | × | sadie_ quits (~sadie@c-76-155-235-153.hsd1.co.comcast.net) (Remote host closed the connection) |
| 11:41:28 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 11:41:38 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 260 seconds) |
| 11:51:42 | × | sroso quits (~sroso@user/SrOso) (Quit: Leaving :)) |
| 12:16:21 | × | todi quits (~todi@p57803331.dip0.t-ipconnect.de) (Remote host closed the connection) |
| 12:18:48 | → | todi joins (~todi@p57803331.dip0.t-ipconnect.de) |
| 12:23:44 | × | Nixkernal quits (~Nixkernal@240.17.194.178.dynamic.wline.res.cust.swisscom.ch) (Ping timeout: 260 seconds) |
| 12:28:55 | → | Nixkernal joins (~Nixkernal@240.17.194.178.dynamic.wline.res.cust.swisscom.ch) |
| 12:37:18 | → | harveypwca joins (~harveypwc@2601:246:d080:b40:1889:d9bf:2dd8:b288) |
| 12:39:09 | × | acidjnk_new quits (~acidjnk@p200300d6e714dc22c1009207f5f0377f.dip0.t-ipconnect.de) (Ping timeout: 255 seconds) |
| 13:01:41 | → | kupi joins (uid212005@id-212005.hampstead.irccloud.com) |
| 13:10:17 | × | causal quits (~eric@50.35.88.207) (Quit: WeeChat 4.1.1) |
| 13:10:34 | → | nilradical joins (~nilradica@202.115.218.139.sta.wbroadband.net.au) |
| 13:10:34 | × | nilradical quits (~nilradica@202.115.218.139.sta.wbroadband.net.au) (Changing host) |
| 13:10:34 | → | nilradical joins (~nilradica@user/naso) |
| 13:14:27 | → | random-jellyfish joins (~developer@user/random-jellyfish) |
| 13:18:39 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 13:20:40 | × | qqq quits (~qqq@92.43.167.61) (Remote host closed the connection) |
| 13:27:44 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 13:28:31 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 13:28:59 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 13:29:01 | → | califax joins (~califax@user/califx) |
| 13:32:21 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 13:32:26 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds) |
| 13:32:43 | → | califax joins (~califax@user/califx) |
| 13:33:30 | → | euleritian joins (~euleritia@dynamic-176-006-191-173.176.6.pool.telefonica.de) |
| 13:34:47 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 13:40:16 | × | enyc quits (~enyc@user/enyc) (Ping timeout: 260 seconds) |
| 13:46:12 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 13:47:54 | × | todi quits (~todi@p57803331.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in) |
| 13:48:38 | → | mei joins (~mei@user/mei) |
| 13:50:56 | → | target_i joins (~target_i@user/target-i/x-6023099) |
| 13:54:41 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 13:57:50 | → | Inst_ joins (~Inst@user/Inst) |
| 14:00:35 | × | Inst quits (~Inst@user/Inst) (Ping timeout: 264 seconds) |
| 14:00:49 | × | euleritian quits (~euleritia@dynamic-176-006-191-173.176.6.pool.telefonica.de) (Ping timeout: 272 seconds) |
| 14:01:48 | → | euleritian joins (~euleritia@dynamic-176-006-196-063.176.6.pool.telefonica.de) |
| 14:11:55 | × | nilradical quits (~nilradica@user/naso) (Remote host closed the connection) |
| 14:20:59 | → | retset joins (~retset@mobile-access-2e8440-111.dhcp.inet.fi) |
| 14:23:27 | × | Square2 quits (~Square@user/square) (Ping timeout: 260 seconds) |
| 14:35:16 | ← | retset parts (~retset@mobile-access-2e8440-111.dhcp.inet.fi) () |
| 14:37:34 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 14:37:40 | → | ec_ joins (~ec@gateway/tor-sasl/ec) |
| 14:39:11 | × | harveypwca quits (~harveypwc@2601:246:d080:b40:1889:d9bf:2dd8:b288) (Quit: Leaving) |
| 14:49:26 | × | random-jellyfish quits (~developer@user/random-jellyfish) (Ping timeout: 252 seconds) |
| 14:49:51 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 14:51:23 | → | machinedgod joins (~machinedg@d173-183-246-216.abhsia.telus.net) |
| 15:00:43 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 15:05:04 | × | lisbeths quits (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 15:12:57 | → | zetef joins (~quassel@5.2.182.99) |
| 15:19:06 | → | acidjnk_new joins (~acidjnk@p200300d6e714dc22c1009207f5f0377f.dip0.t-ipconnect.de) |
| 15:21:25 | × | kupi quits (uid212005@id-212005.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
| 15:32:10 | → | n8n joins (~n8n@user/n8n) |
| 15:40:26 | → | tzh joins (~tzh@c-73-164-206-160.hsd1.or.comcast.net) |
| 15:48:03 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 15:49:03 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 15:59:54 | → | econo_ joins (uid147250@id-147250.tinside.irccloud.com) |
| 16:05:23 | → | __monty__ joins (~toonn@user/toonn) |
| 16:12:17 | × | zetef quits (~quassel@5.2.182.99) (Ping timeout: 256 seconds) |
| 16:14:17 | × | euleritian quits (~euleritia@dynamic-176-006-196-063.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 16:14:36 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 16:26:48 | → | billchenchina- joins (~billchenc@103.152.35.21) |
| 16:35:40 | → | qqq joins (~qqq@92.43.167.61) |
| 16:35:54 | × | qqq quits (~qqq@92.43.167.61) (Client Quit) |
| 16:36:38 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 16:37:18 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 16:37:46 | → | mei joins (~mei@user/mei) |
| 16:45:10 | → | qqq joins (~qqq@92.43.167.61) |
| 16:50:40 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 260 seconds) |
| 16:51:33 | → | euleritian joins (~euleritia@dynamic-176-006-196-063.176.6.pool.telefonica.de) |
| 16:58:42 | × | Eoco quits (~ian@128.101.131.218) (Ping timeout: 252 seconds) |
| 17:01:53 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 17:03:59 | × | euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.) |
| 17:12:30 | → | euphores joins (~SASL_euph@user/euphores) |
| 17:13:28 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 17:16:20 | × | euleritian quits (~euleritia@dynamic-176-006-196-063.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 17:16:39 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 17:28:37 | × | bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection) |
| 17:30:51 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:31:48 | → | Eoco joins (~ian@128.101.131.218) |
| 17:37:51 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 17:41:09 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:03:55 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 18:05:46 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 18:09:36 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 18:10:05 | × | peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 240 seconds) |
| 18:19:04 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 18:24:17 | → | zetef joins (~quassel@5.2.182.99) |
| 18:25:31 | × | TonyStone quits (~TonyStone@074-076-057-186.res.spectrum.com) (Changing host) |
| 18:25:31 | → | TonyStone joins (~TonyStone@user/TonyStone) |
| 18:26:14 | → | philopsos joins (~caecilius@user/philopsos) |
| 18:36:05 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:43:55 | × | cawfee quits (~root@2406:3003:2077:1c50::babe) (Ping timeout: 272 seconds) |
| 18:49:17 | <tri> | hi, im trying to reimplement Applicative for State monad and saw that i have 2 versions https://paste.tomsmeding.com/sbgB3yWG |
| 18:49:42 | <tri> | they are both typechecked. Are they both valid implementation? |
| 18:51:02 | <geekosaur> | (I think you have a typo on line 17, compare what it does to what the comment says) |
| 18:51:18 | <geekosaur> | I think the first one violates the Applicative laws? |
| 18:52:18 | <geekosaur> | Haskell's type system isn't in general strong enough to validate laws, which is why they're laws rather than code |
| 18:52:27 | <geekosaur> | or types |
| 18:52:43 | <ncf> | yep that's unlawful |
| 18:53:23 | <ncf> | hint: identity law |
| 18:53:55 | <Inst_> | wait, do we have controlled imports / exports of typeclasses? |
| 18:53:57 | Inst_ | is now known as Inst |
| 18:54:09 | <Inst> | I know we don't of instances (orphan instances problem, unless that's been fixed) |
| 18:54:41 | × | billchenchina- quits (~billchenc@103.152.35.21) (Remote host closed the connection) |
| 18:55:52 | <tri> | geekosaur: yea i meant to write secondState on line 17 |
| 18:56:32 | <tri> | it's true. I thought about using the applicative law to check it, but it's been a long time and doing so will take some time, so i decided to ask here |
| 18:57:12 | <EvanR> | I'm surprised you didn't first ask chat-gpt! |
| 18:58:01 | <tri> | many of haskell stuff is not really understood by gpt |
| 18:58:03 | <tomsmeding> | @hackage checkers |
| 18:58:03 | <lambdabot> | https://hackage.haskell.org/package/checkers |
| 18:58:05 | <tomsmeding> | https://hackage.haskell.org/package/checkers-0.6.0/docs/Test-QuickCheck-Classes.html#v:applicative |
| 18:58:34 | → | maxs joins (~maxs@94.45.154.15) |
| 18:58:35 | <ski> | Inst : yes |
| 19:00:15 | <ski> | tri : `b = ab a' is dead code |
| 19:00:18 | <Inst> | okay, so it's just unnecessary / ugly to throw all your code into typeclasses, right? |
| 19:00:38 | <tri> | thank you ski |
| 19:00:56 | <ski> | both implementations are incorrect |
| 19:01:16 | <geekosaur> | Inst, ugly, slow, and may not work if you're misusing them |
| 19:01:28 | × | maxs quits (~maxs@94.45.154.15) (Client Quit) |
| 19:01:34 | <Inst> | I don't use typeclasses enough |
| 19:01:46 | <Inst> | and I realized I kept on getting tripped up by typeclass-based interfaces to libraries |
| 19:02:04 | <geekosaur> | in particular, if you try to treat typeclasses as if they were OOP classes, things won't typecheck |
| 19:02:26 | <tomsmeding> | sounds like a problem that is solved by working with such libraries more often :) |
| 19:02:50 | <ski> | generally, don't use a type class, unless (a) you already have two different instances you want to have; and (b) you want to define operations that are polymorphic constrained in the type class |
| 19:03:29 | <Inst> | tomsmeding: it took me 8 hours to figure out how to use cassava without generics :( |
| 19:03:55 | tomsmeding | has never used cassava |
| 19:04:49 | <monochrom> | I learned and use cassava without generics. The "toy" example that no one else reads helped. |
| 19:04:54 | <Inst> | and it took me like 2 years before I figured out aeson's treemap interface was accessed via its typeclass |
| 19:05:21 | <geekosaur> | Inst, the orphan instances problem is not something that can be fixed, it is a consequence of typeclass instances being global, which is required by the type system |
| 19:05:27 | <tomsmeding> | (aeson treemap?) |
| 19:05:44 | <EvanR> | so you want to load a CSV file, let me first introduce you to generics |
| 19:06:20 | <geekosaur> | (people often think they want local instances, what they really want is ML's functors (parameterized modules) and `open`) |
| 19:06:23 | <Inst> | aeson has an object type that's a map over a sum type of JSON types |
| 19:06:45 | <tomsmeding> | Inst: https://hackage.haskell.org/package/aeson-2.2.1.0/docs/Data-Aeson-KeyMap.html#t:KeyMap ? |
| 19:07:11 | <tomsmeding> | the functions in that module seem to me enough to work with the thing |
| 19:07:15 | ski | wants local `data' types, and local instances for them |
| 19:07:23 | <Inst> | yes |
| 19:07:28 | <tomsmeding> | gimme gimme `data` inside `where` |
| 19:07:41 | <monochrom> | Consider "data families" >:) |
| 19:07:43 | <tomsmeding> | haskell makes little helper data types easy, make them even easier |
| 19:07:47 | <ski> | (and, obviously, they ought to be able to reference nonlocal tyvars) |
| 19:10:47 | <ski> | (.. so, the local instance also ought to be able to depend on run-time data) |
| 19:11:25 | <monochrom> | You can only access Int operations via type classes too. That has never posed a problem. |
| 19:11:50 | <tomsmeding> | it's not even true for aeson's KeyMap, it has fromList, lookup, etc. as regular top-level functions |
| 19:13:10 | gehmehgeh | is now known as gmg |
| 19:13:13 | <tomsmeding> | ski: how about a function that passes a local data type down into a recursive call, but the instance on that data type depends on the function argument |
| 19:13:17 | <tomsmeding> | doesn't that result in incoherence |
| 19:14:03 | <ski> | "passes a local data type down into a recursive call" means ? |
| 19:14:21 | → | cawfee joins (~root@2406:3003:2077:1c50::babe) |
| 19:14:36 | <ski> | you mean polymorphic recursion or something ? |
| 19:15:54 | <ski> | foo :: forall a. Eq a => Blah -> ... |
| 19:16:22 | <ski> | foo blah = ..(foo @Helper (...) ...).. |
| 19:16:22 | <ski> | where |
| 19:16:23 | × | yahb2 quits (~yahb2@static.56.27.47.78.clients.your-server.de) (Remote host closed the connection) |
| 19:16:33 | <ski> | data Helper = ..a.. |
| 19:16:38 | <ski> | instance Eq Helper |
| 19:16:41 | <ski> | where |
| 19:16:51 | <ski> | ... == ... = ... |
| 19:16:54 | <ski> | something like that ? |
| 19:17:25 | <Inst> | iirc you just want Idris's data anywhere, right? |
| 19:18:11 | → | yahb2 joins (~yahb2@user/tomsmeding/bot/yahb2) |
| 19:18:11 | ChanServ | sets mode +v yahb2 |
| 19:19:11 | <ski> | (well, with the body of the definition of `(==)' depending on `blah') |
| 19:19:48 | <ski> | anyway .. not really seeing how this would yield incoherence |
| 19:20:00 | <tomsmeding> | yeah not quite, let me think |
| 19:20:57 | × | chiselfuse quits (~chiselfus@user/chiselfuse) (Remote host closed the connection) |
| 19:21:02 | <tomsmeding> | hm fun, my idea breaks because stuff in `where` ought (?) not to be in scope in the type signature |
| 19:21:45 | <ski> | yea, just like existentials |
| 19:22:04 | → | chiselfuse joins (~chiselfus@user/chiselfuse) |
| 19:22:17 | <tomsmeding> | i want dis |
| 19:23:10 | <ski> | the two things that this gives is (a) not needing to parameterize the data type by nonlocal tyvars; and (b) instances being able to depend on run-time input |
| 19:23:24 | <tomsmeding> | and scoping |
| 19:23:26 | <ski> | (a) is more a convenience thing. (b) is an expressiveness thing |
| 19:23:56 | <tomsmeding> | scoping is definitely a convenience thing, because you can "just" list all the other things in the module in an export list |
| 19:24:16 | <tomsmeding> | but if the data type is local to one function it ought to be _local_ to the function, for cleanliness' sake |
| 19:24:18 | <ski> | oh, and presumably the instance has to be given together with the `data' (or `newtype') declaration .. maybe that could be relaxed a little bit, dunno |
| 19:24:31 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 19:25:29 | <ski> | yea, i guess (a) gives you a reasonability thing in that you're assured that other code can't depend on the type |
| 19:25:31 | <tomsmeding> | (tangentially, I feel like I would prefer e.g. rust's way of doing public/private: instead of an export list, put some keyword (`pub` for Rust) before every public declaration) |
| 19:25:41 | → | califax joins (~califax@user/califx) |
| 19:25:59 | ski | incidentally also wants SML's `local'-`in'-`end', in Haskell |
| 19:26:12 | <tomsmeding> | gets more noisy in modules where you want to export everything, but in larger codebases that's rare anyway |
| 19:26:32 | <tomsmeding> | ski: what does that do? |
| 19:26:47 | × | sawilagar quits (~sawilagar@user/sawilagar) (Ping timeout: 260 seconds) |
| 19:26:56 | <tomsmeding> | guessing: local declarations in a set of declarations that get merged into the parent scope? |
| 19:26:56 | <geekosaur> | it's `let` at top level iirc? |
| 19:27:02 | <tomsmeding> | right |
| 19:27:07 | <ski> | makes some declarations local to some other declarations. as opposed to `let'-`in', which makes some declarations local to an *expression* |
| 19:27:12 | <ski> | yes |
| 19:27:22 | <tomsmeding> | that's essentially a weaker version of the local data types idea |
| 19:27:29 | <tomsmeding> | (but also a bit more general because it's not just data types) |
| 19:27:32 | <ski> | (i also want `if'-`then'-`else', and `case'-`of', at the declaration level) |
| 19:27:35 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 19:27:53 | → | califax joins (~califax@user/califx) |
| 19:27:54 | <ski> | tomsmeding : yea, but it's also useful for normal value declarations |
| 19:28:14 | <tomsmeding> | yeah I can see that |
| 19:28:18 | <ski> | instead of going |
| 19:28:26 | <ski> | (foo,bar) = (theFoo,theBar) |
| 19:28:28 | <ski> | where |
| 19:28:31 | <tomsmeding> | the top-level conditionals would be on compile-time constants, right? |
| 19:28:32 | <ski> | theFoo .. = ... |
| 19:28:37 | <ski> | theBar .. = ... |
| 19:28:42 | <ski> | ..other stuff.. |
| 19:28:43 | <tomsmeding> | yeah that's very awkward |
| 19:29:02 | <ski> | "compile-time constants, right?" -- yes |
| 19:29:15 | <tomsmeding> | would that mean that haddock gets to execute code to figure out what the top-level decls are? |
| 19:29:17 | <ski> | or, with functors, can depend on the functor parameter |
| 19:29:50 | → | michalz joins (~michalz@185.246.207.221) |
| 19:29:59 | <ski> | all branches define the same identifiers |
| 19:30:09 | <tomsmeding> | ew |
| 19:30:12 | <ski> | (this is not conditional compilation for exposing different interfaces) |
| 19:30:43 | <tomsmeding> | I mean, that requirement restores sanity, but it's also an awkward requirement |
| 19:31:15 | <ski> | why awkward ? |
| 19:31:44 | <ski> | oh, also there should be `if'-`then'-`else', and `case'-`of', commands in `do' |
| 19:31:55 | <tomsmeding> | if you're writing a function that has to return 4 values (in a tuple, say), you have freedom in how you assemble those values before you return them |
| 19:32:27 | <tomsmeding> | here with the declarations, you are limited to structured case trees |
| 19:32:39 | <ski> | i don't follow |
| 19:32:58 | <tomsmeding> | 1sec, people want my attention |
| 19:33:09 | <ski> | np |
| 19:38:52 | × | byorgey quits (~byorgey@155.138.238.211) (Changing host) |
| 19:38:52 | → | byorgey joins (~byorgey@user/byorgey) |
| 19:40:42 | <tomsmeding> | ski: I guess it's not as bad as I thought; I feel like it's comparable to the hypothetical where if you write a function returning a tuple, at every "return point" you have to write out the whole tuple, you can't pass on a tuple you got from somewhere else |
| 19:41:24 | <tomsmeding> | because (assuming 4 declarations for sake of argument) you have to explicitly write 4 lines, f = ..., g = ..., h = ..., j = ..., in each branch of your case tree |
| 19:42:22 | <tomsmeding> | you can't, say, choose to return ((a,b),c,d) instead of (a,b,c,d) and first produce the (a,b) tuple somehow, and then plug that wholesale in the return tuple |
| 19:42:43 | × | qqq quits (~qqq@92.43.167.61) (Ping timeout: 246 seconds) |
| 19:42:45 | <tomsmeding> | because it must be (a,b,c,d), so you have to unpack the (a,b) tuple into a and b, and re-pack them as (a,b,c,d) |
| 19:43:05 | <tomsmeding> | maybe you have the exact same problem with tuples in the first place |
| 19:43:10 | <tomsmeding> | so maybe ignore what I'm saying |
| 19:43:12 | <tomsmeding> | :D |
| 19:43:46 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:46:01 | <ski> | "you can't pass on a tuple you got from somewhere else" -- huh ? |
| 19:47:22 | <tomsmeding> | if you defined f', g', h' and j' in some `local` block already, say, you have to write 4 separate lines (f = f'; ...; j = j') to "return" those definitions |
| 19:48:06 | <tomsmeding> | you could write fghj = (_, _, _, _) in the `local` block and then you can pass down the tuple wholesale in a single line, but in the end you still have to write out the 4 lines |
| 19:48:41 | <tomsmeding> | but I'm having difficulty finding a point where this is meaningfully different from how tuples operate in the expression language already |
| 19:49:04 | <tomsmeding> | so maybe I should stop trying |
| 19:49:33 | <ski> | "if you defined f', g', h' and j' in some `local` block already" -- why would you not just directly define `f',`g',`h',`j' in the body, instead ? |
| 19:50:00 | <ski> | i'm not really envisaging the use case / situation you have in mind |
| 19:50:04 | <tomsmeding> | because you might decide with an if-then-else whether to define them in terms of f', g', h', j' |
| 19:50:15 | <tomsmeding> | yeah no I should write out a proper example |
| 19:51:12 | <tomsmeding> | but I'm not going to do that now, I'm just going to take my difficulty in formulating one in the first place as evidence that you're right and there is no problem : |
| 19:51:15 | <tomsmeding> | * :p |
| 19:51:28 | → | polyphem joins (~rod@p200300ef2737840025b5ae4e52515c0b.dip0.t-ipconnect.de) |
| 19:52:08 | <ski> | hm .. i guess one might have `DeclarationPuns' |
| 19:52:24 | <tomsmeding> | something like that, yes |
| 19:54:34 | → | qqq joins (~qqq@92.43.167.61) |
| 19:56:01 | <ski> | (i didn't really follow the tuple stuff, either. of course you can pass on a tuple you got from somewhere else. maybe you meant that you can't do the corresponding thing with declarations, but what would "getting declarations from somewhere else" even mean ? note that we can't really have recursive computations yielding declarations here (unless, i guess, if we have recursive module functors). but perhaps |
| 19:56:07 | <ski> | you were thinking of not getting all the identifiers defined in the same place, depending on which branch was taken) |
| 19:59:13 | → | Square2 joins (~Square@user/square) |
| 20:02:36 | <tomsmeding> | ski: would I be able to do something like this? https://paste.tomsmeding.com/Pwd1QyAM |
| 20:03:22 | <tomsmeding> | and also this https://paste.tomsmeding.com/tIIHWhQB |
| 20:04:47 | <tomsmeding> | this is all that is left of my argument I think |
| 20:05:22 | <ski> | sure, that's the point |
| 20:05:39 | <tomsmeding> | right |
| 20:05:42 | <tomsmeding> | ok :) |
| 20:05:53 | × | yeitrafferin quits (~user@2a04:4540:7217:ac00:2df5:a77c:945d:95ef) (Quit: Leaving) |
| 20:06:00 | <ski> | especially the `if c3 then (h,j) = ... else h = ...; j = ...' part |
| 20:06:27 | <ski> | (the other `if'-`then'-`else's are just on expressions, not on declarations) |
| 20:06:42 | <tomsmeding> | fair :D |
| 20:06:49 | <tomsmeding> | I almost never use pattern bindings |
| 20:06:52 | <ski> | you can already do |
| 20:06:55 | <ski> | (h,j) |
| 20:06:57 | <tomsmeding> | except for small local stuff |
| 20:07:06 | <ski> | | ... = (...,...) |
| 20:07:12 | <ski> | | otherwise = (...,...) |
| 20:07:29 | <ski> | but that can become annoying |
| 20:07:40 | <tomsmeding> | I don't think I ever do that |
| 20:07:51 | ski | has, at times |
| 20:12:17 | → | vgtw_ joins (~vgtw@user/vgtw) |
| 20:12:35 | × | vgtw quits (~vgtw@user/vgtw) (Ping timeout: 264 seconds) |
| 20:16:42 | × | Square2 quits (~Square@user/square) (Ping timeout: 268 seconds) |
| 20:20:10 | → | noumenon joins (~noumenon@113.51-175-156.customer.lyse.net) |
| 20:21:03 | × | zetef quits (~quassel@5.2.182.99) (Ping timeout: 256 seconds) |
| 20:23:08 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 20:24:25 | → | zetef joins (~quassel@5.2.182.98) |
| 20:28:17 | → | sadie-sorceress joins (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) |
| 20:29:57 | → | sawilagar joins (~sawilagar@user/sawilagar) |
| 20:31:19 | <tomsmeding> | if I have this: return' = return . return; (<$$>) = fmap . fmap; (<**>) = liftA2 (<*>) |
| 20:31:22 | <tomsmeding> | am I looking for Compose |
| 20:33:00 | <ncf> | yes |
| 20:33:07 | <tomsmeding> | right |
| 20:33:28 | <tomsmeding> | why is `Compose (State s) (w,) a` not valid :( |
| 20:33:45 | <ncf> | i prefer <<$>> and <<*>> for those though |
| 20:34:00 | <tomsmeding> | yeah those are better names |
| 20:34:04 | <tomsmeding> | I want type-level TupleSections |
| 20:35:37 | <tomsmeding> | ah `(,) w` of course |
| 20:35:51 | <tomsmeding> | :t Compose (Identity ("hi", True)) |
| 20:35:52 | <lambdabot> | error: |
| 20:35:52 | <lambdabot> | • Data constructor not in scope: |
| 20:35:53 | <lambdabot> | Compose :: Identity ([Char], Bool) -> t |
| 20:36:08 | <tomsmeding> | :t Compose (Identity ("hi", True)) |
| 20:36:09 | <lambdabot> | Compose Identity ((,) [Char]) Bool |
| 20:37:22 | <ski> | @type (<**>) -- not that i like this name |
| 20:37:23 | <lambdabot> | Applicative f => f a -> f (a -> b) -> f b |
| 20:37:37 | <tomsmeding> | ncf already complained :) |
| 20:38:16 | <ski> | (i'd prefer `<*>' to be named `<$>', and `<$>' to be named `$>') |
| 20:38:48 | <tomsmeding> | hm maybe yes |
| 20:39:18 | <ncf> | and ($>) to be named...? |
| 20:39:26 | <tomsmeding> | :t ($>) |
| 20:39:27 | <lambdabot> | error: |
| 20:39:27 | <lambdabot> | • Variable not in scope: $> |
| 20:39:27 | <lambdabot> | • Perhaps you meant one of these: |
| 20:39:37 | <ski> | itym `<$' ? |
| 20:39:38 | <tomsmeding> | :t Data.Functor.($>) |
| 20:39:39 | <lambdabot> | error: |
| 20:39:39 | <lambdabot> | Not in scope: data constructor ‘Data.Functor’ |
| 20:39:39 | <lambdabot> | No module named ‘Data’ is imported. |
| 20:39:44 | × | sadie-sorceress quits (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) (Ping timeout: 250 seconds) |
| 20:39:47 | <tomsmeding> | :t (Data.Functor.$>) |
| 20:39:48 | <lambdabot> | Functor f => f a -> b -> f b |
| 20:39:54 | <ncf> | well, flip (<$) |
| 20:40:22 | <ski> | that one could be named `$.>' or something |
| 20:40:48 | <tomsmeding> | $= |
| 20:41:00 | <ski> | (oh, and `(<*>) = liftA2 (,)') |
| 20:42:34 | × | _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht) |
| 20:43:37 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Remote host closed the connection) |
| 20:44:03 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 20:58:56 | <Inst> | btw |
| 20:59:05 | <Inst> | if i write a randomized quicksort in ST for Vector |
| 20:59:33 | <Inst> | am I going to get unwanted caching due to unsafePerformIO use? |
| 21:00:54 | × | gdd quits (~gdd@2001:bc8:38ee:100:c8c6:dfff:fe51:8c02) (Ping timeout: 255 seconds) |
| 21:02:11 | <tomsmeding> | where does the unsafePerformIO come in? |
| 21:02:20 | <tomsmeding> | the point of ST is that you don't need unsafePerformIO |
| 21:02:59 | <tomsmeding> | oh you mean for the random seed generation? |
| 21:04:03 | <tomsmeding> | a typical trick is this: https://paste.tomsmeding.com/3ZGP2azB |
| 21:04:09 | <tri> | does anyone use haskell with neovim here? i used haskell with vscode before and the there was code action to fix the code according to the suggestion from the lsp. But in neovim, the only code action i've seen so far is the ability to turn off the suggestion |
| 21:04:21 | <tri> | so it seems like the lsp in neovim is worse than in vscode |
| 21:04:28 | <tri> | unless there is something i dont know |
| 21:04:36 | <tomsmeding> | Inst: the point being to make the computation depend on some important value x in your computation so that unsafeRandomSeed must be recomputed every time |
| 21:04:59 | <tomsmeding> | tri: are you using the built-in lspconfig stuff? |
| 21:05:11 | <tomsmeding> | er, the built-in LSP support with lspconfig |
| 21:05:28 | <tri> | hmm im using mason, if that's what you are asking. Sorry im new to neovim |
| 21:05:38 | <tomsmeding> | how did that action show up in vscode? Was it a "lightbulb" icon? |
| 21:05:43 | → | saftl joins (~user@p200300f9173af1001d6b7e3ec038aab9.dip0.t-ipconnect.de) |
| 21:05:48 | <tri> | yea something like that iirc |
| 21:06:05 | <tomsmeding> | tri: with mason-lspconfig.nvim? |
| 21:06:48 | <tomsmeding> | if yes, then you're indeed using the built-in LSP support |
| 21:06:59 | <tri> | let me check |
| 21:06:59 | <tomsmeding> | (as opposed to an independent LSP client implementation such as coc or ALE) |
| 21:07:34 | <tomsmeding> | the built-in nvim lsp client support doesn't support code lenses, nor custom commands, so if the thing was actually a code lens or a custom command, then it will not show up in nvim |
| 21:08:06 | <tri> | yea i see mason-lspconfig.nvim in my config ifle |
| 21:08:08 | <tri> | file* |
| 21:08:10 | <tomsmeding> | code actions do, with <cmd>vim.lsp.buf.code_action() (bound to <space>ca in the suggested bindings) |
| 21:08:53 | <tri> | tomsmeding: i action use that code action that you mention |
| 21:09:05 | <tri> | vim.lsp.buf.code_action() |
| 21:09:24 | <tomsmeding> | was this about hlint suggestions? |
| 21:09:27 | <tri> | and the most it did was the ability to turn off some suggestion |
| 21:09:38 | <tri> | idk what is hlint suggestion |
| 21:09:51 | <tomsmeding> | the things that ghc does not produce :p |
| 21:09:59 | <tomsmeding> | useless stuff like "this could be a newtype" |
| 21:10:24 | × | Luj quits (~Luj@2a01:e0a:5f9:9681:ae04:a455:8cc3:9377) (Ping timeout: 256 seconds) |
| 21:10:29 | <tri> | you mean the code analysis shown up in my editor? |
| 21:10:34 | <tomsmeding> | or "rewrite `do x <- <...> ; return (... x ...)` to `(\x -> ...) <$> <...>` |
| 21:10:38 | <tomsmeding> | screenshot? :p |
| 21:12:42 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 21:13:18 | <tri> | where do i paste the screenshot to? |
| 21:13:48 | <tomsmeding> | curl --data-binary @file.png https://tomsmeding.com/gooi/screenshot.png |
| 21:13:50 | × | hololeap quits (~quassel@user/hololeap) (Quit: Bye) |
| 21:14:52 | → | hololeap joins (~quassel@user/hololeap) |
| 21:17:03 | <tri> | https://tomsmeding.com/vang/tiJrtP/hiworld.png |
| 21:17:10 | <tri> | hmm it cannot view |
| 21:17:15 | <tri> | it doesn't show |
| 21:17:34 | <tomsmeding> | you forgot the @ |
| 21:17:44 | <tri> | https://tomsmeding.com/vang/Ew7SwZ/hiworld.png |
| 21:17:49 | <tri> | wow that's cool tool |
| 21:18:20 | <tomsmeding> | typing '1' doesn't work? |
| 21:18:27 | <tri> | it does |
| 21:18:45 | <tri> | what im asking is, the most ive seen it works is only turning off hint or apply hint |
| 21:18:59 | <tri> | whereas in vscode it could suggest to change my code |
| 21:18:59 | <tomsmeding> | the red diagnostics are errors from GHC, the yellow ones are warnings from GHC, and the bluegreenish ones (like these) are lints from hlint |
| 21:19:25 | <tomsmeding> | isn't "apply hint" precisely the same as "change code"? |
| 21:20:05 | tomsmeding | has hlint turned off due to not liking its suggestions |
| 21:21:12 | <tri> | ah no wait i think i get it |
| 21:21:23 | <tri> | thank you |
| 21:22:46 | <tomsmeding> | wait the nvim lsp client has support for code lenses??? |
| 21:23:01 | <tomsmeding> | it's just not listed as a suggested keybinding in the lspconfig readme? |
| 21:23:21 | <tri> | hmm no, idk how to describe it correctly but |
| 21:23:22 | <tomsmeding> | that's pretty huge underhanded support for a feature :p |
| 21:24:00 | <tri> | simply put, i assume it just have the ability to turn off a hint |
| 21:24:07 | <tri> | so that's on me being silly |
| 21:24:25 | <tomsmeding> | you expected a different wording, probably |
| 21:24:48 | <tri> | also, i run into this bug, and don't know how to fix it in neovim |
| 21:24:49 | <tri> | https://github.com/haskell/haskell-language-server/issues/3130 |
| 21:24:59 | <tri> | i left a comment at the bottom, can you check? |
| 21:25:15 | <tri> | i cannot rename stuff in haskell |
| 21:25:40 | <yushyin> | tomsmeding: :h lsp-codelens, i guess it does have support for it |
| 21:25:54 | <tomsmeding> | tri: can you paste in a pastebin how you've currently set up hls in your nvim config? |
| 21:26:07 | <tomsmeding> | yushyin: yes I just found out that `:lua vim.lsp.codelens.refresh()` does stuff |
| 21:26:15 | × | jle` quits (~jle`@2603-8001-3b02-84d4-fc90-a9ba-a756-93bd.res6.spectrum.com) (Quit: WeeChat 4.2.1) |
| 21:26:16 | <tri> | hmmmm i only install hls via mason. I don't have any other config |
| 21:26:29 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 240 seconds) |
| 21:26:32 | <tomsmeding> | yushyin: probably my bad for assuming that this is a good overview of the supported features: https://github.com/neovim/nvim-lspconfig?tab=readme-ov-file#suggested-configuration |
| 21:26:39 | → | jle` joins (~jle`@2603-8001-3b02-84d4-fc90-a9ba-a756-93bd.res6.spectrum.com) |
| 21:26:41 | <tomsmeding> | tri: how does that look? |
| 21:26:42 | → | sadie-sorceress joins (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) |
| 21:26:54 | <yushyin> | :D |
| 21:27:34 | × | jle` quits (~jle`@2603-8001-3b02-84d4-fc90-a9ba-a756-93bd.res6.spectrum.com) (Client Quit) |
| 21:27:38 | <tomsmeding> | tri: your question here, using (I think) the correct words, is "how do I set configuration for a language server registered via mason" |
| 21:27:49 | <tri> | yes |
| 21:27:51 | <tomsmeding> | i.e. this is a question about mason, not about nvim or hls |
| 21:27:57 | → | jle` joins (~jle`@2603-8001-3b02-84d4-fc90-a9ba-a756-93bd.res6.spectrum.com) |
| 21:28:14 | <tri> | yea let mee google that |
| 21:28:31 | <tri> | i didn't know the exact question i was looking for since im new to neovim and both haskell |
| 21:28:34 | <tomsmeding> | in general, language servers expect to be configured by the client (the editor), and it's up to the client to let you enter configuration somewhere |
| 21:28:51 | × | machinedgod quits (~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 268 seconds) |
| 21:28:52 | <tomsmeding> | I know how to do it with plain lspconfig, but you're using an additional package in between (mason) |
| 21:30:10 | × | Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Ping timeout: 255 seconds) |
| 21:30:11 | sadie-sorceress | is now known as sydney |
| 21:30:23 | sydney | is now known as madeleine-sydney |
| 21:30:33 | × | srk quits (~sorki@user/srk) (Read error: Connection reset by peer) |
| 21:31:09 | <tri> | hmm i will put this config off to another day, im kinda fried from both neovim and haskell now |
| 21:31:35 | × | madeleine-sydney quits (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) (Changing host) |
| 21:31:35 | → | madeleine-sydney joins (~sadie-sor@user/madeleine-sydney) |
| 21:31:37 | <tri> | in the mean time i will just use vim replace word function |
| 21:32:29 | <tomsmeding> | tri: do you have lines like require("lspconfig").hls.setup {} in your config? |
| 21:32:40 | <tomsmeding> | (the important part is the `setup {}`) |
| 21:33:19 | <tri> | a search of .hls doesn't give any result |
| 21:33:26 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 21:33:37 | <tomsmeding> | perhaps without the . ? |
| 21:33:47 | <tri> | no either |
| 21:33:50 | <tomsmeding> | how are you telling mason to load hls :p |
| 21:33:51 | → | srk joins (~sorki@user/srk) |
| 21:34:11 | <tri> | fwiw, i have require('mason-lspconfig').setup |
| 21:34:34 | tomsmeding | is looking at https://github.com/williamboman/mason-lspconfig.nvim?tab=readme-ov-file#setup |
| 21:35:19 | <tri> | I just have mason install hls and that's it |
| 21:35:26 | <tomsmeding> | HOW :p |
| 21:35:28 | <tri> | hls auto turned on when im in a haskell file |
| 21:35:30 | <tri> | ah |
| 21:35:32 | <tri> | using :Mason |
| 21:35:35 | <tomsmeding> | I've asked like 5x now :p |
| 21:35:37 | <tri> | sorry |
| 21:35:51 | <tri> | using :Mason then it shows the dialog to scroll over different lsp's |
| 21:35:56 | <tomsmeding> | I see |
| 21:35:57 | <tri> | then i picked hls |
| 21:38:27 | <tri> | btw tomsmeding |
| 21:38:57 | <tomsmeding> | I suspect you'll need to manually add hls as shown in that Setup section of the mason-lspconfig readme if you want to add settings |
| 21:39:03 | <tri> | so i've been reading all about functor, applicative, monad, reader, state up until monad transformer |
| 21:39:40 | <tomsmeding> | then it would look like: require("lspconfig").hls.setup { settings = { haskell = { plugin = { rename = ... } } } } |
| 21:39:43 | <tri> | does it make sense to know how to implement all functor, applicative, and monad instance of, say, the State monad? |
| 21:40:01 | <tri> | i only know how to use it intuitively |
| 21:40:18 | <tri> | i know how to use a reader |
| 21:40:19 | <tomsmeding> | I think working with multiple different monads, and implementing all the basic ones, is very useful for getting an understanding of them |
| 21:40:28 | <tomsmeding> | so yes, that's good practice |
| 21:40:30 | <tri> | but idk how to implement the applicative, monad, and functor instance of it |
| 21:40:50 | <tri> | hmm ok |
| 21:41:26 | <tri> | i quickly glanced over those sections, so i only know how to use them, not know how to implement these instance for a state or reader monad |
| 21:41:34 | <tri> | i'll have to go back then |
| 21:41:49 | <tomsmeding> | understanding how the basic monads (reader, writer, state, either, etc.) correspond with their newtypes, and how their instances work, will make it easier to make sense of monad transformer stacks |
| 21:42:16 | <tomsmeding> | for example, do you know what the difference is between `StateT s (Either e) a` and `ExceptT e (State s) a`? |
| 21:42:29 | <tomsmeding> | they both combine a "state" effect and an "exception" effect |
| 21:42:34 | <tomsmeding> | but in a different way! |
| 21:42:41 | <tomsmeding> | @unmtl StateT s (Either e) a |
| 21:42:42 | <lambdabot> | s -> Either e (a, s) |
| 21:42:49 | <tomsmeding> | @unmtl ExceptT e (State s) a |
| 21:42:49 | <lambdabot> | s -> (Either e a, s) |
| 21:42:57 | <tri> | yea definitly no |
| 21:42:58 | <EvanR> | tomsmeding, science doesn't answer the why, only how... oh |
| 21:43:08 | <tomsmeding> | this is what you get when you unwrap the newtypes |
| 21:43:37 | <tomsmeding> | being able to read this, and imagine how the corresponding Functor/Applicative/Monad instances will behave, allows you to make sense of those monad transformer stacks |
| 21:44:13 | <tomsmeding> | personally I find e.g. `s -> Either e (a, s)` understandable (after a few seconds of staring at it), but `StateT s (Either e) a` completely opaque |
| 21:44:23 | <tri> | ok, gotta take another few months to work on these again |
| 21:45:09 | <tomsmeding> | so if the monad transformer stack is mildly complicated, or I can't figure out how to write it precisely, I "just" write down the underlying representation and write the F/A/M instances myself |
| 21:45:28 | <tomsmeding> | once you have a good feel for these monads, writing those instances becomes fairly straightforward |
| 21:45:38 | <tomsmeding> | and then you have freedom in your reign over the monads ;) |
| 21:45:39 | <tri> | ok thank you |
| 21:46:06 | <tomsmeding> | that is, if you're interested in knowing more about this |
| 21:46:45 | <tri> | i mean if that's the only way to learn and use haskell |
| 21:46:59 | <tomsmeding> | depends on what kind of haskell code you want to write |
| 21:47:11 | <tomsmeding> | not all haskell code needs fancy monads |
| 21:47:28 | <tomsmeding> | but if you look at codebases in the wild, you may encounter some |
| 21:47:28 | <tri> | i've already invested a lot of time into this, and now im a bit stuck with monad transformer, so im going back to re-learn the F/A/M |
| 21:47:35 | <tomsmeding> | I see |
| 21:47:50 | <tomsmeding> | yeah, my understanding of monad transformers is very much through what I just explained |
| 21:48:04 | <tri> | yea i skimmed a lot in Learn Haskell From First Principle to get a sense of these |
| 21:48:08 | <tomsmeding> | so if you want to understand monad transformers, I recommend looking more into this |
| 21:48:12 | × | madeleine-sydney quits (~sadie-sor@user/madeleine-sydney) (Ping timeout: 250 seconds) |
| 21:48:26 | <tri> | the book is really heavy and im so fed up with the wordiness |
| 21:48:32 | <tomsmeding> | heh |
| 21:48:35 | <tri> | so now i take a break and read another book |
| 21:48:40 | <tri> | to get another perspective |
| 21:49:09 | → | ftweedal joins (~ftweedal@211.30.152.176) |
| 21:50:43 | <EvanR> | a picture is worth 1000 words, a formula is worth 1000 pictures |
| 21:50:52 | <EvanR> | so next time get a book of formulas xD |
| 21:51:46 | <tomsmeding> | thing is that a formula worth 1000 pictures often takes as long to understand as looking at all of those 1000 pictures |
| 21:52:27 | → | sadie-sorceress joins (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) |
| 21:52:41 | <geekosaur> | and/or require you to understand 1000 other formulas first |
| 21:54:08 | × | michalz quits (~michalz@185.246.207.221) (Quit: ZNC 1.8.2 - https://znc.in) |
| 21:55:20 | <Inst> | thanks tomsmeding |
| 21:58:27 | × | euphores quits (~SASL_euph@user/euphores) (Ping timeout: 268 seconds) |
| 21:58:46 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 22:00:30 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 22:01:26 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 22:01:28 | × | acidjnk_new quits (~acidjnk@p200300d6e714dc22c1009207f5f0377f.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 22:01:34 | × | polyphem quits (~rod@p200300ef2737840025b5ae4e52515c0b.dip0.t-ipconnect.de) (Quit: WeeChat 4.1.1) |
| 22:03:40 | × | zetef quits (~quassel@5.2.182.98) (Ping timeout: 256 seconds) |
| 22:03:41 | → | polyphem joins (~rod@p200300ef2737840025b5ae4e52515c0b.dip0.t-ipconnect.de) |
| 22:04:01 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 22:05:05 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 22:06:06 | × | noumenon quits (~noumenon@113.51-175-156.customer.lyse.net) (Quit: Leaving) |
| 22:09:35 | → | zetef joins (~quassel@5.2.182.99) |
| 22:13:14 | <EvanR> | and then after 1001 formulas you |
| 22:13:41 | <EvanR> | five million something words something |
| 22:14:13 | <EvanR> | billion? |
| 22:14:16 | <EvanR> | too many words |
| 22:19:41 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 22:33:24 | × | sadie-sorceress quits (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) (Quit: Client closed) |
| 22:37:00 | × | emmanuelux quits (~emmanuelu@user/emmanuelux) (Read error: Connection reset by peer) |
| 22:37:35 | → | emmanuelux joins (~emmanuelu@user/emmanuelux) |
| 22:59:35 | × | ftweedal quits (~ftweedal@211.30.152.176) (Ping timeout: 260 seconds) |
| 23:03:21 | <tri> | hi, is StateT Text Identity (Either String a) == State Text (Either String a) |
| 23:04:58 | <EvanR> | the first type doesn't look right since StateT works on a monad |
| 23:05:07 | <EvanR> | :k StateT |
| 23:05:08 | <lambdabot> | * -> (* -> *) -> * -> * |
| 23:05:12 | <EvanR> | oh |
| 23:05:18 | <geekosaur> | yes https://downloads.haskell.org/ghc/9.2.5/docs/html/libraries/mtl-2.2.2/Control-Monad-State-Lazy.html#t:State |
| 23:05:57 | <tri> | I have state :: State Text (Either String a) |
| 23:06:09 | <tri> | and f :: a -> b |
| 23:06:24 | <EvanR> | :t state |
| 23:06:25 | <lambdabot> | MonadState s m => (s -> (a, s)) -> m a |
| 23:06:29 | → | Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius) |
| 23:06:36 | <tri> | then fmap . fmap f state the compiler will give StateT TExt Identity (Either String b) |
| 23:06:45 | <tri> | which is confusing for me |
| 23:07:05 | <tri> | i expect it to show State Text (Either String b) |
| 23:07:05 | <EvanR> | type synonyms might not get restored after a bunch of type checking |
| 23:07:31 | × | Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Max SendQ exceeded) |
| 23:07:43 | <tri> | thank you |
| 23:08:05 | <geekosaur> | right, tracking type synonyms through the typechecker is problematic at best |
| 23:08:18 | → | Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius) |
| 23:08:25 | <geekosaur> | likewise you can find things that started out as String turn into [Char] in the typechecker |
| 23:08:49 | <tri> | oh so you would annotate type directly? I mean i already do that above each function |
| 23:08:56 | <geekosaur> | (in particular, if you apply functions from Data.List / GHC.OldList on them) |
| 23:09:04 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 23:09:15 | <EvanR> | you can put more type signatures if it helps |
| 23:09:30 | <tri> | EvanR: yea alraedy put it above each function |
| 23:09:35 | <tri> | but this happens inside a function |
| 23:09:42 | <EvanR> | though it may require ScopedTypeVariables when they involve type variables |
| 23:10:07 | <EvanR> | yes you can put type signatures in where clauses for example |
| 23:10:14 | <EvanR> | or let bindings |
| 23:10:26 | <tri> | yea sure I could do that |
| 23:10:55 | <geekosaur> | you can also annotate expressions, although that's usually annoying enough that people don't bother unless the compiler needs the help |
| 23:12:12 | <tri> | sure |
| 23:15:51 | × | mhatta quits (~mhatta@www21123ui.sakura.ne.jp) (Quit: ZNC 1.8.2+deb4+b2 - https://znc.in) |
| 23:17:28 | × | target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving) |
| 23:18:23 | → | sadie-sorceress joins (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) |
| 23:19:02 | × | polyphem quits (~rod@p200300ef2737840025b5ae4e52515c0b.dip0.t-ipconnect.de) (Quit: WeeChat 4.1.1) |
| 23:19:12 | × | nek0 quits (~nek0@2a01:4f8:222:2b41::12) (Changing host) |
| 23:19:12 | → | nek0 joins (~nek0@user/nek0) |
| 23:20:03 | → | pavonia joins (~user@user/siracusa) |
| 23:20:24 | × | sawilagar quits (~sawilagar@user/sawilagar) (Ping timeout: 255 seconds) |
| 23:23:44 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 23:23:59 | × | qqq quits (~qqq@92.43.167.61) (Remote host closed the connection) |
| 23:29:37 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 23:39:34 | × | sadie-sorceress quits (~sadie-sor@c-76-155-235-153.hsd1.co.comcast.net) (Ping timeout: 250 seconds) |
| 23:45:04 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
All times are in UTC on 2024-04-06.