Home liberachat/#haskell: Logs Calendar

Logs on 2025-03-12 (liberachat/#haskell)

00:01:19 × acidjnk_new quits (~acidjnk@p200300d6e7283f28ecd38ce1a7966a67.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
00:02:04 × hattckory quits (~hattckory@bras-base-toroon4524w-grc-48-184-145-138-167.dsl.bell.ca) (Ping timeout: 260 seconds)
00:03:18 × enikar quits (~enikar@user/enikar) (Ping timeout: 245 seconds)
00:09:01 alfiee joins (~alfiee@user/alfiee)
00:10:12 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
00:13:30 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
00:14:03 × j1n37 quits (~j1n37@user/j1n37) (Read error: Connection reset by peer)
00:14:36 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
00:16:16 enikar joins (~enikar@user/enikar)
00:17:41 j1n37 joins (~j1n37@user/j1n37)
00:25:05 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
00:25:34 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
00:29:54 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
00:37:14 × machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 260 seconds)
00:39:02 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
00:40:58 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
00:46:50 × sprotte24 quits (~sprotte24@p200300d16f384d0018ca1d25abfd4f54.dip0.t-ipconnect.de) (Quit: Leaving)
00:47:40 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
00:54:45 alfiee joins (~alfiee@user/alfiee)
00:58:52 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
00:59:00 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
01:03:45 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 276 seconds)
01:05:53 × xff0x quits (~xff0x@2405:6580:b080:900:9140:fdbd:b262:8bcd) (Ping timeout: 248 seconds)
01:14:21 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
01:16:26 × Tuplanolla quits (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.)
01:19:14 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
01:22:56 × notdabs quits (~Owner@2600:1700:69cf:9000:c403:b663:f780:bd25) (Quit: Leaving)
01:29:44 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
01:31:02 hattckory joins (~hattckory@bras-base-toroon4524w-grc-48-184-145-138-167.dsl.bell.ca)
01:32:09 × califax quits (~califax@user/califx) (Remote host closed the connection)
01:33:57 califax joins (~califax@user/califx)
01:34:04 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
01:35:59 × hattckory quits (~hattckory@bras-base-toroon4524w-grc-48-184-145-138-167.dsl.bell.ca) (Ping timeout: 260 seconds)
01:41:09 alfiee joins (~alfiee@user/alfiee)
01:45:07 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
01:45:25 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
01:49:27 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
01:55:50 <monochrom> Every formatter prioritizes minimizing diffs. This has the side effect of being more ugly and even religious.
01:58:34 <monochrom> But stepping back looking more holistically, that in turn is a side effect of the religion of "source code must be plain text files".
02:00:12 <geekosaur> the day I don't have to use grep because the tools are too dumb, you can take away my plain text files
02:00:29 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
02:01:22 <geekosaur> (the same applies to these overweening new messaging platforms, search is so limited and stupid that I don't even bother on Discord or non-bridged Matrix and I log the bridged rooms on IRC so I can use real search utils)
02:03:01 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
02:03:17 <geekosaur> (this is not religion, it's falling back on stone knives and bearskins)
02:03:17 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
02:04:52 vanishingideal joins (~vanishing@user/vanishingideal)
02:05:09 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
02:09:24 <monochrom> You have an excellent reason, so I don't say that you follow a religion. Some other people use circular logic; that I call religion.
02:09:29 Guest47 joins (~Guest47@2600:387:f:7e18::6)
02:10:39 × Guest47 quits (~Guest47@2600:387:f:7e18::6) (Client Quit)
02:15:09 <geekosaur> I'll also note that with LSPs, we're in at best the early Bronze age (granting that switching from plain text files might allow for improvements — but some of the LSPs I've used are at best Stone age, so I must wonder)
02:15:51 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
02:17:37 yegorc joins (~yegorc@user/yegorc)
02:22:28 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
02:26:33 alfiee joins (~alfiee@user/alfiee)
02:27:36 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 244 seconds)
02:30:41 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 248 seconds)
02:34:21 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
02:39:24 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 272 seconds)
02:41:15 hattckory joins (~hattckory@bras-base-toroon4524w-grc-48-184-145-138-167.dsl.bell.ca)
02:49:43 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
02:54:22 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
02:58:50 tavare joins (~tavare@150.129.88.189)
02:58:50 × tavare quits (~tavare@150.129.88.189) (Changing host)
02:58:50 tavare joins (~tavare@user/tavare)
03:03:51 izzyfalco joins (~jake_pers@user/izzyfalco)
03:05:06 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
03:05:18 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
03:09:24 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
03:11:57 alfiee joins (~alfiee@user/alfiee)
03:16:39 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 265 seconds)
03:20:29 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
03:24:44 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
03:30:30 × enikar quits (~enikar@user/enikar) (Quit: WeeChat 4.5.1)
03:34:04 × Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity)
03:35:51 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
03:40:49 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
03:43:31 × yegorc quits (~yegorc@user/yegorc) (Quit: Leaving)
03:44:57 × izzyfalco quits (~jake_pers@user/izzyfalco) (Ping timeout: 276 seconds)
03:51:13 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
03:55:26 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
03:57:21 alfiee joins (~alfiee@user/alfiee)
03:58:27 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
04:00:29 vanishingideal joins (~vanishing@user/vanishingideal)
04:01:25 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 244 seconds)
04:06:34 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
04:06:58 euouae joins (~euouae@user/euouae)
04:13:39 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
04:18:43 <euouae> This thread <https://www.reddit.com/r/haskell/comments/5zjwym/when_is_undecidableinstances_okay_to_use/> has good info on UndecidableInstances, the other two were easier to understand
04:22:52 <EvanR> The constraint ‘Monad (t n)’ is no smaller than the instance head (Use UndecidableInstances to permit this)
04:22:58 JuanDaugherty joins (~juan@user/JuanDaugherty)
04:23:16 <EvanR> it's really nice when the compiler knows that it will finish and not enter into an infinite loop
04:23:33 <EvanR> which these smaller conditions guarantee
04:24:19 <euouae> what I gathered from the reddit post is that the 's' is not getting smaller and that is the issue
04:24:39 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
04:24:40 <euouae> but at the same time it's fine because of the functional dependency | m -> s in the definition of MonadState in mtl
04:26:13 × infinity0 quits (~infinity0@pwned.gg) (Ping timeout: 245 seconds)
04:26:51 <EvanR> the first thing I thought was "for some reason, this idea of default implementations that work for everything with a certain typeclass instance is frowned upon" and couldn't remember the reason
04:27:03 <EvanR> then ekmett gets to that in the response
04:27:16 <EvanR> it leads to overlapping instances
04:28:35 <EvanR> typeclasses aren't built to do the sort of "overriding" that you see in prototypal OOP. Your type either has a single instance for the class, or it doesn't. Not competing instances with priority
04:28:51 <EvanR> (unless you do overlapping instances and god help you)
04:29:05 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
04:30:14 mange joins (~user@user/mange)
04:31:23 <c_wraith> UndecidableInstances is basically always fine to turn on. It's when you do and then GHC tells you the next thing to do is turn on overlapping, you know you're doing something wrong.
04:32:56 <euouae> I wasn't sure in what situation I'd run into undecidability with instance declarations
04:33:15 <euouae> perhaps if I did `instance Foo (F x) => Foo x where ...`?
04:33:15 × synchromesh quits (~john@2406:5a00:24cf:bb00:c559:e625:333a:3d27) (Read error: Connection reset by peer)
04:34:04 <euouae> but I'm assuming you're saying that the more important/encountered issue is overlapping instances
04:34:24 synchromesh joins (~john@2406:5a00:24cf:bb00:98ab:59f5:dcb3:c8fc)
04:34:32 <EvanR> does the implied kind expected by the hypothetical Foo class make sense there
04:34:37 <c_wraith> yeah, that example would trigger it, but that's not a problem. The problem is that that instance overlaps everything
04:34:45 <c_wraith> So then ghc is going to tell you to allow overlapping
04:34:51 <c_wraith> and that's when things get fragile
04:35:09 <EvanR> ok nvm that
04:35:46 <euouae> oh I see
04:39:23 <EvanR> I tried it
04:39:37 <EvanR> GHC rejects my code because of overlapping instances
04:39:42 <EvanR> but at least doesn't tell me to turn it on xD
04:40:01 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
04:40:05 <c_wraith> I guess when overlapping was moved to a per-instance pragma, they decided not to advise turning it on
04:40:09 <EvanR> (and LANGUAGE OverlappingInstances is deprecated)
04:40:21 <c_wraith> when it was module level, it did just say "turn on this extension to allow this"
04:42:45 alfiee joins (~alfiee@user/alfiee)
04:43:15 <c_wraith> A common way to end up needing UndecidableInstances without MPTCs or Overlapping is stuff like Fix. `newtype Fix f = Fix (f (Fix f))`. Attempting the automatic Show instance for that ends up with the compiler trying to write something like `instance Show (f (Fix f)) => Show (Fix f) ...`
04:43:32 <c_wraith> And in that case, the constraint is definitely larger than the instance head.
04:44:34 <c_wraith> On one hand, that's why the Show1 class exists. On the other, you can do it with UndecidableInstances and StandaloneDeriving.
04:45:44 <EvanR> I continued to try to troll ghc with some terrible overlapping instances
04:45:59 <EvanR> ghci told me to enable IncoherentInstances
04:46:16 <c_wraith> you should be getting nervous.
04:46:19 <EvanR> lol
04:46:53 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 244 seconds)
04:46:55 <euouae> it's like those no-fault waivers
04:47:19 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
04:49:58 <EvanR> now it's telling me the reduction stack size of 201 ran out, and instead of increasing it, to disable the check if I'm sure type checking will terminate
04:50:28 <c_wraith> I'm sure nothing bad could happen
04:50:36 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 276 seconds)
04:52:02 <EvanR> when someone said haskell is not a logic they weren't kidding
04:52:19 <c_wraith> pfft. It's a logic, it's just not a consistent one.
04:52:52 <EvanR> falso 9.6
04:53:29 <c_wraith> inconsistent logics are nice because they let you prove anything, and so does Haskell
04:54:37 <EvanR> that being said, the type class system always terminates if you don't enable any dark magic pragmas right
04:55:04 <EvanR> so there's a way to use it semilogically
04:55:13 <c_wraith> yes. the solver always shrinks the problem with the default rules
04:56:26 tusko joins (uid478376@user/tusko)
04:57:10 × jmcantrell quits (~weechat@user/jmcantrell) (Quit: WeeChat 4.5.2)
04:57:44 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
05:02:05 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
05:06:07 j1n37- joins (~j1n37@user/j1n37)
05:06:58 × j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 272 seconds)
05:13:07 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
05:17:11 × sabathan quits (~sabathan@amarseille-159-1-12-107.w86-203.abo.wanadoo.fr) (Read error: Connection reset by peer)
05:17:33 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
05:20:52 sabathan joins (~sabathan@amarseille-159-1-12-107.w86-203.abo.wanadoo.fr)
05:23:32 robobub joins (uid248673@id-248673.uxbridge.irccloud.com)
05:28:09 alfiee joins (~alfiee@user/alfiee)
05:28:30 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
05:31:19 × j1n37- quits (~j1n37@user/j1n37) (Read error: Connection reset by peer)
05:32:37 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 248 seconds)
05:33:09 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
05:34:44 <euouae> alright thank you both!
05:34:46 × euouae quits (~euouae@user/euouae) ()
05:35:02 j1n37 joins (~j1n37@user/j1n37)
05:41:39 michalz joins (~michalz@185.246.207.221)
05:43:04 k0zy joins (~user@user/k0zy)
05:43:53 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
05:50:41 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
05:55:01 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
06:01:57 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
06:02:29 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 248 seconds)
06:04:13 vanishingideal joins (~vanishing@user/vanishingideal)
06:07:00 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 268 seconds)
06:14:33 alfiee joins (~alfiee@user/alfiee)
06:16:15 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 268 seconds)
06:17:19 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
06:18:58 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
06:22:15 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 276 seconds)
06:25:26 × k0zy quits (~user@user/k0zy) (Remote host closed the connection)
06:27:43 k0zy joins (~user@user/k0zy)
06:27:43 × Vajb quits (~Vajb@85-76-36-81-nat.elisa-mobile.fi) (Read error: Connection reset by peer)
06:27:47 T0NN joins (~T0NN@2404:c0:2c10::16be:e80d)
06:29:30 Vajb joins (~Vajb@n83sqe30rcw6481fyv6-1.v6.elisa-mobile.fi)
06:29:37 × JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: praxis.meansofproduction.biz (juan@acm.org))
06:32:42 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
06:32:56 × k0zy quits (~user@user/k0zy) (Remote host closed the connection)
06:34:06 × T0NN quits (~T0NN@2404:c0:2c10::16be:e80d) (Ping timeout: 240 seconds)
06:37:03 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
06:43:35 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
06:47:56 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
06:58:34 k0zy joins (~user@user/k0zy)
06:58:57 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
07:00:02 × caconym quits (~caconym@user/caconym) (Quit: bye)
07:00:52 caconym joins (~caconym@user/caconym)
07:03:48 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
07:06:17 CiaoSen joins (~Jura@2a02:8071:64e1:7180::ac59)
07:06:38 alfiee joins (~alfiee@user/alfiee)
07:11:02 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
07:12:13 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
07:13:00 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 265 seconds)
07:13:33 Lord_of_Life_ is now known as Lord_of_Life
07:13:58 × j1n37 quits (~j1n37@user/j1n37) (Read error: Connection reset by peer)
07:14:09 × p3n quits (~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1) (Quit: ZNC 1.9.1 - https://znc.in)
07:14:19 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
07:17:12 p3n joins (~p3n@217.198.124.246)
07:17:12 j1n37 joins (~j1n37@user/j1n37)
07:19:09 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
07:19:16 ljdarj joins (~Thunderbi@user/ljdarj)
07:28:18 izzyfalco joins (~jake_pers@user/izzyfalco)
07:29:42 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
07:36:20 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
07:40:42 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 244 seconds)
07:42:19 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
07:42:33 vanishingideal joins (~vanishing@user/vanishingideal)
07:44:36 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
07:49:10 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
07:51:07 Square2 joins (~Square4@user/square)
07:51:46 × pointlessslippe1 quits (~pointless@62.106.85.17) (Read error: Connection reset by peer)
07:52:22 alfiee joins (~alfiee@user/alfiee)
07:56:30 chele joins (~chele@user/chele)
07:56:31 pointlessslippe1 joins (~pointless@62.106.85.17)
07:56:54 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 260 seconds)
07:58:56 machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net)
07:59:58 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
08:03:10 sord937 joins (~sord937@gateway/tor-sasl/sord937)
08:04:37 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
08:06:42 × tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz)
08:10:26 <kaol> I just realized that I can use traverse instead of maybe (pure ()). Much nicer to look at.
08:10:35 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection)
08:10:54 sord937 joins (~sord937@gateway/tor-sasl/sord937)
08:14:25 <ski> or `for'
08:18:58 <kaol> Not unless I flip it.
08:22:35 × ft quits (~ft@p508db291.dip0.t-ipconnect.de) (Quit: leaving)
08:24:40 acidjnk_new joins (~acidjnk@p200300d6e7283f52ecd38ce1a7966a67.dip0.t-ipconnect.de)
08:28:32 gmg joins (~user@user/gehmehgeh)
08:31:05 × ljdarj quits (~Thunderbi@user/ljdarj) (Quit: ljdarj)
08:31:24 ljdarj joins (~Thunderbi@user/ljdarj)
08:37:05 alfiee joins (~alfiee@user/alfiee)
08:40:16 __monty__ joins (~toonn@user/toonn)
08:41:24 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 260 seconds)
08:48:53 × tusko quits (uid478376@user/tusko) (Quit: Connection closed for inactivity)
08:57:49 merijn joins (~merijn@77.242.116.146)
09:00:06 stilgart joins (~Christoph@chezlefab.net)
09:00:27 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
09:03:47 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
09:06:54 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 260 seconds)
09:08:29 merijn joins (~merijn@77.242.116.146)
09:13:51 × izzyfalco quits (~jake_pers@user/izzyfalco) (Ping timeout: 252 seconds)
09:23:10 alfiee joins (~alfiee@user/alfiee)
09:27:28 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 245 seconds)
09:34:29 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 260 seconds)
09:36:32 ljdarj joins (~Thunderbi@user/ljdarj)
09:40:16 × rvalue quits (~rvalue@user/rvalue) (Ping timeout: 252 seconds)
09:40:38 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 252 seconds)
09:44:19 <mauke> rule of thumb: it's always traverse
09:48:00 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
09:49:15 tabaqui1 joins (~root@87.200.129.102)
09:49:55 <dminuoso> Also, you can just locally rename/constraint its type
09:49:59 <dminuoso> % withJust :: Maybe a -> (a -> IO b) -> IO (); withJust = for_b
09:49:59 <yahb2> <interactive>:343:57: error: [GHC-88464] ; Variable not in scope: for_b :: Maybe a -> (a -> IO b) -> IO () ; Suggested fix: Perhaps use ‘for_’ (imported from Data.Foldable)
09:50:02 <dminuoso> % withJust :: Maybe a -> (a -> IO b) -> IO (); withJust = for_
09:50:02 <yahb2> <no output>
09:50:24 <dminuoso> Especially for using Traversable/Foldable instances that are not immediately clear
09:51:00 preflex_ joins (~preflex@user/mauke/bot/preflex)
09:51:01 pata joins (~pata@185.57.29.142)
09:51:16 Guest30566 joins (~Guest3056@fixed-187-189-0-231.totalplay.net)
09:51:28 <dminuoso> Over all my Haskell time, my code complexity/tricky has followed a parabola.
09:51:33 <kaol> traverse @Maybe
09:52:58 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 244 seconds)
09:53:05 merijn joins (~merijn@77.242.116.146)
09:53:43 Guest71 joins (~Guest3056@fixed-187-189-0-231.totalplay.net)
09:54:33 × preflex quits (~preflex@user/mauke/bot/preflex) (Ping timeout: 252 seconds)
09:54:48 preflex_ is now known as preflex
09:55:48 × Clint quits (~Clint@user/clint) (Ping timeout: 245 seconds)
09:56:51 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 265 seconds)
09:57:19 Clint joins (~Clint@user/clint)
09:57:59 <__monty__> dminuoso: -x^2 or x^2? : >
09:58:19 <dminuoso> Heh.
09:59:02 <dminuoso> Right in the middle I was exploring all the type level tricks, dependent typing, effects, had it all. :-)
10:01:45 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 244 seconds)
10:07:10 merijn joins (~merijn@77.242.116.146)
10:09:35 alfiee joins (~alfiee@user/alfiee)
10:14:00 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
10:32:57 takuan joins (~takuan@d8D86B601.access.telenet.be)
10:34:54 × pata quits (~pata@185.57.29.142) (Ping timeout: 240 seconds)
10:35:33 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.5.1)
10:47:49 × Square2 quits (~Square4@user/square) (Ping timeout: 260 seconds)
10:48:34 Square2 joins (~Square4@user/square)
10:49:09 fp joins (~Thunderbi@wireless-86-50-140-47.open.aalto.fi)
10:51:32 xff0x joins (~xff0x@2405:6580:b080:900:7a6d:e986:6f30:4a1b)
10:54:02 × Square2 quits (~Square4@user/square) (Ping timeout: 272 seconds)
10:55:39 alfiee joins (~alfiee@user/alfiee)
11:00:27 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 276 seconds)
11:03:17 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 248 seconds)
11:07:02 ubert joins (~Thunderbi@2a02:8109:ab8a:5a00:b341:438:8f09:aa92)
11:10:51 × tavare quits (~tavare@user/tavare) (Remote host closed the connection)
11:11:17 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds)
11:13:35 rvalue joins (~rvalue@user/rvalue)
11:14:56 <[exa]> so let's say I want to make some minor stats work with haskell and I want to have self-organizing maps implemented. Or k-means or any such thing. Involves matrices with tons (millions) of multidimensional (say 50D) points. What package to choose? The computation depends mainly on fast dot-products between slices of the matrices.
11:15:42 <[exa]> (I'd go accelerate but it sounds a bit like overkill, I don't need it blazing fast; I'm pretty much ok with just "not stupidly inefficient".)
11:17:44 merijn joins (~merijn@77.242.116.146)
11:19:27 × tabaqui quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
11:25:05 tabaqui joins (~root@167.71.80.236)
11:26:41 × tabaqui quits (~root@167.71.80.236) (Client Quit)
11:28:54 × CiaoSen quits (~Jura@2a02:8071:64e1:7180::ac59) (Ping timeout: 268 seconds)
11:41:43 alfiee joins (~alfiee@user/alfiee)
11:46:07 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 244 seconds)
11:49:48 sprotte24 joins (~sprotte24@p200300d16f4b7200116db6fce964005a.dip0.t-ipconnect.de)
11:57:19 CiaoSen joins (~Jura@2a02:8071:64e1:7180::ac59)
11:58:52 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 252 seconds)
12:00:34 merijn joins (~merijn@77.242.116.146)
12:05:36 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 272 seconds)
12:09:39 × acidjnk_new quits (~acidjnk@p200300d6e7283f52ecd38ce1a7966a67.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
12:10:19 acidjnk_new joins (~acidjnk@p200300d6e7283f52ecd38ce1a7966a67.dip0.t-ipconnect.de)
12:14:59 <cheater> just use accelerate
12:17:09 merijn joins (~merijn@77.242.116.146)
12:24:16 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 265 seconds)
12:24:55 × Guest71 quits (~Guest3056@fixed-187-189-0-231.totalplay.net) (Quit: Client closed)
12:24:55 × Guest30566 quits (~Guest3056@fixed-187-189-0-231.totalplay.net) (Quit: Client closed)
12:28:07 alfiee joins (~alfiee@user/alfiee)
12:28:09 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
12:30:37 ljdarj joins (~Thunderbi@user/ljdarj)
12:32:21 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 248 seconds)
12:33:54 jespada joins (~jespada@2800:a4:230e:8000:1050:5077:c5ef:191f)
12:34:13 enikar joins (~enikar@user/enikar)
12:35:07 jespada_ joins (~jespada@2800:a4:230e:8000:1050:5077:c5ef:191f)
12:38:12 × jespada quits (~jespada@2800:a4:230e:8000:1050:5077:c5ef:191f) (Ping timeout: 246 seconds)
12:48:12 × zungi quits (~tory@user/andrewchawk) (Ping timeout: 264 seconds)
12:53:33 Square2 joins (~Square4@user/square)
12:55:01 × mange quits (~user@user/mange) (Quit: Zzz...)
12:55:22 zungi joins (~tory@user/andrewchawk)
12:59:59 weary-traveler joins (~user@user/user363627)
13:02:38 merijn joins (~merijn@77.242.116.146)
13:04:51 × jespada_ quits (~jespada@2800:a4:230e:8000:1050:5077:c5ef:191f) (Ping timeout: 252 seconds)
13:05:08 × acidjnk_new quits (~acidjnk@p200300d6e7283f52ecd38ce1a7966a67.dip0.t-ipconnect.de) (Ping timeout: 272 seconds)
13:07:53 × manwithluck quits (~manwithlu@2a00:7c80:0:3c5::14) (Ping timeout: 245 seconds)
13:09:14 jespada joins (~jespada@2800:a4:22b4:9a00:f994:da25:97cf:4452)
13:13:31 alfiee joins (~alfiee@user/alfiee)
13:16:57 × fp quits (~Thunderbi@wireless-86-50-140-47.open.aalto.fi) (Ping timeout: 276 seconds)
13:17:26 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
13:17:45 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 246 seconds)
13:26:26 <tomsmeding> [exa]: if "not stupidly inefficient" is good enough: storable or unboxed vectors
13:26:46 <tomsmeding> also massiv exists
13:27:22 <tomsmeding> much easier to install than accelerate, currently
13:31:33 <tomsmeding> [exa]: hmatrix has faster routines on vectors (by writing them in C, which does vectorisation where GHC does not)
13:32:01 <tomsmeding> it also pollutes the instance namespace by putting Num, etc. instances on storable vectors
13:32:46 <kuribas> tomsmeding: doesn't accelerate use llvm?
13:32:51 <tomsmeding> yes
13:33:15 <merijn> Storable Vectors are great
13:33:22 <tomsmeding> I have an unmerged patch to accelerate to not link to LLVM but pass LLVM IR to clang instead, which makes the whole thing a lot easier to install
13:33:32 <tomsmeding> we hope to get it in somewhere this spring, but no guarantees
13:34:50 <kuribas> Shouldn't it be faster than massiv/hmatrix then?
13:34:54 <tomsmeding> yes
13:35:13 <tomsmeding> with the hackage-released versions of packages, you also need to install LLVM 9, both static and dynamic libraries
13:35:21 <tomsmeding> this was easy on ubuntu a few years ago
13:35:57 <tomsmeding> with git master versions of stuff, you can use LLVM 15, still static _and_ dynamic libraries, which is easy on current ubuntu and macOS
13:38:49 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
13:41:47 weary-traveler joins (~user@user/user363627)
13:51:08 Inst joins (~Inst@user/Inst)
13:52:15 × forell_ quits (~forell@host-178-216-90-220.sta.tvknaszapraca.pl) (Quit: ZNC - https://znc.in)
13:52:26 <Inst> btw probie thanks for teaching me how to abuse foldr on lists; after playing around for optimization, foldr is almost literally a for loop due to foldr triggering list fusion
13:54:37 forell joins (~forell@user/forell)
13:59:00 × CiaoSen quits (~Jura@2a02:8071:64e1:7180::ac59) (Ping timeout: 265 seconds)
13:59:14 alfiee joins (~alfiee@user/alfiee)
14:03:11 × son0p quits (~ff@2800:e6:4000:d723:c181:4205:f2b1:437a) (Read error: Connection reset by peer)
14:03:59 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 260 seconds)
14:07:17 acidjnk_new joins (~acidjnk@p200300d6e7283f52210926b325fe4262.dip0.t-ipconnect.de)
14:19:23 alexherbo2 joins (~alexherbo@2a02-8440-3504-140e-55c2-d7c2-899b-0789.rev.sfr.net)
14:22:55 T0NN joins (~T0NN@104.28.196.52)
14:23:18 son0p joins (~ff@2800:e6:4000:d723:c181:4205:f2b1:437a)
14:23:35 × T0NN quits (~T0NN@104.28.196.52) (Client Quit)
14:24:48 × TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 252 seconds)
14:24:54 <carbolymer> is Data.List.sortBy guaranteed to be stable over `[Foo]` if I have a trivial `instance Ord Foo where compare _ _ = LT` ? In other words, I expect it to not change the order of elements.
14:25:15 T0NN joins (~T0NN@104.28.196.52)
14:25:23 <carbolymer> `sortBy compare` I mean
14:25:55 <carbolymer> even simpler: `sortBy (\_ _ -> LT)`
14:26:14 <tomsmeding> I'm fairly sure yes
14:26:35 × T0NN quits (~T0NN@104.28.196.52) (Client Quit)
14:26:51 T0NN joins (~T0NN@104.28.196.52)
14:27:14 <tomsmeding> looking at the implementation, for lists of length <=4 it has a manually written decision tree that, if I am to believe the comments, should only reorder if a preceding element is strictly greater than a following element
14:27:39 <tomsmeding> for longer lists, it splits the list into runs of alternatingly ascending/descending elements; in your case there's just one run, so the algorithm terminates there
14:28:10 × T0NN quits (~T0NN@104.28.196.52) (Client Quit)
14:28:57 <carbolymer> that was my intuition, thanks tomsmeding for confirming ;]
14:28:59 <tomsmeding> carbolymer: from the haddocks of 'sort': The sort function implements a stable sorting algorithm.
14:29:21 <tomsmeding> it would be nice if this was also mentioned in 'sortBy', but I think we can extrapolate
14:30:39 <carbolymer> >otherwise, e. g., for _ _ -> GT, the ordered list simply does not exist
14:30:39 <carbolymer> I guess it's not true for all comparison functions in sortBy
14:31:11 <carbolymer> but in my quick test `sortBy (\_ _ -> GT)` results in just reversed list
14:34:53 TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker)
14:45:39 alfiee joins (~alfiee@user/alfiee)
14:47:40 lottaquestions joins (~nick@2607:fa49:5040:b100:5b52:ac7b:b1b7:f59f)
14:50:33 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 268 seconds)
14:54:03 T0NN joins (~T0NN@193.42.62.209)
15:00:39 <[exa]> tomsmeding: iiiiiiiinteresting thanks!
15:07:05 infinity0 joins (~infinity0@pwned.gg)
15:14:08 × infinity0 quits (~infinity0@pwned.gg) (Ping timeout: 245 seconds)
15:22:47 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
15:24:41 Guest99 joins (~Guest47@2600:387:f:7e18::6)
15:32:06 JuanDaugherty joins (~juan@user/JuanDaugherty)
15:33:05 alfiee joins (~alfiee@user/alfiee)
15:33:35 × T0NN quits (~T0NN@193.42.62.209) (Quit: Client closed)
15:37:04 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 244 seconds)
15:37:24 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 246 seconds)
15:37:39 merijn joins (~merijn@77.242.116.146)
15:40:04 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
15:42:01 × Guest99 quits (~Guest47@2600:387:f:7e18::6) (Quit: Client closed)
15:42:31 <Inst> when you're parallelizing a fold
15:42:46 <Inst> a foldr
15:43:46 <Inst> \a cont -> par cont a `pseq` ...; is it more correct to have par a cont or par cont a?
15:46:29 <c_wraith> that's going to be highly workload-dependent. There's no generally correct answer.
15:46:46 <Inst> thanks
15:47:50 notdabs joins (~Owner@2600:1700:69cf:9000:91e8:307c:455b:5f65)
15:49:40 <Inst> what is the difference, though?
15:49:54 <Inst> par a cont should be generating a ton of sparks, but the cont can't return until all the sparks are generated, right?
15:50:42 <c_wraith> `par a b' creates a spark to evaluate a and returns b.
15:51:56 <Inst> i have two dummy cases under Data.Time benchmarking, the first is par a b, the second is par b a
15:53:01 <ski> `pseq (par cont a) (..)' seems a bit useless, the `a' will get ignored by the `pseq' ?
15:53:40 <ski> (well, i suppose it will be forced to WHNF. but not sparked)
15:53:43 <Inst> it's weird, because the par cont a, #1, generates more sparks, #2, fizzles more sparts, and #3, is faster
15:54:37 infinity0 joins (~infinity0@pwned.gg)
15:55:30 <c_wraith> It's all *very* dependent on context. the whole way par works only is effective because of laziness.
15:55:45 <ski> so, with `par cont a', you're sparking odd the recursive calls in `foldr'. each one performed would force its `a'. with `par a cont', you'd instead be sparking off the `a's all directly
15:55:59 <ski> s/odd/off/
15:56:50 <c_wraith> foldr is too low-level to really parallelize in any meaningful way.
15:56:56 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
15:58:38 <c_wraith> all it does is hand control back to f immediately, with all other behavior up to f.
15:59:44 <c_wraith> Depending on what f does, it might make sense to do any number of different things in parallel. Or none.
16:01:04 <ski> mm
16:01:14 Inst joins (~Inst@user/Inst)
16:01:38 <c_wraith> and heck. Even where the input list is coming from matters. Does the generation of the input list have a linear data dependency? Well, then, you're not going to benefit a lot from attempting to process multiple elements in parallel.
16:01:43 <Inst> it's foldr (\a cont -> par cont a `pseq` a: cont)
16:01:49 <Inst> something like that
16:01:59 <c_wraith> oh. so you're actually writing parMap
16:02:24 <Inst> parMap iirc is implemented via Eval monad, which wraps unsafePerformIO
16:02:42 <Inst> i'm trying to set up parFold for a ParFoldable typeclass
16:03:39 <Inst> but yeah, I realize that doing it via monoids is the wrong interface, but might as well be there?
16:04:23 <Inst> so it's actually (\(a,b) cont -> let res = a <> b in par cont res `pseq` res : cont)
16:05:44 × machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 260 seconds)
16:07:15 <c_wraith> that's going to parallelize horribly anyway. It's too low-level.
16:07:48 <c_wraith> It turns out this isn't just something you can sprinkle on top of existing code to get magic results.
16:08:02 × euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.)
16:08:07 <c_wraith> Which is why it really isn't a big thing
16:08:40 <Inst> monoid interface is too restrictive, and this type of large-array stuff i'm testing for is better done via a specialized library supporting massively parallel computing
16:08:56 <Inst> but the degenerate case, at least for me, seems to open up interesting questions
16:09:24 <ski> i don't really see the point of using `par cont (..)' here. what's the intent ?
16:09:37 <c_wraith> also, it turns out that [] is especially hostile to parallelization
16:09:50 <Inst> !!!
16:10:34 <Inst> ski: it's a stupid rabbit hole that I somehow expect has treasure instead of the usual contents of rabbit holes
16:11:01 <Inst> the interesting thing is that a cont, in this particular context, is effectively foldr'
16:11:23 <Inst> since it has to evaluate all the way to the end of the list before it returns anything
16:11:25 <c_wraith> well, not exactly.
16:11:38 <Inst> why not?
16:11:59 <c_wraith> Oh, in that order. Yes, it is.
16:12:22 <c_wraith> except it's creating a spark at every single level
16:12:37 <Inst> and that explains the contradiction, right?
16:13:00 <c_wraith> even if multiples of them fire, they're going to face blackhole contention or redundant work
16:13:39 <Inst> there's 80-90% conversion, efficient spark creation (iirc it generates less sparks overall), but it takes forever on a 10 million element list
16:13:49 <Inst> like 8 times the cont a version
16:13:57 <Inst> which has 60% conversion and creates 2-4 times more sparks
16:14:12 <c_wraith> please, do you know how ghc uses blackholes?
16:14:22 <Inst> no :(
16:14:49 <c_wraith> you need to understand how ghc implements lazy evaluation before you can really understand this.
16:16:15 <c_wraith> there is contention on trying to evaluate the same value twice in parallel
16:16:36 <Inst> and apparently it blocks threads?
16:16:52 <c_wraith> that's what contention does, yes
16:18:38 <c_wraith> The only way to make this pay off at the level par works at is to work with a very high-level understanding of what your code is doing.
16:19:08 alfiee joins (~alfiee@user/alfiee)
16:19:24 <c_wraith> You can't just write a parallel fold. You need to consider what the fold is actually doing and parallelize that.
16:19:50 <Inst> thank you for answering why parFoldMap isn't a thing
16:19:54 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
16:20:56 <Inst> the actual goal here is to fold every element in the list with the adjacent element, producing a new list, then fold the resulting list until it reduces to one level
16:21:12 <Inst> so it's called recursively on itself until it matches [x]
16:21:49 <ski> sounds similar to a merge sort, in that tree aspect
16:22:42 <Inst> sorry, it's a dumb exercise, but i find it fun to think through and try to test
16:23:05 <ski> (or maybe you're combining each element with its next element, as opposed to ones at even indices with the following adjacent ones at odd indices)
16:23:31 <Inst> well tbh i probably should try implementing it imperatively in some other language
16:23:46 <c_wraith> Be sure to use linked lists in the other language, too.
16:24:00 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 272 seconds)
16:24:26 <c_wraith> because that's the part that's leading to so many of these issues
16:25:19 <ski> > (zipWith (+) `ap` tail) [0 .. 7]
16:25:20 <lambdabot> [1,3,5,7,9,11,13]
16:25:23 <ski> > map (\[x,y] -> x + y) (chunk 2 [0 .. 7])
16:25:24 <lambdabot> [1,5,9,13]
16:25:40 <ski> > (zipWith (+) `ap` tail) [0 .. 7] :: [Expr]
16:25:41 <lambdabot> [0 + 1,1 + 2,2 + 3,3 + 4,4 + 5,5 + 6,6 + 7]
16:25:45 <ski> > map (\[x,y] -> x + y) (chunk 2 [0 .. 7]) :: [Expr]
16:25:47 <lambdabot> [0 + 1,2 + 3,4 + 5,6 + 7]
16:26:14 <ski> (unclear which of these two options you're doing, in a pass)
16:26:32 <Inst> second
16:27:18 <ski> mm (as i initially was supposing)
16:27:38 <ski> presumably your combining function is associative
16:27:53 <Inst> yeah it's keyed to monoid
16:28:15 <Inst> chunking function is generating mempty to fill out if it's an odd length list
16:30:25 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
16:31:18 Inst joins (~Inst@user/Inst)
16:32:14 yegorc joins (~yegorc@user/yegorc)
16:33:52 × j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 252 seconds)
16:34:08 j1n37- joins (~j1n37@user/j1n37)
16:35:57 Guest4 joins (~Guest4@2804:14c:3f87:8149:ce7a:9b84:f941:24de)
16:40:30 tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net)
16:41:09 jmcantrell joins (~weechat@user/jmcantrell)
16:42:03 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
16:42:03 × acidjnk_new quits (~acidjnk@p200300d6e7283f52210926b325fe4262.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
16:44:26 × JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: praxis.meansofproduction.biz (juan@acm.org))
16:47:10 × yegorc quits (~yegorc@user/yegorc) (Quit: Leaving)
16:47:43 Guest4 parts (~Guest4@2804:14c:3f87:8149:ce7a:9b84:f941:24de) ()
16:48:54 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 252 seconds)
16:52:05 × lottaquestions quits (~nick@2607:fa49:5040:b100:5b52:ac7b:b1b7:f59f) (Quit: Konversation terminated!)
16:54:42 × hattckory quits (~hattckory@bras-base-toroon4524w-grc-48-184-145-138-167.dsl.bell.ca) (Ping timeout: 276 seconds)
16:57:56 hattckory joins (~hattckory@bras-base-toroon4524w-grc-47-184-146-98-182.dsl.bell.ca)
17:00:40 × synchromesh quits (~john@2406:5a00:24cf:bb00:98ab:59f5:dcb3:c8fc) (Read error: Connection reset by peer)
17:00:54 target_i joins (~target_i@user/target-i/x-6023099)
17:01:41 synchromesh joins (~john@2406:5a00:24cf:bb00:98ab:59f5:dcb3:c8fc)
17:02:40 tusko joins (uid478376@user/tusko)
17:06:12 alfiee joins (~alfiee@user/alfiee)
17:07:36 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 252 seconds)
17:07:50 × synchromesh quits (~john@2406:5a00:24cf:bb00:98ab:59f5:dcb3:c8fc) (Remote host closed the connection)
17:09:47 acidjnk_new joins (~acidjnk@p200300d6e7283f52dc57c47be76b3f6a.dip0.t-ipconnect.de)
17:10:29 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 260 seconds)
17:11:36 prasad joins (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net)
17:31:02 Pablo58 joins (~Pablo@200.40.229.150)
17:32:37 <juri_> I just completed building a single head attention mechanism, in haskell.
17:33:35 × alexherbo2 quits (~alexherbo@2a02-8440-3504-140e-55c2-d7c2-899b-0789.rev.sfr.net) (Remote host closed the connection)
17:33:37 Pablo58 parts (~Pablo@200.40.229.150) ()
17:33:38 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Read error: Connection reset by peer)
17:34:56 Inst joins (~Inst@user/Inst)
17:34:59 <Inst> well, this is new
17:35:18 <Inst> i just generated 1_999_999_998 sparks, and they all dudded
17:35:20 <Inst> i should celebrate
17:37:01 <Inst> (because I'm assuming this means that GHC generated a tight inner loop from foldr, and they were all unboxed, meaning WHNF, and inability to parallelize)
17:37:36 <Inst> (ironically, when I take out the par / pseq notation, the program runs slower by a factor of 3)
17:47:22 <EvanR> that's a lot of assuming
17:47:28 <EvanR> better to actually check somehow
17:48:08 <int-e> this did not spark joy
17:48:34 × acidjnk_new quits (~acidjnk@p200300d6e7283f52dc57c47be76b3f6a.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
17:51:57 alfiee joins (~alfiee@user/alfiee)
17:54:29 <Inst> nah, it's running at the same speed, or even faster; I just think it's funny GHC is telling me "you don't know how to parallelize so I'm going to optimize the code away"
17:54:51 <Inst> putting the par / pseq notation back as bang patterns instead, it's running at the same speed without engaging the spark system
17:56:13 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 245 seconds)
18:01:52 ft joins (~ft@p508db291.dip0.t-ipconnect.de)
18:02:02 × michalz quits (~michalz@185.246.207.221) (Ping timeout: 244 seconds)
18:06:43 <Square2> If you were to replicate a Haskell domain model in java (for JSON RPC purposes), when you control both client and server. And it's exploratory development, what approach would you take?
18:07:17 <Square2> I tried OpenApi but it seems to create as much problems as it solves.
18:07:51 k_hachig_ joins (~k_hachig@2607:fea8:351d:ef0:a56d:37e8:f63c:429c)
18:07:57 <Square2> Also very work heavy to configure the schema part of it
18:07:59 k_hachig_ is now known as k_hachig
18:10:12 michalz joins (~michalz@185.246.207.205)
18:21:18 × ubert quits (~Thunderbi@2a02:8109:ab8a:5a00:b341:438:8f09:aa92) (Remote host closed the connection)
18:39:01 alfiee joins (~alfiee@user/alfiee)
18:39:25 × fun-safe-math quits (~fun-safe-@2601:1c2:1b7f:801f:e1d3:88d5:3ff2:2f10) (Quit: No Ping reply in 180 seconds.)
18:40:10 × jespada quits (~jespada@2800:a4:22b4:9a00:f994:da25:97cf:4452) (Quit: My Mac has gone to sleep. ZZZzzz…)
18:40:40 fun-safe-math joins (~fun-safe-@2601:1c2:1b7f:801f:14e6:e5d:241a:b56c)
18:43:33 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 248 seconds)
18:47:30 <tomsmeding> juri_: in case you wrote it to be fast: what array library did you use?
18:53:39 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
18:55:22 acidjnk_new joins (~acidjnk@p200300d6e7283f52eca5d8b1f7f6f1d4.dip0.t-ipconnect.de)
18:55:51 euphores joins (~SASL_euph@user/euphores)
19:00:04 × caconym quits (~caconym@user/caconym) (Quit: bye)
19:00:46 caconym joins (~caconym@user/caconym)
19:04:14 jespada joins (~jespada@2800:a4:22b4:9a00:f994:da25:97cf:4452)
19:10:16 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
19:10:41 × notdabs quits (~Owner@2600:1700:69cf:9000:91e8:307c:455b:5f65) (Read error: Connection reset by peer)
19:12:09 weary-traveler joins (~user@user/user363627)
19:14:34 machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net)
19:16:09 × j1n37- quits (~j1n37@user/j1n37) (Read error: Connection reset by peer)
19:16:26 × weary-traveler quits (~user@user/user363627) (Ping timeout: 244 seconds)
19:20:23 j1n37 joins (~j1n37@user/j1n37)
19:20:30 × chele quits (~chele@user/chele) (Remote host closed the connection)
19:22:24 × zungi quits (~tory@user/andrewchawk) (Ping timeout: 264 seconds)
19:25:06 alfiee joins (~alfiee@user/alfiee)
19:29:27 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 246 seconds)
19:37:49 <Inst> this is annoying, (+1) 2 isn't in WHNF, right?
19:39:32 zungi joins (~tory@user/andrewchawk)
19:43:49 × infinity0 quits (~infinity0@pwned.gg) (Ping timeout: 248 seconds)
19:44:34 <EvanR> WHNFs aren't applications
19:44:41 <EvanR> that's an application
19:45:01 × j1n37 quits (~j1n37@user/j1n37) (Read error: Connection reset by peer)
19:48:04 j1n37 joins (~j1n37@user/j1n37)
20:00:00 hiecaq parts (~hiecaq@user/hiecaq) (ERC 5.6.0.30.1 (IRC client for GNU Emacs 30.0.92))
20:04:37 infinity0 joins (~infinity0@pwned.gg)
20:07:21 pavonia joins (~user@user/siracusa)
20:07:35 <c_wraith> whnf doesn't reduce under a lambda, though, so (\_ -> 1 + 2) is in WHNF
20:07:35 × a_fantom quits (~fantom@2.219.56.221) (Ping timeout: 244 seconds)
20:07:55 <c_wraith> IIRC, that's the main difference from HNF
20:08:43 <tomsmeding> I get WHNF and NF, but is HNF useful for anything?
20:08:53 <EvanR> so lambda is WHNF, regardless of what's in it
20:09:32 <tomsmeding> EvanR: it makes sense if you consider a lambda to be the "constructor" of the (->) type
20:11:30 alfiee joins (~alfiee@user/alfiee)
20:11:55 <c_wraith> tomsmeding: HNF seems related to like... compiler optimizations. Find reducible expressions anywhere in the graph and reduce them at compile time, for instance.
20:12:18 <tomsmeding> c_wraith: but then why would it not reduce _all_ redexes?
20:12:21 <c_wraith> That's not quite the same, but the idea is related
20:12:28 <tomsmeding> only the one at the left seems awfully arbitrary
20:12:59 <c_wraith> I think it mostly makes for a really nice exercise to say "implement this optimization"
20:13:04 <tomsmeding> surely if I write 'Just (1 + 2)', a compiler should optimise that to Just 3? But as far as I understand, 'Just (1 + 2)' is in HNF
20:13:06 <c_wraith> so textbooks include it
20:13:10 <tomsmeding> heh
20:15:06 <EvanR> though Just (1 + 2) in isolation can't be simplified
20:15:11 <EvanR> in haskell
20:15:20 tomsmeding grumbles
20:15:24 <tomsmeding> 'Just (1 + 2 :: Int)' then
20:15:39 <EvanR> wouldn't that be nice
20:15:41 <c_wraith> or even Integer, for the really bold
20:15:51 <int-e> A pure lambda term is solvable iff it has a HNF.
20:15:51 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 244 seconds)
20:16:03 <int-e> So there's some theoretical interest in HNFs.
20:16:11 <c_wraith> ah, I see.
20:17:30 tomsmeding had to look up "solvable"
20:17:44 <tomsmeding> I have never had to use something like that yet. :)
20:18:03 <EvanR> I don't see why my DOOM implementation in haskell doesn't just run at compile time! This long time joke apparently has become real in typescript recently
20:18:33 <EvanR> typescript... whose type system isn't particularly turing complete aiui
20:20:02 <Inst> iirc WHNF = constructor or partially applied lambda. What's in WHNF but not NF (unless it's been evaluated prior) is constructors holding unevaluated data afaik, right?
20:20:24 <tomsmeding> Inst: what do you mean with "partially applied lambda"?
20:20:36 <tomsmeding> `(\x y -> x + y) 2` is not WHNF
20:21:49 <EvanR> application is not WHNF
20:21:58 <EvanR> whatever is involved
20:22:49 <tomsmeding> if you see the lambda calculus as having just single-argument lambda functions (i.e. `\x y -> E` is sugar for `\x -> \y -> E`), then WHNF is "it's a constructor or a lambda"
20:23:09 <tomsmeding> and as I said, if you see lambda as the "constructor" of the function type, then it's just "it's a constructor"
20:23:23 <EvanR> it's constructors all the way down
20:23:34 <tomsmeding> you're not wrong
20:25:50 <Inst> but (\y -> 2 + y) is WHNF
20:26:01 <tomsmeding> yes, because it's a lambda
20:26:14 <Inst> yeah, partially applied lambda was confusing
20:26:35 <tomsmeding> if you add multi-argument lambdas to your language, the definition of WHNF gets a bit more intricate
20:26:43 izzyfalco joins (~jake_pers@user/izzyfalco)
20:26:46 <tomsmeding> with only single-argument lambdas, it's very straightforward
20:27:33 <Inst> by the way, are there any good parallelization exercises for working with the spark parallelism system?
20:28:27 <Inst> I'm sort of getting tired of trying to implement parFold, it's fun when I see huge improvements (moved from 80 seconds to 0.7 seconds), but ultimately it's not going to ever really be useful
20:31:19 <Inst> it's funny in a way, Chalmers starts their intro programming with Haskell in IO
20:34:02 <Inst> actually, no, I thought Columbia had a course wherein they taught you par and rpar before they taught you recursion, but it's only titled that way and it's a normal haskell course :(
20:34:11 <Inst> https://www.cs.columbia.edu/~sedwards/classes/2023/4995-fall/index.html
20:36:40 sdrfan123 joins (~sdrfan123@2607:fb90:ad22:c6ba:1965:cecd:386e:8114)
20:37:15 × jespada quits (~jespada@2800:a4:22b4:9a00:f994:da25:97cf:4452) (Ping timeout: 244 seconds)
20:38:46 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
20:41:39 jespada joins (~jespada@r190-135-78-231.dialup.adsl.anteldata.net.uy)
20:46:12 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 272 seconds)
20:47:40 <Noinia> hmm, does anyone know how to coerce 'Folds' from the lens package? I.e. I'm trying to implement a function 'test :: forall s s' a. Coercible s s' => Fold s a -> Fold s' a. I can write test myFold = \f -> contramap coerce . myFold f . coerce. But the 'contramap coerce' is bothering me; that does not necessarily seem zero-cost. Any way around that?
20:52:52 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
20:56:49 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
20:59:11 ljdarj1 joins (~Thunderbi@user/ljdarj)
20:59:35 alfiee joins (~alfiee@user/alfiee)
20:59:42 × izzyfalco quits (~jake_pers@user/izzyfalco) (Ping timeout: 252 seconds)
21:00:57 tabaqui joins (~root@167.71.80.236)
21:01:14 × tabaqui quits (~root@167.71.80.236) (Client Quit)
21:01:26 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
21:01:47 tabaqui joins (~root@167.71.80.236)
21:02:04 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 260 seconds)
21:02:04 ljdarj1 is now known as ljdarj
21:02:10 × tabaqui quits (~root@167.71.80.236) (Client Quit)
21:03:35 tabaqui joins (~root@167.71.80.236)
21:03:45 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 248 seconds)
21:04:24 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
21:05:30 × tabaqui quits (~root@167.71.80.236) (Client Quit)
21:07:10 tabaqui joins (~root@167.71.80.236)
21:08:19 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
21:09:39 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 265 seconds)
21:12:54 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
21:17:39 × tabaqui quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
21:22:25 × tusko quits (uid478376@user/tusko) (Quit: Connection closed for inactivity)
21:23:40 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
21:26:55 cheater_ joins (~Username@user/cheater)
21:27:22 × cheater quits (~Username@user/cheater) (Ping timeout: 244 seconds)
21:27:31 cheater_ is now known as cheater
21:28:29 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
21:30:16 × jespada quits (~jespada@r190-135-78-231.dialup.adsl.anteldata.net.uy) (Quit: My Mac has gone to sleep. ZZZzzz…)
21:37:42 × sdrfan123 quits (~sdrfan123@2607:fb90:ad22:c6ba:1965:cecd:386e:8114) (Quit: Client closed)
21:39:04 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
21:43:42 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
21:45:38 alfiee joins (~alfiee@user/alfiee)
21:47:34 fantom joins (~fantom@2.219.56.221)
21:48:23 tusko joins (uid478376@user/tusko)
21:49:54 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 260 seconds)
21:51:33 × target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving)
21:51:56 xkuru joins (~xkuru@user/xkuru)
21:53:52 Inst joins (~Inst@user/Inst)
21:54:27 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
21:57:00 <Inst> c_wraith: thanks for the warning, I finally understand why lists are so hard to parallelize. They're effectively a one-channel stream, so i need a long computation to spark and parallelize the next computation before the first computation finishes, and even then, I'll have problems with blackholing / blocking, as you've said.
21:58:16 <EvanR> there are a few conal videos where he wants to do parallel computation (eventually, in hardware) and he rejects linked list in favor of array (of size power of 2)
21:59:03 Sgeo joins (~Sgeo@user/sgeo)
21:59:06 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
22:00:17 <juri_> FWIW, repa seems to be useful for these things.
22:01:14 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
22:01:54 <juri_> they use Vector internally, but wrap that in an interesting interface.
22:02:39 sdrfan123 joins (~sdrfan123@2607:fb90:ad22:c6ba:1965:cecd:386e:8114)
22:03:02 <EvanR> I guess IRL you would also want to align your power of 2 size array/vector with the cache lines
22:03:38 × takuan quits (~takuan@d8D86B601.access.telenet.be) (Remote host closed the connection)
22:03:39 <juri_> oh, it's much more complicated than that. :)
22:04:11 <EvanR> :(
22:04:14 Inst joins (~Inst@user/Inst)
22:05:45 <juri_> the real problem is: modern computers have an architecture that looks uniform from one angle, but if you get out a stopwatch... has layers of caches, dumb rules, and in order to get real performance, you need to almost hand compile, and back, just so you get your units-of-work in the right sizes for all of the different cache subsystems.
22:06:22 <juri_> (source: I write ~AVX512 assembly by hand, to make LLMs go faster)
22:06:40 Square joins (~Square@user/square)
22:07:46 <Inst> i'm just doing exercises, i have a strong feeling and others have suggested what i'm trying to do is dumb
22:08:20 <Inst> but honestly, tbh, the vision in my head of this tree lazily being populated outwards from the bottom left corner is beautiful
22:09:06 yegorc joins (~yegorc@user/yegorc)
22:09:33 × Square2 quits (~Square4@user/square) (Ping timeout: 245 seconds)
22:09:50 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
22:10:18 <EvanR> is it populating an actual data structure before doing anything else
22:10:48 <EvanR> because you get better laziness by having a plan lined for consuming the tree
22:10:52 <EvanR> lined up
22:11:07 <EvanR> one which lets you forget parts you don't need anymore, before the whole tree is created
22:12:32 <Inst> it's doing it simultaneously
22:14:08 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
22:15:38 × michalz quits (~michalz@185.246.207.205) (Remote host closed the connection)
22:18:13 × Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity)
22:25:15 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
22:26:03 × dibblego quits (~dibblego@haskell/developer/dibblego) (Ping timeout: 244 seconds)
22:27:13 dibblego joins (~dibblego@116-255-1-119.ip4.superloop.au)
22:27:14 × dibblego quits (~dibblego@116-255-1-119.ip4.superloop.au) (Changing host)
22:27:14 dibblego joins (~dibblego@haskell/developer/dibblego)
22:27:29 × sdrfan123 quits (~sdrfan123@2607:fb90:ad22:c6ba:1965:cecd:386e:8114) (Quit: Client closed)
22:30:19 Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi)
22:31:46 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
22:31:53 tabaqui joins (~root@167.71.80.236)
22:31:59 × tabaqui quits (~root@167.71.80.236) (Client Quit)
22:32:02 alfiee joins (~alfiee@user/alfiee)
22:32:19 tabaqui joins (~root@167.71.80.236)
22:33:48 × Inst quits (~Inst@user/Inst) (Remote host closed the connection)
22:34:55 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
22:36:23 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 244 seconds)
22:40:54 <EvanR> juri_, are there any debuggers or simulators that can help with that?
22:41:07 <EvanR> or is it like, write code, try it, see if it's faster
22:41:20 <EvanR> and guess at why or why not
22:43:16 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
22:46:02 catties is now known as Catty
22:47:51 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
22:53:17 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
22:56:00 × infohazards quits (~user@user/fmira) (Ping timeout: 264 seconds)
22:57:26 × ystael quits (~ystael@user/ystael) (Ping timeout: 265 seconds)
22:57:54 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
22:58:39 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
23:03:24 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
23:03:49 × tabaqui quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
23:04:38 × tabaqui1 quits (~root@87.200.129.102) (Quit: WeeChat 4.5.1)
23:04:42 tabaqui joins (~root@167.71.80.236)
23:11:34 tabaqui1 joins (~root@87.200.129.102)
23:14:01 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
23:15:53 × tabaqui1 quits (~root@87.200.129.102) (Client Quit)
23:17:26 alfiee joins (~alfiee@user/alfiee)
23:17:37 tabaqui1 joins (~root@167.71.80.236)
23:18:16 × tabaqui quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
23:18:24 × tuxpaint quits (~a@2600:3c06::f03c:93ff:fea6:ef0e) (Ping timeout: 252 seconds)
23:18:40 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
23:21:36 × alfiee quits (~alfiee@user/alfiee) (Ping timeout: 252 seconds)
23:29:23 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
23:31:33 tabaqui joins (~root@167.71.80.236)
23:34:06 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 268 seconds)
23:36:50 × tabaqui1 quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
23:36:52 × tabaqui quits (~root@167.71.80.236) (Quit: WeeChat 4.5.1)
23:38:11 tabaqui joins (~tabaqui@167.71.80.236)
23:38:51 tabaqui1 joins (~root@167.71.80.236)
23:40:39 × tabaqui1 quits (~root@167.71.80.236) (Client Quit)
23:40:53 tabaqui1 joins (~root@167.71.80.236)
23:41:02 <Leary> Noinia: `Fold` does a silly thing where it quantifies over `f` both `Functor` and `Contravariant`, hence restricting to `f` phantom in `s`. The role system doesn't understand this, however; `coerce` alone won't work, but you can take solace in the fact that `fmap`/`contramap` will be trivial at runtime.
23:43:04 × tabaqui1 quits (~root@167.71.80.236) (Client Quit)
23:44:39 <jackdk> Noinia: is https://hackage.haskell.org/package/base-4.21.0.0/docs/Data-Functor-Contravariant.html#v:phantom any use to you here?
23:44:46 merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl)
23:45:27 <jackdk> Ah, `phantom` is still implemented as `() <$ x $< ()`. I had hoped it would be an unsafeCoerce in a wrapper
23:45:30 tabaqui1 joins (~root@167.71.80.236)
23:46:19 × tabaqui1 quits (~root@167.71.80.236) (Client Quit)
23:47:18 tabaqui1 joins (~root@167.71.80.236)
23:49:06 × merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
23:58:07 × tusko quits (uid478376@user/tusko) (Quit: Connection closed for inactivity)

All times are in UTC on 2025-03-12.