Home liberachat/#haskell: Logs Calendar

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.