2024/03/07

2024-03-07 00:01:02 +0100alexherbo2(~alexherbo@2a02-8440-3240-b056-3594-8200-bad6-a60a.rev.sfr.net) (Remote host closed the connection)
2024-03-07 00:01:22 +0100alexherbo2(~alexherbo@2a02-8440-3240-b056-3594-8200-bad6-a60a.rev.sfr.net)
2024-03-07 00:03:25 +0100acidjnk_new3(~acidjnk@p200300d6e737e73474a39a603313c7aa.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
2024-03-07 00:08:07 +0100joeyh(~joeyh@kitenet.net) (Ping timeout: 246 seconds)
2024-03-07 00:08:21 +0100joeyh(joeyh@kitenet.net)
2024-03-07 00:09:25 +0100son0p(~ff@186.121.59.199) (Ping timeout: 264 seconds)
2024-03-07 00:13:15 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 00:18:03 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 00:21:20 +0100michalz(~michalz@185.246.207.205) (Quit: ZNC 1.8.2 - https://znc.in)
2024-03-07 00:21:32 +0100Sgeo(~Sgeo@user/sgeo)
2024-03-07 00:22:43 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 272 seconds)
2024-03-07 00:24:01 +0100a51(a51@gateway/vpn/protonvpn/a51) (Quit: WeeChat 4.2.1)
2024-03-07 00:29:09 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
2024-03-07 00:46:09 +0100zmt00(~zmt00@user/zmt00)
2024-03-07 00:49:47 +0100redmp(~redmp@eduroam-169-233-149-113.ucsc.edu) (Ping timeout: 264 seconds)
2024-03-07 00:52:48 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 255 seconds)
2024-03-07 00:57:46 +0100 <shapr> Is there an explicit list of which GHC version have support?
2024-03-07 00:58:06 +0100 <shapr> That is, can I drop support for ghc 8 and stick with ghc 9+ ?
2024-03-07 01:03:37 +0100Sgeo_(~Sgeo@user/sgeo)
2024-03-07 01:04:01 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2024-03-07 01:04:05 +0100mastarija(~mastarija@141-136-168-205.dsl.iskon.hr)
2024-03-07 01:04:49 +0100rvalue(~rvalue@user/rvalue) (Ping timeout: 246 seconds)
2024-03-07 01:04:53 +0100mastarija(~mastarija@141-136-168-205.dsl.iskon.hr) (Client Quit)
2024-03-07 01:05:15 +0100mastarija(~mastarija@141-136-168-205.dsl.iskon.hr)
2024-03-07 01:05:56 +0100ph88(~ph88@2a02:8109:9e26:c800:5ab5:db14:e57d:d013) (Remote host closed the connection)
2024-03-07 01:09:16 +0100smalltalkman(uid545680@id-545680.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2024-03-07 01:12:22 +0100rvalue(~rvalue@user/rvalue)
2024-03-07 01:12:49 +0100iteratee(~kyle@162.218.222.207) (Read error: Connection reset by peer)
2024-03-07 01:12:59 +0100iteratee(~kyle@162.218.222.207)
2024-03-07 01:13:37 +0100res0nat0r0844909(~Fletch@falcon.whatbox.ca) (Quit: Ping timeout (120 seconds))
2024-03-07 01:13:51 +0100res0nat0r0844909(~Fletch@falcon.whatbox.ca)
2024-03-07 01:17:03 +0100alexherbo2(~alexherbo@2a02-8440-3240-b056-3594-8200-bad6-a60a.rev.sfr.net) (Remote host closed the connection)
2024-03-07 01:17:48 +0100dostoyevsky2(~sck@user/dostoyevsky2) (Ping timeout: 260 seconds)
2024-03-07 01:18:50 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 01:23:16 +0100 <geekosaur> I don't know where it's documented, but the support window is the current and previous release
2024-03-07 01:23:50 +0100 <geekosaur> so 9.6 and 9.8 are currently supported (and a new 9.6 release is being prepared, which will probably be its last because 9.10 is on the way)
2024-03-07 01:24:05 +0100 <geekosaur> https://gitlab.haskell.org/ghc/ghc/-/wikis/GHC-status
2024-03-07 01:27:14 +0100 <geekosaur> some packages have wider ghc support windows, for example HLS supports back to ghc 9.2
2024-03-07 01:27:22 +0100mastarija(~mastarija@141-136-168-205.dsl.iskon.hr) (Quit: Client closed)
2024-03-07 01:32:14 +0100dostoyevsky2(~sck@user/dostoyevsky2)
2024-03-07 01:33:11 +0100Feuermagier(~Feuermagi@user/feuermagier) (Quit: Leaving)
2024-03-07 01:33:17 +0100mei(~mei@user/mei) (Remote host closed the connection)
2024-03-07 01:35:41 +0100mei(~mei@user/mei)
2024-03-07 01:39:11 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Quit: Leaving...)
2024-03-07 01:40:24 +0100inedia(~irc@2602:2da:0:80:5054:ff:fe3c:8d93) (Quit: WeeChat 4.1.2)
2024-03-07 01:43:21 +0100 <geekosaur> hm, actually I think it's current and past two, but at this point 9.4 is only going to be updated if a severe bug is found (which seems unlikely this late in its life)
2024-03-07 01:54:10 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 246 seconds)
2024-03-07 01:57:49 +0100versatile_(~versatile@176.254.244.83)
2024-03-07 01:59:17 +0100redmp(~redmp@mobile-166-177-251-21.mycingular.net)
2024-03-07 02:00:41 +0100versatile(~versatile@176.254.244.83) (Ping timeout: 256 seconds)
2024-03-07 02:07:22 +0100motherfsck(~motherfsc@user/motherfsck)
2024-03-07 02:16:07 +0100thegeekinside(~thegeekin@189.217.83.221) (Remote host closed the connection)
2024-03-07 02:18:02 +0100son0p(~ff@186.121.98.6)
2024-03-07 02:19:34 +0100EvanR_(~EvanR@user/evanr)
2024-03-07 02:20:02 +0100EvanR(~EvanR@user/evanr) (Read error: Connection reset by peer)
2024-03-07 02:20:22 +0100 <haskellbridge> <s​m> yea I thought last 3 major releases was common
2024-03-07 02:20:27 +0100 <haskellbridge> <s​m> but it really depends on your goals
2024-03-07 02:20:35 +0100redmp(~redmp@mobile-166-177-251-21.mycingular.net) (Ping timeout: 260 seconds)
2024-03-07 02:20:52 +0100 <haskellbridge> <s​m> and project
2024-03-07 02:23:45 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com)
2024-03-07 02:25:57 +0100peterbecich(~Thunderbi@047-229-123-186.res.spectrum.com)
2024-03-07 02:37:54 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net)
2024-03-07 02:41:39 +0100RahulMalhotra(~RahulMalh@2409:4051:4e1b:efb5::848:eb13)
2024-03-07 02:42:59 +0100RahulMalhotra(~RahulMalh@2409:4051:4e1b:efb5::848:eb13) (Client Quit)
2024-03-07 02:47:13 +0100xff0x(~xff0x@2405:6580:b080:900:4382:9a13:8c84:8575) (Ping timeout: 264 seconds)
2024-03-07 02:48:20 +0100Buggys(Buggys@Buggy.shelltalk.net) (Ping timeout: 256 seconds)
2024-03-07 02:53:40 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
2024-03-07 02:53:52 +0100smalltalkman(uid545680@id-545680.hampstead.irccloud.com)
2024-03-07 02:56:45 +0100Buggys(Buggys@shelltalk.net)
2024-03-07 03:00:30 +0100Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2024-03-07 03:01:11 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 264 seconds)
2024-03-07 03:01:55 +0100Lord_of_Life_Lord_of_Life
2024-03-07 03:08:14 +0100inedia(~irc@2600:3c00:e000:287::1)
2024-03-07 03:22:39 +0100peterbecich(~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 255 seconds)
2024-03-07 03:26:58 +0100euleritian(~euleritia@77.22.252.56) (Ping timeout: 264 seconds)
2024-03-07 03:31:42 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de)
2024-03-07 03:33:11 +0100igemnace(~ian@user/igemnace)
2024-03-07 03:34:17 +0100Feuermagier(~Feuermagi@user/feuermagier)
2024-03-07 03:34:41 +0100xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2024-03-07 03:35:55 +0100vnogueira(~vnogueira@user/vnogueira)
2024-03-07 03:42:41 +0100mulk(~mulk@p5b1123d6.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
2024-03-07 03:43:44 +0100mulk(~mulk@p5b112b94.dip0.t-ipconnect.de)
2024-03-07 03:47:13 +0100otto_s(~user@p4ff2730f.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
2024-03-07 03:49:04 +0100otto_s(~user@p4ff27fa9.dip0.t-ipconnect.de)
2024-03-07 03:52:27 +0100Square2(~Square4@user/square)
2024-03-07 03:55:30 +0100Square(~Square@user/square) (Ping timeout: 255 seconds)
2024-03-07 03:57:34 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 264 seconds)
2024-03-07 04:00:46 +0100Feuermagier(~Feuermagi@user/feuermagier) (Remote host closed the connection)
2024-03-07 04:05:30 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 04:08:23 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 04:08:58 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 04:11:37 +0100jargon(~jargon@154.sub-174-205-226.myvzw.com) (Remote host closed the connection)
2024-03-07 04:15:25 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Ping timeout: 264 seconds)
2024-03-07 04:27:51 +0100igemnace(~ian@user/igemnace) (Read error: Connection reset by peer)
2024-03-07 04:29:47 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 04:30:08 +0100Square3(~Square4@user/square)
2024-03-07 04:30:19 +0100Square2(~Square4@user/square) (Ping timeout: 260 seconds)
2024-03-07 04:45:07 +0100igemnace(~ian@user/igemnace)
2024-03-07 04:48:13 +0100bilegeek(~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce)
2024-03-07 04:48:19 +0100 <jackdk> Can anyone recommend me an FRP library for textmode UIs? I'm most familiar with Reflex's Event/Behavior/Dynamic model but I'd be down to try others (I see `bricki-reflex` was last touched seven years ago)
2024-03-07 04:54:46 +0100 <haskellbridge> <s​m> that'd be the one I expect
2024-03-07 04:56:03 +0100 <haskellbridge> <s​m> oh, maybe I'm thinking of https://hackage.haskell.org/package/reflex-vty
2024-03-07 04:57:35 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 05:00:02 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 05:01:28 +0100 <geekosaur> that's what I'd expect it to be anyway; brick is a traditional GUI over vty, I'd expect FRP to also be built atop vty
2024-03-07 05:01:39 +0100 <geekosaur> s/GUI/TUI/
2024-03-07 05:02:06 +0100 <jackdk> somehow I missed that reflex-vty existed. Thanks both
2024-03-07 05:02:16 +0100td_(~td@i53870914.versanet.de) (Ping timeout: 260 seconds)
2024-03-07 05:03:52 +0100td_(~td@i53870916.versanet.de)
2024-03-07 05:25:08 +0100bontaq``(~user@ool-45779c03.dyn.optonline.net) (Ping timeout: 260 seconds)
2024-03-07 05:26:36 +0100aforemny_(~aforemny@i59F516F6.versanet.de)
2024-03-07 05:28:01 +0100aforemny(~aforemny@i59F516E5.versanet.de) (Ping timeout: 264 seconds)
2024-03-07 05:29:20 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0)
2024-03-07 05:30:00 +0100JamesMowery(~JamesMowe@ip98-171-80-211.ph.ph.cox.net)
2024-03-07 05:42:29 +0100waleee(~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 240 seconds)
2024-03-07 05:43:58 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 05:44:16 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 05:48:29 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2024-03-07 05:55:18 +0100redmp(~redmp@mobile-166-171-248-7.mycingular.net)
2024-03-07 06:03:24 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2024-03-07 06:05:57 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Quit: Quit)
2024-03-07 06:07:28 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0)
2024-03-07 06:07:41 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Remote host closed the connection)
2024-03-07 06:07:43 +0100peterbecich(~Thunderbi@047-229-123-186.res.spectrum.com)
2024-03-07 06:07:58 +0100michalz(~michalz@185.246.207.205)
2024-03-07 06:08:47 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2024-03-07 06:11:52 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 06:14:57 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 06:27:52 +0100michalz(~michalz@185.246.207.205) (Quit: ZNC 1.8.2 - https://znc.in)
2024-03-07 06:30:38 +0100michalz(~michalz@185.246.207.200)
2024-03-07 06:30:48 +0100edwardkwakes up and checks in on how things are going around here.
2024-03-07 06:35:56 +0100jargon(~jargon@154.sub-174-205-226.myvzw.com)
2024-03-07 06:36:57 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0)
2024-03-07 06:39:45 +0100qqq(~qqq@92.43.167.61) (Remote host closed the connection)
2024-03-07 06:41:18 +0100fansly(~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Client Quit)
2024-03-07 06:43:53 +0100jargon(~jargon@154.sub-174-205-226.myvzw.com) (Remote host closed the connection)
2024-03-07 06:47:23 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds)
2024-03-07 06:47:57 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de)
2024-03-07 06:48:17 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 06:49:40 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de)
2024-03-07 06:55:49 +0100mei(~mei@user/mei) (Remote host closed the connection)
2024-03-07 06:58:13 +0100mei(~mei@user/mei)
2024-03-07 07:02:55 +0100mjrosenb(~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net) (Ping timeout: 260 seconds)
2024-03-07 07:09:44 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 07:10:18 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 07:10:23 +0100peterbecich(~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds)
2024-03-07 07:12:16 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 07:16:53 +0100redmp(~redmp@mobile-166-171-248-7.mycingular.net) (Ping timeout: 256 seconds)
2024-03-07 07:18:25 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2024-03-07 07:23:10 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 246 seconds)
2024-03-07 07:23:36 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de)
2024-03-07 07:23:40 +0100danza(~francesco@151.43.168.41)
2024-03-07 07:24:02 +0100Lycurgus(~georg@user/Lycurgus)
2024-03-07 07:24:33 +0100mjrosenb(~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net)
2024-03-07 07:25:35 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2024-03-07 07:26:14 +0100ec(~ec@gateway/tor-sasl/ec)
2024-03-07 07:29:36 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2024-03-07 07:34:15 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 07:36:59 +0100 <haskellbridge> <s​m> good morning edwardk ☀️
2024-03-07 07:37:13 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
2024-03-07 07:54:27 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 07:55:58 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2024-03-07 07:56:13 +0100petrichor(~znc-user@user/petrichor) (Ping timeout: 264 seconds)
2024-03-07 07:57:15 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net)
2024-03-07 07:57:57 +0100echoreply(~echoreply@45.32.163.16) (Quit: WeeChat 2.8)
2024-03-07 07:58:35 +0100acidjnk_new3(~acidjnk@p200300d6e737e753f8b7044289a8517e.dip0.t-ipconnect.de)
2024-03-07 07:59:17 +0100echoreply(~echoreply@45.32.163.16)
2024-03-07 08:06:12 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in)
2024-03-07 08:19:04 +0100tri(~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
2024-03-07 08:20:49 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 264 seconds)
2024-03-07 08:23:48 +0100fmd(~fmd@user/framend)
2024-03-07 08:25:44 +0100danza(~francesco@151.43.168.41) (Ping timeout: 260 seconds)
2024-03-07 08:26:42 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br)
2024-03-07 08:27:06 +0100zetef(~quassel@95.77.17.251)
2024-03-07 08:27:50 +0100mei(~mei@user/mei) (Remote host closed the connection)
2024-03-07 08:30:15 +0100mei(~mei@user/mei)
2024-03-07 08:33:14 +0100tr_ev(~trev@user/trev)
2024-03-07 08:36:56 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds)
2024-03-07 08:38:39 +0100phma(~phma@2001:5b0:212a:dbd8:9225:61ca:7b7d:b499) (Read error: Connection reset by peer)
2024-03-07 08:39:23 +0100phma(phma@2001:5b0:211f:bff8:ed6a:61e2:ef0c:3875)
2024-03-07 08:42:44 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752)
2024-03-07 08:42:47 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
2024-03-07 08:45:34 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2024-03-07 08:46:59 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03)
2024-03-07 08:50:18 +0100Sgeo_(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2024-03-07 08:53:46 +0100euleritian(~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 08:54:04 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 08:57:14 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 09:00:03 +0100oo_miguel(~Thunderbi@78-11-181-16.static.ip.netia.com.pl)
2024-03-07 09:06:27 +0100zetef(~quassel@95.77.17.251) (Ping timeout: 255 seconds)
2024-03-07 09:06:40 +0100misterfish(~misterfis@46.44.172.198)
2024-03-07 09:12:46 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 260 seconds)
2024-03-07 09:12:52 +0100chele(~chele@user/chele)
2024-03-07 09:15:50 +0100zetef(~quassel@95.77.17.251)
2024-03-07 09:22:38 +0100danse-nr3(~danse@185.211.81.183)
2024-03-07 09:25:29 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 272 seconds)
2024-03-07 09:34:41 +0100tzh(~tzh@c-73-164-206-160.hsd1.or.comcast.net) (Quit: zzz)
2024-03-07 09:40:46 +0100vnogueira(~vnogueira@user/vnogueira) (Ping timeout: 260 seconds)
2024-03-07 09:41:16 +0100mei(~mei@user/mei) (Remote host closed the connection)
2024-03-07 09:41:58 +0100vnogueira(~vnogueira@user/vnogueira)
2024-03-07 09:41:58 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net)
2024-03-07 09:43:42 +0100mei(~mei@user/mei)
2024-03-07 09:50:59 +0100 <absence> Is it possible to convert from "forall m. C m => a -> m b" to "a -> forall m. C m => m b"? It's kind of like flip, but... :P
2024-03-07 09:54:24 +0100trev(~trev@user/trev) (Remote host closed the connection)
2024-03-07 09:54:40 +0100trev(~trev@user/trev)
2024-03-07 09:55:29 +0100 <tomsmeding> absence: https://play.haskell.org/saved/BILj1Fqs seems like ghc just... does it?
2024-03-07 09:55:43 +0100 <tomsmeding> I guess the answer is "eta-expand"
2024-03-07 09:56:55 +0100tr_ev(~trev@user/trev) (Quit: tr_ev)
2024-03-07 09:57:35 +0100notzmv(~daniel@user/notzmv) (Remote host closed the connection)
2024-03-07 09:58:21 +0100 <danse-nr3> does not look like flip though, i think the semantic is different (also probably needs parenthesis on the right)
2024-03-07 09:59:44 +0100 <probie> you don't even need to eta-expand in older versions of GHC
2024-03-07 10:00:27 +0100notzmv(~daniel@user/notzmv)
2024-03-07 10:02:18 +0100 <danse-nr3> oh had to check tomsmeding's snippet
2024-03-07 10:02:30 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2024-03-07 10:02:42 +0100 <ncf> it is a kind of dependent flip
2024-03-07 10:02:51 +0100 <tomsmeding> in Core it's a flip
2024-03-07 10:02:52 +0100 <absence> tomsmeding: How about when you fmap such a function?
2024-03-07 10:03:08 +0100 <tomsmeding> absence: add abundant type signatures, then see how many you can remove
2024-03-07 10:03:38 +0100 <tomsmeding> when working with explicitly polymorphic functions, you need lots of type signatures
2024-03-07 10:04:46 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection)
2024-03-07 10:05:17 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752)
2024-03-07 10:05:35 +0100bilegeek_(~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce)
2024-03-07 10:05:41 +0100econo_(uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2024-03-07 10:07:58 +0100jau(~user@2a04:4540:7212:6d00:e5f3:df01:adee:2cc8)
2024-03-07 10:08:09 +0100 <absence> tomsmeding: https://play.haskell.org/saved/YxvpfR3U
2024-03-07 10:08:16 +0100bilegeek(~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) (Ping timeout: 268 seconds)
2024-03-07 10:09:50 +0100 <probie> absence: https://play.haskell.org/saved/LZ1rvzya
2024-03-07 10:09:54 +0100 <tomsmeding> absence: https://play.haskell.org/saved/Ve1BBcxh
2024-03-07 10:09:56 +0100 <tomsmeding> oh
2024-03-07 10:10:01 +0100 <tomsmeding> lol
2024-03-07 10:10:06 +0100 <tomsmeding> take probie's version
2024-03-07 10:10:24 +0100ania123(~ania123@94-43-231-47.dsl.utg.ge)
2024-03-07 10:10:25 +0100travgm__(~travgm@2600:100e:a121:ef84:212e:f7c5:fded:46ea)
2024-03-07 10:11:54 +0100 <absence> Ahh of course, lambdas can be eta expanded as well. Thanks!
2024-03-07 10:12:36 +0100bilegeek_(~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) (Ping timeout: 256 seconds)
2024-03-07 10:13:07 +0100travgm_(~travgm@2600:100e:a121:ef84:212e:f7c5:fded:46ea) (Ping timeout: 256 seconds)
2024-03-07 10:14:15 +0100misterfish(~misterfis@46.44.172.198) (Ping timeout: 256 seconds)
2024-03-07 10:15:43 +0100fmd(~fmd@user/framend) (Quit: So much programs to build…)
2024-03-07 10:25:07 +0100ubert(~Thunderbi@2a02:8109:ab8a:5a00:e52f:c589:18bb:7d17)
2024-03-07 10:30:02 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 10:31:57 +0100ft(~ft@p508db2e6.dip0.t-ipconnect.de) (Quit: leaving)
2024-03-07 10:35:32 +0100notzmv(~daniel@user/notzmv) (Read error: Connection reset by peer)
2024-03-07 10:36:53 +0100misterfish(~misterfis@84.53.85.146)
2024-03-07 10:39:36 +0100notzmv(~daniel@user/notzmv)
2024-03-07 10:41:33 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2024-03-07 10:41:41 +0100danse-nr3(~danse@185.211.81.183) (Ping timeout: 252 seconds)
2024-03-07 10:42:15 +0100zetef(~quassel@95.77.17.251) (Quit: No Ping reply in 180 seconds.)
2024-03-07 10:47:52 +0100danse-nr3(~danse@151.43.166.155)
2024-03-07 10:50:58 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
2024-03-07 10:52:21 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com)
2024-03-07 10:52:30 +0100danse-nr3(~danse@151.43.166.155) (Read error: Connection reset by peer)
2024-03-07 10:53:37 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan) (Quit: _)
2024-03-07 10:53:47 +0100danse-nr3(~danse@151.43.211.246)
2024-03-07 10:53:51 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan)
2024-03-07 10:56:27 +0100monochrom(trebla@216.138.220.146) (Quit: ZNC 1.8.2+deb3.1 - https://znc.in)
2024-03-07 11:05:48 +0100zetef(~quassel@93.122.251.174)
2024-03-07 11:06:11 +0100xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 272 seconds)
2024-03-07 11:08:54 +0100monochrom(trebla@216.138.220.146)
2024-03-07 11:15:22 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection)
2024-03-07 11:15:42 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752)
2024-03-07 11:16:03 +0100cfricke(~cfricke@user/cfricke)
2024-03-07 11:26:16 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 256 seconds)
2024-03-07 11:28:53 +0100julie_pilgrim(~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection)
2024-03-07 11:32:35 +0100zetef(~quassel@93.122.251.174) (Read error: Connection reset by peer)
2024-03-07 11:32:52 +0100destituion(~destituio@2a02:2121:34a:61a6:afbf:6cfe:62a6:9770) (Ping timeout: 260 seconds)
2024-03-07 11:36:54 +0100zetef(~quassel@95.77.17.251)
2024-03-07 11:40:47 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
2024-03-07 11:45:30 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 11:50:55 +0100Square3(~Square4@user/square) (Ping timeout: 246 seconds)
2024-03-07 11:56:19 +0100[[PSYCHIATRIST(~PSYCHIAT@46.197.13.174)
2024-03-07 12:02:09 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 12:07:37 +0100xff0x(~xff0x@2405:6580:b080:900:e821:772c:646b:bc1f)
2024-03-07 12:08:38 +0100causal(~eric@50.35.85.7)
2024-03-07 12:15:11 +0100__monty__(~toonn@user/toonn)
2024-03-07 12:17:59 +0100[[PSYCHIATRIST(~PSYCHIAT@46.197.13.174) (Quit: Connection closed)
2024-03-07 12:18:48 +0100sidd-dino(~sidd-dino@gateway/tor-sasl/sidd-dino)
2024-03-07 12:22:13 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 255 seconds)
2024-03-07 12:25:20 +0100igemnace(~ian@user/igemnace) (Read error: Connection reset by peer)
2024-03-07 12:27:25 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
2024-03-07 12:28:14 +0100a51(a51@gateway/vpn/protonvpn/a51)
2024-03-07 12:35:01 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 246 seconds)
2024-03-07 12:35:31 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de)
2024-03-07 12:36:44 +0100ania123(~ania123@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
2024-03-07 12:40:42 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 12:41:06 +0100euleritian(~euleritia@77.22.252.56)
2024-03-07 12:43:11 +0100danse-nr3(~danse@151.43.211.246) (Ping timeout: 264 seconds)
2024-03-07 12:43:17 +0100igemnace(~ian@user/igemnace)
2024-03-07 12:45:31 +0100euleritian(~euleritia@77.22.252.56) (Read error: Connection reset by peer)
2024-03-07 12:45:37 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 255 seconds)
2024-03-07 12:46:05 +0100euleritian(~euleritia@77.22.252.56)
2024-03-07 12:47:06 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 12:55:14 +0100zetef(~quassel@95.77.17.251) (Remote host closed the connection)
2024-03-07 12:57:41 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
2024-03-07 13:05:22 +0100danse-nr3(~danse@151.43.155.172)
2024-03-07 13:25:48 +0100gehmehgeh(~user@user/gehmehgeh)
2024-03-07 13:26:07 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Ping timeout: 246 seconds)
2024-03-07 13:26:19 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2024-03-07 13:32:05 +0100gehmehgehgmg
2024-03-07 13:45:46 +0100euleritian(~euleritia@77.22.252.56) (Read error: Connection reset by peer)
2024-03-07 13:46:36 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 13:58:22 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in)
2024-03-07 14:00:15 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection)
2024-03-07 14:00:25 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2024-03-07 14:00:39 +0100gmg(~user@user/gehmehgeh) (Remote host closed the connection)
2024-03-07 14:00:52 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br)
2024-03-07 14:01:27 +0100gmg(~user@user/gehmehgeh)
2024-03-07 14:03:43 +0100srz(~srz@181.228.49.93)
2024-03-07 14:04:28 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br) (Client Quit)
2024-03-07 14:08:34 +0100gabiruh(~gabiruh@vps19177.publiccloud.com.br)
2024-03-07 14:11:44 +0100tr_ev(~trev@user/trev)
2024-03-07 14:14:49 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds)
2024-03-07 14:17:49 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de)
2024-03-07 14:19:58 +0100tr_ev(~trev@user/trev) (Quit: tr_ev)
2024-03-07 14:19:59 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 14:21:43 +0100euleritian(~euleritia@77.22.252.56)
2024-03-07 14:21:48 +0100L29Ah(~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer)
2024-03-07 14:25:34 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03)
2024-03-07 14:26:25 +0100euleritian(~euleritia@77.22.252.56) (Ping timeout: 256 seconds)
2024-03-07 14:32:12 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de)
2024-03-07 14:32:35 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 14:33:04 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 14:40:17 +0100notzmv(~daniel@user/notzmv) (Read error: Connection reset by peer)
2024-03-07 14:40:42 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection)
2024-03-07 14:41:05 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2024-03-07 14:43:41 +0100notzmv(~daniel@user/notzmv)
2024-03-07 14:46:27 +0100bontaq``(~user@ool-45779c03.dyn.optonline.net)
2024-03-07 14:47:13 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds)
2024-03-07 14:47:47 +0100bwe(~bwe@2a01:4f8:1c1c:4878::2)
2024-03-07 14:48:21 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 14:50:05 +0100misterfish(~misterfis@84.53.85.146) (Ping timeout: 268 seconds)
2024-03-07 14:50:10 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de)
2024-03-07 14:54:41 +0100danse-nr3(~danse@151.43.155.172) (Ping timeout: 252 seconds)
2024-03-07 14:55:28 +0100danse-nr3(~danse@151.43.155.172)
2024-03-07 14:55:48 +0100 <bwe> Hi, how do I collect errors with Applicative and Monad instances using Semigroup? How do I use the Applicative instance correctly? How do I need to define the Monad instance to NOT short-circuit? https://gist.github.com/benjaminweb/fef460aad1e799f415e25389f9c13783
2024-03-07 14:57:44 +0100zetef(~quassel@95.77.17.251)
2024-03-07 15:04:45 +0100alexherbo2(~alexherbo@2a02-8440-3241-19d1-2046-7c34-1287-cba1.rev.sfr.net)
2024-03-07 15:09:39 +0100 <danse-nr3> hmm why does it have to be applicative? Maybe you want a reader monad where errors get collected
2024-03-07 15:10:16 +0100 <[Leary]> bwe: In the error case for `Monad (Either e)` you have an `e` and an `a -> Either e b`; there's no choice but to stop. You can either restrict yourself to Applicative (see 'validation') or use a Monad that may still produce output even when there are errors (see 'monad-chronicle').
2024-03-07 15:13:42 +0100 <danse-nr3> huh i meant to write "writer monad" ... and i guess i did not get the context of your question. The chronicle monad looks fun though
2024-03-07 15:14:45 +0100 <[Leary]> Re `sumAll`/`caller`, I think you want `caller = (\a b c -> a + b + c) <$> f1 <*> f2 <*> f3`.
2024-03-07 15:26:06 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 15:26:06 +0100 <bwe> [Leary]: I have functions `f :: a -> b -> c -> Errors [Text] d`. `caller = (\a b c -> f a b c) <$> f1 <*> f2 <*> f3`.
2024-03-07 15:26:21 +0100 <bwe> f1 :: Errors [Text] Int
2024-03-07 15:26:23 +0100euleritian(~euleritia@77.22.252.56)
2024-03-07 15:26:28 +0100danse-nr3(~danse@151.43.155.172) (Ping timeout: 268 seconds)
2024-03-07 15:26:45 +0100 <bwe> f :: a -> b -> c -> Errors [Text] d
2024-03-07 15:26:55 +0100 <bwe> caller :: Errors [Text] Int
2024-03-07 15:27:13 +0100 <bwe> Can I get away with only Applicative?
2024-03-07 15:27:50 +0100 <bwe> [Leary]: calling `f` in the lambda does not compile for me.
2024-03-07 15:28:26 +0100danse-nr3(~danse@151.43.155.172)
2024-03-07 15:29:50 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 15:30:39 +0100fmd(~fmd@user/framend)
2024-03-07 15:31:55 +0100alexherbo2(~alexherbo@2a02-8440-3241-19d1-2046-7c34-1287-cba1.rev.sfr.net) (Remote host closed the connection)
2024-03-07 15:33:16 +0100alexherbo2(~alexherbo@2a02-8440-3241-19d1-6ced-529c-e3c8-d34a.rev.sfr.net)
2024-03-07 15:34:12 +0100 <[Leary]> Nope---you'll end up with `Errors [Text] (Errors [Text] d)`. Collapsing that down to `Errors [Text] d` is precisely what Monad is for. Forgetting about typeclasses for a moment, if what you have on hand is only `Left outerErrs`, the inner errors never even happen, so there's no sense in trying to merge them in.
2024-03-07 15:34:47 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds)
2024-03-07 15:34:58 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2024-03-07 15:35:07 +0100 <bwe> [Leary]: so, it's actually a nice example for bumping into Monad -- I had this feeling yesterday.
2024-03-07 15:36:03 +0100marinelli(~weechat@gateway/tor-sasl/marinelli) (Quit: marinelli)
2024-03-07 15:36:45 +0100alexherbo2(~alexherbo@2a02-8440-3241-19d1-6ced-529c-e3c8-d34a.rev.sfr.net) (Remote host closed the connection)
2024-03-07 15:36:48 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2024-03-07 15:37:12 +0100tr_ev(~trev@user/trev)
2024-03-07 15:37:26 +0100 <bwe> [Leary]: I am not sure whether I've got you right: Can I implement a Monad that does not break execution on encountering first error?
2024-03-07 15:37:48 +0100 <bwe> [Leary]: What do I really want here?
2024-03-07 15:37:58 +0100__monty__(~toonn@user/toonn) (Ping timeout: 255 seconds)
2024-03-07 15:39:52 +0100 <probie> bwe: Only if your "monad" can effectively implement `m () -> (a -> m b) -> m b`
2024-03-07 15:39:58 +0100__monty__(~toonn@user/toonn)
2024-03-07 15:41:06 +0100 <[Leary]> You can, but not on top of Either. As I said above, see 'monad-chronicle' <https://hackage.haskell.org/package/monad-chronicle> or even just Writer.
2024-03-07 15:42:43 +0100 <danse-nr3> yeah i think the issue here is trying to build on top of Either. I vaguely recall the concept of a "logger monad", but not sure what it has different from a writer
2024-03-07 15:43:26 +0100euleritian(~euleritia@77.22.252.56) (Ping timeout: 268 seconds)
2024-03-07 15:43:29 +0100 <bwe> [Leary]: so what is https://hackage.haskell.org/package/monad-validate-1.3.0.0/docs/Control-Monad-Validate.html doing, then?
2024-03-07 15:43:52 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Quit: CiaoSen)
2024-03-07 15:44:22 +0100 <[Leary]> Something fancier. Ignore it for now.
2024-03-07 15:44:44 +0100 <bwe> [Leary]: https://hackage.haskell.org/package/validation is only Applicative, hence it does not cover the Monad case I need.
2024-03-07 15:45:28 +0100 <bwe> [Leary]: …still trying to grasp what `these` does.
2024-03-07 15:45:40 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de)
2024-03-07 15:45:48 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03)
2024-03-07 15:48:01 +0100__monty__(~toonn@user/toonn) (Ping timeout: 272 seconds)
2024-03-07 15:50:22 +0100 <bwe> why do I need either-or-both data type to collect errors? I am fine with not getting the result value if there are any errors AS LONG AS I get all the errors and execution is not short-circuited (except for those functions that need intermediary values that could not be produced).
2024-03-07 15:51:01 +0100tr_ev(~trev@user/trev) (Quit: tr_ev)
2024-03-07 15:51:16 +0100 <bwe> [Leary]: I've looked into the tests of `these` to get some idea, but I couldn't spot any examples that are simple and explain the usage for me.
2024-03-07 15:51:57 +0100cfricke(~cfricke@user/cfricke) (Quit: WeeChat 4.1.2)
2024-03-07 15:52:38 +0100 <danse-nr3> these and These seem an unrelated topic
2024-03-07 15:52:57 +0100 <bwe> so, what do I need then?
2024-03-07 15:53:10 +0100 <glguy> You need These so you can collect intermediate errors without short circuiting
2024-03-07 15:54:17 +0100 <danse-nr3> hmm maybe they came in the conversation while i was offline. Makes sense now
2024-03-07 15:56:53 +0100 <bwe> ok, these and monad-chronicle are different animals - which do I want? or better, what's even simpler? is it just a writer monad?
2024-03-07 15:59:32 +0100 <bwe> glguy: and why do I need for not short circuiting either-or-both? I get that the Monad short circuits for `Left e` case. For `Right b` we did not encounter an error at all.
2024-03-07 15:59:41 +0100misterfish(~misterfis@87.215.131.98)
2024-03-07 16:00:20 +0100 <bwe> So we'd need a thing that holds the error and continues the computation, is that right?
2024-03-07 16:01:41 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 16:02:06 +0100 <danse-nr3> well i guess there would be recoverable errors (These a b) and not-recoverable ones (This a). Probably chronicle abstracts over a writer you could roll by yourself
2024-03-07 16:02:26 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 16:03:45 +0100jau_(~user@134.101.168.5.dynamic-pppoe.dt.ipv4.wtnet.de)
2024-03-07 16:06:12 +0100jau(~user@2a04:4540:7212:6d00:e5f3:df01:adee:2cc8) (Ping timeout: 256 seconds)
2024-03-07 16:06:46 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 256 seconds)
2024-03-07 16:08:43 +0100 <glguy> bwe: like your said, Left short circuits. Left also carries errors. If you want error and not short circuit you need Both
2024-03-07 16:09:33 +0100 <glguy> I'm the case of Both the result is probably incomplete or wrong (when you're using it for error tracking like this) but that's up to how you've structured your program
2024-03-07 16:10:56 +0100 <danse-nr3> was not familiar with Both. Seems equivalent to These
2024-03-07 16:11:57 +0100 <danse-nr3> although probably better named :P
2024-03-07 16:12:35 +0100 <glguy> I don't remember the name
2024-03-07 16:13:08 +0100 <glguy> Oh, it's These not Both
2024-03-07 16:13:25 +0100 <glguy> But anyway, the thing that was both types
2024-03-07 16:13:58 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.1.1)
2024-03-07 16:18:43 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2024-03-07 16:18:53 +0100 <haskellbridge> <e​ldritchcookie> hello what is preferred a quantified constraint or a new method ?
2024-03-07 16:19:24 +0100 <haskellbridge> <e​ldritchcookie> compdata has a HFunctor type
2024-03-07 16:19:43 +0100 <haskellbridge> <e​ldritchcookie> *type class
2024-03-07 16:21:28 +0100 <haskellbridge> <e​ldritchcookie> and it seems to me that by the definition it should have a quantified constraint forall f. Functor f => Functor (hf f)
2024-03-07 16:26:58 +0100 <bwe> glguy: Alright, if `These a b` collects errors, it can't produce `b` result value. So, what happens then? Will it be swapped to `This a` once an unrecoverable error occurs, i.e. no further computation can be done, hence `b` can't be produced.
2024-03-07 16:31:00 +0100 <glguy> Yeah, swap to the no result only error case and short circuit
2024-03-07 16:35:04 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Remote host closed the connection)
2024-03-07 16:35:12 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 16:45:00 +0100puke(~puke@user/puke) (Remote host closed the connection)
2024-03-07 16:45:23 +0100puke(~puke@user/puke)
2024-03-07 16:47:22 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 246 seconds)
2024-03-07 16:49:06 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 268 seconds)
2024-03-07 16:49:20 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 16:55:22 +0100euleritian(~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer)
2024-03-07 16:55:41 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 16:58:26 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 252 seconds)
2024-03-07 16:59:35 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
2024-03-07 16:59:47 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2024-03-07 17:00:34 +0100misterfish(~misterfis@87.215.131.98) (Ping timeout: 264 seconds)
2024-03-07 17:00:40 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 17:01:27 +0100euphores(~SASL_euph@user/euphores) (Quit: Leaving.)
2024-03-07 17:03:41 +0100srz(~srz@181.228.49.93) (Ping timeout: 240 seconds)
2024-03-07 17:04:05 +0100euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
2024-03-07 17:05:37 +0100danse-nr3(~danse@151.43.155.172) (Read error: Connection reset by peer)
2024-03-07 17:05:58 +0100danse-nr3(~danse@151.43.217.59)
2024-03-07 17:08:23 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 264 seconds)
2024-03-07 17:08:59 +0100euphores(~SASL_euph@user/euphores)
2024-03-07 17:11:09 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2024-03-07 17:11:13 +0100igemnace(~ian@user/igemnace) (Quit: WeeChat 4.2.1)
2024-03-07 17:12:31 +0100EvanR_EvanR
2024-03-07 17:13:23 +0100 <bwe> glguy: That's a great start :). My first approach: https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07 . If `f0` gives an error, it can't give a `These a b` value, because there is no `b`. However this `This` leads to short circuit `caller2`. I know I need to have `These a b` instead to not short circuit - but how if I don't have value `b`?
2024-03-07 17:18:28 +0100 <danse-nr3> then it is a not-recoverable error, i guess
2024-03-07 17:19:19 +0100 <glguy> bwe: You'll need to restructure your program so that it doesn't immediately depend on an unrecoverable error f0
2024-03-07 17:19:51 +0100 <glguy> if you have: do x <- f0; ..., then the whole ... depends on there being some x value
2024-03-07 17:20:06 +0100 <glguy> If you're saying the whole thing depends on the result and you do'nt have one, then certainly that's when things stop
2024-03-07 17:21:50 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 260 seconds)
2024-03-07 17:22:34 +0100causal(~eric@50.35.85.7) (Quit: WeeChat 4.1.1)
2024-03-07 17:22:37 +0100arahael(~arahael@119-18-0-146.771200.syd.nbn.aussiebb.net) (Ping timeout: 264 seconds)
2024-03-07 17:23:28 +0100 <dminuoso> bwe: So what I might want, is rather than shoehorning it into some monadic type like These, I would have some ambient `Env` data type with say `data Env = Env { warnings :: IORef [Warning], errors :: IORef [Error] }`, and then instead of using a singular >>, I would then develop a toolset of combinators that maybe shortcircuit or not, or maybe set errors (that at some later stage become fatal)
2024-03-07 17:23:29 +0100 <dminuoso> while producing some default values (such that you can continue on and collect more errors)
2024-03-07 17:23:35 +0100 <glguy> Two of your choices (maybe there are some more) are to either make up a value and report the error like the restricted sumAll could return the too-big number and record the error about it
2024-03-07 17:23:52 +0100 <glguy> or to not use Monad for piecing together parts that are independent
2024-03-07 17:24:01 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2024-03-07 17:24:27 +0100 <glguy> Switching to using IO won't change the problems you have to solve
2024-03-07 17:24:57 +0100 <glguy> it's just a different mechanism for storing the errors
2024-03-07 17:25:52 +0100 <bwe> Well, I am thinking of just making inputs and outputs same: Errors [Text] Int -> Errors [Text] Int
2024-03-07 17:26:04 +0100 <EvanR> STM can be nice for piecing together parts that are independent
2024-03-07 17:26:09 +0100 <EvanR> STM all the things
2024-03-07 17:26:36 +0100 <glguy> It's not obvious to me how STM helps in this case of validation and error gathering, but it's certainly useful in general
2024-03-07 17:26:54 +0100 <EvanR> didn't read the context sorry
2024-03-07 17:27:14 +0100 <dminuoso> glguy: Oh it can actually simplify things since it gives you sequentiality, possibility of diagnostics - and the question of "errors" (fatal, or fatal at some delayed time) is a matter of simple `IO a -> IO b -> IO b` combinators.
2024-03-07 17:27:15 +0100 <glguy> bwe: you should be able to build what you want not using any typeclasses at all
2024-03-07 17:27:28 +0100 <glguy> dminuoso: No, I don't think it changes the problem in any way
2024-03-07 17:27:51 +0100 <dminuoso> glguy: Well, it does for me *shrugs*.
2024-03-07 17:27:54 +0100 <glguy> You still have to deal with all the same questions
2024-03-07 17:28:29 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Read error: Connection reset by peer)
2024-03-07 17:28:50 +0100 <bwe> Let's simplify: I've got two feeder functions `f1` and `f2`. Both get called before `final` which consumes both. If `f1` and `f2` raise an error, both should be returned. In that case `final` cannot be called. If they don't raise an error, `final` might.
2024-03-07 17:29:12 +0100 <glguy> bwe: try writing what you want directly
2024-03-07 17:29:18 +0100 <glguy> just write some functions that do the thing you want
2024-03-07 17:29:23 +0100 <dminuoso> The point really is, rather than trying to encode special error behavior into a type, its easier to just encode it into a simple `case-of` one way or another.
2024-03-07 17:29:40 +0100 <dminuoso> So I guess we're after the same thing here, glguy.
2024-03-07 17:30:05 +0100 <glguy> once you have it working "manually" you can look to see if the behaviors you desire correspond to any of the premade stuff
2024-03-07 17:30:21 +0100 <glguy> you'll get more clarity about how it should work at all that way
2024-03-07 17:31:09 +0100 <glguy> What you're doing seems "obvious" to me because I've already done it manually before
2024-03-07 17:32:33 +0100 <glguy> after that you'll probably find correspondence between things you've done in your manual code inside things like the Monad instances for the Validate and These types and you'll be more prepared recognize the patterns
2024-03-07 17:33:34 +0100 <bwe> glguy: does that include the case idea by dminuoso?
2024-03-07 17:33:45 +0100 <EvanR> does "parse don't validate" apply
2024-03-07 17:34:24 +0100 <glguy> bwe: If writing out your own cases on the different constructors is dminuoso's idea, then yes
2024-03-07 17:34:46 +0100 <dminuoso> EvanR: So in our SDN compiler we can do both. Its just that that most types here have a UselessDefault instance we can use to make up nonsense values for no purpose other than to carry on to collect further errors.
2024-03-07 17:34:55 +0100 <glguy> EvanR: I think that's the space we're in, but usually that phrase means you shouldn't just check a value is good, you should transform it into a type that only holds good values
2024-03-07 17:34:59 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 17:35:10 +0100 <glguy> EvanR: in this case the topic is that along the way we'd like to provide as much feedback as possible
2024-03-07 17:35:16 +0100 <dminuoso> (And they are special values that are identified in assertion passes, just to make sure we dont accidentally leak them out)
2024-03-07 17:35:25 +0100 <glguy> so don't abort parsing any earlier than you absolutely have ot
2024-03-07 17:35:43 +0100 <EvanR> yeah, find more problems with the input than 1
2024-03-07 17:35:46 +0100 <EvanR> potentially
2024-03-07 17:36:06 +0100 <glguy> sometimes you find errors that only happened *because* you didn't stop at the first error, but ideally that's the less common case :)
2024-03-07 17:36:11 +0100 <dminuoso> And by module structure, you generally cant accidentally conjure "non-sense values" here other than by `configErrorDef` which automatically sets a fatal error in the compiler environment.
2024-03-07 17:36:21 +0100 <dminuoso> So.. does that satisfy "parse dont validate"? Id say sure.
2024-03-07 17:36:50 +0100 <c_wraith> glguy: it's not less common when using C++! I had GCC report several thousand errors in a hundred line program because of one missing semicolon!
2024-03-07 17:36:52 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 260 seconds)
2024-03-07 17:37:47 +0100 <dminuoso> c_wraith: It's a difficult thing to have parser work with incorrect syntax I supose.
2024-03-07 17:38:24 +0100 <dminuoso> My feeling says there has got to be published research on "recovering" after syntax errors.
2024-03-07 17:38:26 +0100 <c_wraith> dminuoso: also when templates get involved, they can really make your syntax errors happen replicate over and over.
2024-03-07 17:39:36 +0100 <c_wraith> dminuoso: have you use uu-parsinglib? It's an interesting experiment. In the case of parse errors, it reports the error then proceeds as if it had found whatever it was expecting.
2024-03-07 17:40:47 +0100 <dminuoso> Ah another output of Utrecht, it is quite interesting how much research is done in NL.
2024-03-07 17:47:36 +0100 <danse-nr3> supporting science since galileo's times
2024-03-07 17:53:27 +0100 <bwe> glguy, dminuoso: https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07#file-mylib-hs-L36-L47
2024-03-07 17:54:05 +0100 <glguy> bwe: looks like you kind of cheated by moving f0 to the bottom, right?
2024-03-07 17:54:36 +0100 <bwe> glguy: earlier, yes; but ignore caller2 as of now, I've changed caller1
2024-03-07 17:54:55 +0100 <dminuoso> That all looks rather.. arbitrary.
2024-03-07 17:55:18 +0100 <dminuoso> This looks like an XY problem.
2024-03-07 17:55:54 +0100 <dminuoso> Without seeing the actual problem domain such that `this`, `that`, `f0`, `f1` and `f2` make any sense, its really tough to give any advice how to approach this.
2024-03-07 17:56:47 +0100 <bwe> Let's simplify: I've got two feeder functions `f1` and `f2`. Both get called before `final` which consumes both. If `f1` and `f2` raise an error, both should be returned. In that case `final` cannot be called. If they don't raise an error, `final` might.
2024-03-07 17:57:04 +0100 <bwe> dminuoso: Well, that's my problem statement I've posted earlier.
2024-03-07 17:57:27 +0100Tuplanolla(~Tuplanoll@91-159-69-59.elisa-laajakaista.fi)
2024-03-07 17:57:40 +0100 <dminuoso> bwe: Write the code exactly like you described it.
2024-03-07 17:58:24 +0100 <dminuoso> Not quite sure what "both should be returend [if f1 and f2 raise an error]" means
2024-03-07 17:58:30 +0100 <dminuoso> both what?
2024-03-07 17:58:41 +0100 <probie> both errors
2024-03-07 17:58:49 +0100 <dminuoso> And if only one returns an error?>
2024-03-07 17:58:54 +0100sidd-dino(~sidd-dino@gateway/tor-sasl/sidd-dino) (Remote host closed the connection)
2024-03-07 17:59:01 +0100 <bwe> any errors of f1 and f2 should be accumulated and returned
2024-03-07 17:59:26 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2024-03-07 18:00:51 +0100 <dminuoso> bwe: Yeah, so in my compiler I have these primitives: https://gist.github.com/dminuoso/421ab94f671c010d213592dc09af82daf
2024-03-07 18:01:15 +0100 <bwe> dminuoso: link is dead
2024-03-07 18:01:16 +0100 <dminuoso> Maybe this approach can help you *shrugs*
2024-03-07 18:01:21 +0100 <dminuoso> Sorry https://gist.github.com/dminuoso/421ab94f671c010d213592dc09af82da
2024-03-07 18:01:31 +0100 <dminuoso> Not sure where that trailing f came from
2024-03-07 18:02:37 +0100 <bwe> glguy: is the current implementation of`caller1` the manual way you meant?
2024-03-07 18:04:16 +0100destituion(~destituio@2a02:2121:650:17b6:2818:3a8c:bceb:d3de)
2024-03-07 18:04:31 +0100 <dminuoso> bwe: Anyway, all of this is only useful if this kind of error handling is a recurring theme for you.
2024-03-07 18:04:41 +0100 <dminuoso> otoh if its a one-off, I wouldnt add a dependency either.
2024-03-07 18:05:23 +0100 <EvanR> halt and catch fire
2024-03-07 18:05:27 +0100 <EvanR> there's your error handling
2024-03-07 18:05:35 +0100 <EvanR> in many trending languages now a days
2024-03-07 18:06:13 +0100 <dminuoso> Ive just become a fan of IO. *shrugs*
2024-03-07 18:06:17 +0100 <dminuoso> It makes so many things so easy.
2024-03-07 18:06:22 +0100 <dminuoso> Collecting state, logging, throwing exceptions...
2024-03-07 18:06:45 +0100 <dminuoso> All the stuff that otherwise introduces large piles of dependency trees, illegible type errors, and unwieldy type signatures.
2024-03-07 18:07:12 +0100 <dminuoso> IO - the forgotten monad.
2024-03-07 18:07:22 +0100 <bwe> What's so hard in accumulating errors? Short circuit only if a function call receives an error value as value. But then return all errors accumulated since.
2024-03-07 18:07:33 +0100 <dminuoso> bwe: Absolutely nothing! I just accumulate them in an IORef!
2024-03-07 18:08:10 +0100 <bwe> I am almost about to escape to write Python!
2024-03-07 18:08:58 +0100 <bwe> dminuoso: why can't this be automatic behaviour in my function using the Monad of that error collecting container?
2024-03-07 18:09:41 +0100 <dminuoso> bwe: what do you mean by "automatic behavior"?
2024-03-07 18:09:46 +0100 <dminuoso> IO *is* that behavior.
2024-03-07 18:10:35 +0100ubert(~Thunderbi@2a02:8109:ab8a:5a00:e52f:c589:18bb:7d17) (Quit: ubert)
2024-03-07 18:10:37 +0100 <bwe> dminuoso: collect error to error stack on error, short-circuit on error used as argument in function call, then return error stack.
2024-03-07 18:10:44 +0100 <bwe> dminuoso: why do I need IO for this?
2024-03-07 18:10:51 +0100 <EvanR> Writer can also be used to accumulate errors
2024-03-07 18:11:23 +0100 <EvanR> if that's all your code is dedicated to doing
2024-03-07 18:11:26 +0100 <bwe> but I mean, what's the recommended way to do this?
2024-03-07 18:12:09 +0100 <EvanR> when you really know what your code is trying to do, you can use the most appropriate abstraction if it exists, or write a custom type
2024-03-07 18:12:17 +0100 <EvanR> which is how GHC works
2024-03-07 18:12:30 +0100redmp(~redmp@mobile-166-171-248-17.mycingular.net)
2024-03-07 18:12:31 +0100 <EvanR> if you don't know what your code is trying to do, IO helps
2024-03-07 18:12:52 +0100 <EvanR> but it's a strictly worse situation to be in
2024-03-07 18:14:25 +0100 <bwe> I need a way to not let the computation to short circuit when feeder functions have errors. I need a way to let the computation short circuit once a value is tried to be consumed that is an error value.
2024-03-07 18:14:38 +0100 <bwe> EvanR: does Writer solve my need here?
2024-03-07 18:14:50 +0100 <EvanR> no I thought you were just trying to accumulate error messages
2024-03-07 18:15:06 +0100 <bwe> EvanR: so, what do I need?
2024-03-07 18:15:14 +0100tzh(~tzh@c-73-164-206-160.hsd1.or.comcast.net)
2024-03-07 18:15:18 +0100 <EvanR> short circuiting? That's Maybe or Either
2024-03-07 18:15:38 +0100 <bwe> glguy: I've searched for some time on gh to find some examples using These to no avail.
2024-03-07 18:16:19 +0100 <bwe> EvanR: We've been through that before, Left of either forces Monad to short circuit on each error. I need it NOT to short circuit on error.
2024-03-07 18:16:28 +0100 <EvanR> > liftA2 (+) (Just 2) (Just 2)
2024-03-07 18:16:30 +0100 <lambdabot> Just 4
2024-03-07 18:16:34 +0100 <EvanR> > liftA2 (+) (Just 2) Nothing
2024-03-07 18:16:35 +0100 <lambdabot> Nothing
2024-03-07 18:16:49 +0100 <EvanR> you want to not short circuit? that's what I thought
2024-03-07 18:16:55 +0100 <glguy> bwe: These has three cases: Short-circuit with error, Don't short-circuit but also error, Don't short-circuit and no error
2024-03-07 18:16:56 +0100L29Ah(~L29Ah@wikipedia/L29Ah) ()
2024-03-07 18:17:20 +0100 <glguy> bwe: Most people probably don't use the "these" package, they just write this stuff out manually. The these package doesn't offer that much benefit as a dependency
2024-03-07 18:17:47 +0100 <bwe> EvanR: https://gist.github.com/benjaminweb/fef460aad1e799f415e25389f9c13783 https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07
2024-03-07 18:17:49 +0100redmp(~redmp@mobile-166-171-248-17.mycingular.net) (Ping timeout: 264 seconds)
2024-03-07 18:18:37 +0100 <bwe> glguy: Don't short-circuit but also error -> previous errors collected on the way didn't prevent from calculating result value.
2024-03-07 18:19:04 +0100 <EvanR> so there's no short circuiting anywhere
2024-03-07 18:19:10 +0100 <glguy> yeah, even if that result value is flawed for the reasons listed in theerrors
2024-03-07 18:19:22 +0100redmp(~redmp@mobile-166-137-178-225.mycingular.net)
2024-03-07 18:19:35 +0100 <glguy> EvanR: I think bwe wants to avoid short-circuiting when possible, but sometimes that's not possible
2024-03-07 18:20:01 +0100 <bwe> glguy: sometimes: a function tries to use a value that couldn't been produced, i.e. is an error value.
2024-03-07 18:20:19 +0100 <glguy> bwe: in that case you want to short-circuit
2024-03-07 18:20:30 +0100 <bwe> glguy: exactly
2024-03-07 18:20:45 +0100 <EvanR> here's another pattern
2024-03-07 18:20:50 +0100 <EvanR> :t partition
2024-03-07 18:20:51 +0100 <lambdabot> (a -> Bool) -> [a] -> ([a], [a])
2024-03-07 18:20:57 +0100 <EvanR> :t partitionEithers
2024-03-07 18:20:58 +0100 <lambdabot> [Either a b] -> ([a], [b])
2024-03-07 18:21:18 +0100 <EvanR> if you analyize a list of things into yes values and no errors, you can sort them and use the yes values, and have the errors
2024-03-07 18:22:01 +0100 <bwe> glguy: but what if `c` gets produced before `f` is called (that takes in `a` and `b`) - in that case c has an error?
2024-03-07 18:22:27 +0100 <bwe> glguy: we can result a `These [c] d` -- d being result of f
2024-03-07 18:23:23 +0100danse-nr3(~danse@151.43.217.59) (Ping timeout: 264 seconds)
2024-03-07 18:23:46 +0100chele(~chele@user/chele) (Remote host closed the connection)
2024-03-07 18:24:43 +0100manwithluck(manwithluc@gateway/vpn/protonvpn/manwithluck) (Ping timeout: 260 seconds)
2024-03-07 18:25:09 +0100 <glguy> I'm lost in the alphabet, I think
2024-03-07 18:25:21 +0100manwithluck(manwithluc@gateway/vpn/protonvpn/manwithluck)
2024-03-07 18:25:42 +0100 <glguy> But if f is a function, and it *depends* on a previous computation succeeding because it needs that result to be the function argument, then obviously it can only work if there's a function argument
2024-03-07 18:25:52 +0100notzmv(~daniel@user/notzmv) (Ping timeout: 260 seconds)
2024-03-07 18:26:05 +0100 <glguy> If it could work without one then it shouldn't be a function
2024-03-07 18:26:38 +0100 <ncf> abcdef[you are here]hij
2024-03-07 18:30:25 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 18:31:37 +0100econo_(uid147250@id-147250.tinside.irccloud.com)
2024-03-07 18:34:48 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 255 seconds)
2024-03-07 18:35:51 +0100rvalue(~rvalue@user/rvalue) (Ping timeout: 272 seconds)
2024-03-07 18:39:47 +0100 <bwe> https://gist.github.com/benjaminweb/9a9664625f2ba30d14fc0a338dc8a601 <- desired behaviour is described with tests and comments.
2024-03-07 18:40:00 +0100 <bwe> (I am persevering…)
2024-03-07 18:40:15 +0100notzmv(~daniel@user/notzmv)
2024-03-07 18:42:29 +0100 <bwe> What I want is that the Monad handles that for me.
2024-03-07 18:43:01 +0100 <glguy> bwe: these are examples I'm imagining https://gist.github.com/glguy/e048cf88a20b2fad8df1917bcc1538b9
2024-03-07 18:43:09 +0100 <glguy> When it comes to a Monad helping you, you will need to use two different types
2024-03-07 18:43:28 +0100 <glguy> One is a Monad that short-circuits and another is merely an Applicative that perseveres
2024-03-07 18:43:55 +0100 <glguy> The Monad will never be able to persevere in the face of a fatal error
2024-03-07 18:44:13 +0100Square(~Square@user/square)
2024-03-07 18:44:14 +0100 <glguy> because >>= has a function that relies on there being an argument to apply the function to
2024-03-07 18:44:48 +0100 <glguy> but an applicative <*> can gather up errors from both of its arguments
2024-03-07 18:45:16 +0100 <bwe> ah. I want applicative behaviour from a monad. that causes the frustration.
2024-03-07 18:45:31 +0100 <glguy> or if you don't want to use two types, don't make your thing a monad but provide a manual, non >>= function that does what >>= for when you wanted that behavior
2024-03-07 18:45:41 +0100rvalue(~rvalue@user/rvalue)
2024-03-07 18:46:24 +0100 <bwe> glguy: are you getting the idea of what I am trying to accomplish with my last gist?
2024-03-07 18:47:07 +0100 <glguy> bwe: the thing you want on line 18 is too magical for you to get it using Monad
2024-03-07 18:47:47 +0100 <glguy> You made line 18 "need" c by virtue of you putting it below line 17
2024-03-07 18:48:47 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2024-03-07 18:49:56 +0100 <haskellbridge> <e​ldritchcookie> uh don't you want callCC?
2024-03-07 18:50:11 +0100 <bwe> glguy: Fine. So delete line 17. if 15 (a) is an error, b should still be processed. short circuit only once `f` tries to pull in `a` and `b`.i
2024-03-07 18:50:39 +0100 <glguy> bwe: if you write a <- getA; ...
2024-03-07 18:50:48 +0100 <glguy> then everything after that depends on a
2024-03-07 18:51:11 +0100 <glguy> If you want that not to be true you need to not use a Monad. You could still get do-notation using ApplicativeDo
2024-03-07 18:51:33 +0100 <bwe> glguy: so ApplicativeDo is what I need
2024-03-07 18:52:13 +0100 <glguy> bwe: using applicativedo to do this kind of validation is what I'm using here https://glguy.net/config-demo/
2024-03-07 18:52:38 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 18:53:11 +0100 <bwe> glguy: does These take care of accumulating the errors on the way using ApplicativeDo?
2024-03-07 18:53:24 +0100 <glguy> bwe: no, because it has a Monad instance
2024-03-07 18:53:37 +0100 <glguy> and an Applicative instance needs to agree with the Monad instance
2024-03-07 18:53:42 +0100 <bwe> glguy: so, I shouldn't use These for my situation, right?
2024-03-07 18:54:17 +0100 <glguy> You shouldn't use These with ApplicativeDo. for that you'd need a different type or just a newtype around These for when you're doing the do-notation parts
2024-03-07 18:56:33 +0100 <bwe> what do I need then to have the errors accumulate? and short circuiting only once the function tries to use a value that is an error value should be default, or?
2024-03-07 18:57:10 +0100drdo8(~drdo@bl5-29-74.dsl.telepac.pt)
2024-03-07 18:57:50 +0100 <haskellbridge> <e​ldritchcookie> uh why are the semantics of MonadThrow wrong for your use case?
2024-03-07 18:57:51 +0100drdo(~drdo@bl5-29-74.dsl.telepac.pt) (Ping timeout: 260 seconds)
2024-03-07 18:57:51 +0100drdo8drdo
2024-03-07 19:01:55 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 19:02:56 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 19:03:19 +0100srz(~srz@181.228.49.93)
2024-03-07 19:03:27 +0100thailigur(~thailigur@94.182.126.244)
2024-03-07 19:03:39 +0100 <ncf> your monadic sequencing is expressing that the computation `f a b` might depend on the values of a, b, and c. you can't really detect that `f a b` isn't using c within the Monad interface
2024-03-07 19:03:59 +0100 <ncf> you'd have to somehow parallelise A+B and C
2024-03-07 19:05:14 +0100 <dolio> It doesn't matter that `f a b` doesn't. The overall computation does.
2024-03-07 19:06:07 +0100eldritch_cookie(~Srain@177.132.38.123)
2024-03-07 19:06:40 +0100 <eldritch_cookie> hello apparently the matrix bridge is broken so i was just screaming into the void...
2024-03-07 19:06:53 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 240 seconds)
2024-03-07 19:07:03 +0100 <glguy> eldritch_cookie: your message about MonadThrow came through
2024-03-07 19:07:31 +0100 <glguy> and then an earlier one about callCC, but I don't know what either had to do with bwe's question
2024-03-07 19:08:09 +0100zetef(~quassel@95.77.17.251) (Ping timeout: 272 seconds)
2024-03-07 19:08:59 +0100 <haskellbridge> <e​ldritchcookie> ok ??? isn't the problem that he wants shortcircuit evaluation??
2024-03-07 19:09:05 +0100 <haskellbridge> <g​eekosaur> your messages appeaed on both sides of the bridge; what did you think went wrong?
2024-03-07 19:10:36 +0100 <glguy> eldritch_cookie: the overall topic is about avoiding short-circuiting when possible
2024-03-07 19:10:37 +0100bontaq```(~user@165.1.205.230)
2024-03-07 19:11:01 +0100 <haskellbridge> <e​ldritchcookie> huh?
2024-03-07 19:11:14 +0100 <haskellbridge> <e​ldritchcookie> doesn't void $ getC work?
2024-03-07 19:11:49 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2024-03-07 19:11:54 +0100 <haskellbridge> <e​ldritchcookie> i see no reason why you would call getC not use its bound value and not want any side effects?
2024-03-07 19:12:14 +0100bontaq``(~user@ool-45779c03.dyn.optonline.net) (Read error: Connection reset by peer)
2024-03-07 19:13:56 +0100 <haskellbridge> <e​ldritchcookie> geekousaur: i my earlier message was ignored, i then read the text on the top of the screen so i just assumed my message never went through,
2024-03-07 19:15:59 +0100bontaq```(~user@165.1.205.230) (Ping timeout: 256 seconds)
2024-03-07 19:16:04 +0100 <haskellbridge> <e​ldritchcookie> i guess i was having the wrong expectations on discord even if you don't understand why it isn't related to the conversation you still respond
2024-03-07 19:19:46 +0100target_i(~target_i@user/target-i/x-6023099)
2024-03-07 19:21:36 +0100gmg(~user@user/gehmehgeh) (Quit: Leaving)
2024-03-07 19:21:41 +0100thailigur(~thailigur@94.182.126.244) (Quit: Client closed)
2024-03-07 19:28:58 +0100waleee(~waleee@h-176-10-144-38.NA.cust.bahnhof.se)
2024-03-07 19:31:04 +0100euphores(~SASL_euph@user/euphores) (Ping timeout: 255 seconds)
2024-03-07 19:32:25 +0100CiaoSen(~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Ping timeout: 256 seconds)
2024-03-07 19:37:26 +0100euphores(~SASL_euph@user/euphores)
2024-03-07 19:50:05 +0100srz(~srz@181.228.49.93) (Ping timeout: 240 seconds)
2024-03-07 19:50:08 +0100 <dminuoso> 17:12:52 EvanR │ but it's a strictly worse situation to be in
2024-03-07 19:50:39 +0100 <EvanR> not knowing what you're supposed to be doing, not IO
2024-03-07 19:50:39 +0100 <dminuoso> I somewhat disagree with that. Shoehorning all your effects into the type system just to avoid that general IO type seems more like a religious choice, especially because of all the pain that it often entails.
2024-03-07 19:51:02 +0100 <dminuoso> The effects are either simple and non-composable, or they are composable and very complicated.
2024-03-07 19:51:22 +0100 <dminuoso> Simple and composable effects is not something we have in Haskell.
2024-03-07 19:51:42 +0100 <EvanR> on all the advanced solutions to do stuff in IO it seems a lot of times just IO would be simpler
2024-03-07 19:51:55 +0100 <EvanR> but when IO is not involved I don't know
2024-03-07 19:51:56 +0100 <monochrom> https://www.vex.net/~trebla/haskell/exception.xhtml :)
2024-03-07 19:54:02 +0100 <haskellbridge> <e​ldritchcookie> dminuoso: i will have to disagree, i find Effectful quite simple, though if you want to escape IO with it you need a lot of boilerplate
2024-03-07 19:54:39 +0100 <haskellbridge> <e​ldritchcookie> https://hackage.haskell.org/package/effectful
2024-03-07 19:56:24 +0100destituion(~destituio@2a02:2121:650:17b6:2818:3a8c:bceb:d3de) (Ping timeout: 260 seconds)
2024-03-07 19:56:39 +0100srz(~srz@181.228.49.93)
2024-03-07 19:57:53 +0100srz(~srz@181.228.49.93) (Remote host closed the connection)
2024-03-07 19:58:29 +0100 <monochrom> I'm going to go on a hyperbole and say that I find category theory quite simple too. To prove that if I forgot how much maturity I needed before higher abstractions became simple to me, I would end up giving very derailing advice to beginners.
2024-03-07 19:59:40 +0100 <monochrom> (I spent a year on universal algebra before I heard of category theory. So yeah of course the latter looks so obvious under the circumstance.)
2024-03-07 20:00:09 +0100 <int-e> monochrom: "To understand Haskell, you must first understand adjunctions."
2024-03-07 20:00:15 +0100 <monochrom> hahaha
2024-03-07 20:00:47 +0100 <int-e> (which btw never clicked for me)
2024-03-07 20:01:06 +0100srz(~srz@181.228.49.93)
2024-03-07 20:01:21 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 20:02:01 +0100srz(~srz@181.228.49.93) (Remote host closed the connection)
2024-03-07 20:02:47 +0100 <monochrom> I also spent a year on lattice theory and Galois adjunctions before I heard of category theory. Even then, I avoided learning category's adjunction (because I hadn't needed it for a long time) until recently.
2024-03-07 20:03:39 +0100 <monochrom> (Galois adjunction just means the two categories are just partial orders, so everything is simpler and a few things trivialized.)
2024-03-07 20:04:48 +0100 <monochrom> The paper that finally demanded me to finally learn category's adjunctions seriously is Ralf Hinze's Adjoint Folds And Unfolds.
2024-03-07 20:05:30 +0100 <monochrom> Oh it also uses Yoneda lemma and Kan extensions and ends and coends, so I am going into that rabbit hole these few weeks.
2024-03-07 20:05:58 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds)
2024-03-07 20:06:52 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Remote host closed the connection)
2024-03-07 20:07:15 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
2024-03-07 20:10:50 +0100misterfish(~misterfis@84.53.85.146)
2024-03-07 20:27:18 +0100 <haskellbridge> <e​ldritchcookie> hourglass has 3500 indirect reverse dependencies and not only is it abandoned it doesn't compile on GHC 9.8
2024-03-07 20:27:26 +0100 <haskellbridge> <e​ldritchcookie> fun
2024-03-07 20:27:40 +0100misterfish(~misterfis@84.53.85.146) (Ping timeout: 260 seconds)
2024-03-07 20:40:47 +0100 <tomsmeding> @hackage acme-everything
2024-03-07 20:40:47 +0100 <lambdabot> https://hackage.haskell.org/package/acme-everything
2024-03-07 20:41:03 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 20:48:31 +0100 <haskellbridge> <e​ldritchcookie> is that supposed to be relevant to my message, i don't think i know how? i am just annoyed that i can't compile hoogle because tls doesn't compile due to a transitive dependency on hourglass
2024-03-07 20:49:43 +0100komikat_(~akshitkr@218.185.248.66)
2024-03-07 20:50:06 +0100komikat(~akshitkr@218.185.248.66) (Read error: Connection reset by peer)
2024-03-07 20:57:56 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 268 seconds)
2024-03-07 20:59:45 +0100jmdaemon(~jmdaemon@user/jmdaemon)
2024-03-07 21:02:35 +0100srz(~srz@181.228.49.93)
2024-03-07 21:03:52 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 21:04:45 +0100 <int-e> worksforme(tm)
2024-03-07 21:05:23 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 264 seconds)
2024-03-07 21:06:10 +0100 <int-e> (ignoring the fact that filepath-1.5 breaks stuff and it builds an older version instead)
2024-03-07 21:06:46 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
2024-03-07 21:09:05 +0100dsrt^(~cd@c-98-242-74-66.hsd1.ga.comcast.net)
2024-03-07 21:16:24 +0100wootehfoot(~wootehfoo@user/wootehfoot)
2024-03-07 21:16:24 +0100Guest0(~Guest0@129.170.197.184)
2024-03-07 21:17:32 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2024-03-07 21:20:22 +0100 <Guest0> I’ve been looking into the trace function for debugging, and I found out that writing some code like this:
2024-03-07 21:20:22 +0100 <Guest0>  myfun a b | trace ("foo " ++ show a ++ " " ++ show b) debug = a + b
2024-03-07 21:20:23 +0100 <Guest0> allows me to print a message whenever some variable called debug is set to True. However, I would like to look into why this works on a conceptual level - if anyone knows the general name for the technique being used to make trace a third parameter of sorts (?), that would be really helpful
2024-03-07 21:21:08 +0100 <int-e> that doesn't look right
2024-03-07 21:21:45 +0100 <int-e> the way it's written, the message will be printed, the guard will evaluate to false and the rhs a + b won't be used.
2024-03-07 21:21:54 +0100ft(~ft@p508db2e6.dip0.t-ipconnect.de)
2024-03-07 21:21:55 +0100 <int-e> if debug = False
2024-03-07 21:22:12 +0100 <Guest0> It's set to true
2024-03-07 21:22:38 +0100 <int-e> well, trace ... True will print ... and then evaluate to True.
2024-03-07 21:22:57 +0100 <int-e> > let x | True = 1 in x
2024-03-07 21:22:58 +0100 <lambdabot> 1
2024-03-07 21:23:24 +0100 <int-e> so it's like that but with a side effect.
2024-03-07 21:24:00 +0100jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds)
2024-03-07 21:25:56 +0100 <Guest0> I see.  So the idea is that if you're pattern matching on a function and the part after the guard evaluates to False, the match for that particular pattern fails
2024-03-07 21:26:23 +0100srz(~srz@181.228.49.93) (Ping timeout: 264 seconds)
2024-03-07 21:26:40 +0100 <geekosaur> it's not the part after the guard, it's the guard itself
2024-03-07 21:27:11 +0100 <int-e> my preferred style of doing this is https://paste.tomsmeding.com/GR8qsVSH -- that way the debug code is easy to comment out
2024-03-07 21:27:11 +0100 <Guest0> Right
2024-03-07 21:27:11 +0100 <geekosaur> and `Debug.Trace.trace msg a` evaluates to `a`, with a side effect of printing `msg`
2024-03-07 21:27:41 +0100 <geekosaur> so a quick hack to trace evaluation of functions is to prefix a failing guard with a trace attached
2024-03-07 21:28:01 +0100 <geekosaur> since the guard fails, evaluation falls through to the actual function
2024-03-07 21:28:33 +0100 <int-e> (and using tuples and traceShow saves a bunch of `++` and `show` at the expense of a tiny bit of readability)
2024-03-07 21:28:45 +0100 <tomsmeding> eldritchcookie: oh sorry I was missing the context that this is actually something you're running into
2024-03-07 21:29:11 +0100 <tomsmeding> I thought I was replying to a joke with a joke
2024-03-07 21:30:32 +0100 <Guest0> Yeah that definitely looks a lot more clear/readable, thanks for the example
2024-03-07 21:30:54 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 256 seconds)
2024-03-07 21:31:40 +0100Guest0(~Guest0@129.170.197.184) (Quit: Client closed)
2024-03-07 21:35:31 +0100rncwnd(~quassel@2a01:4f8:221:27c6::1) (Ping timeout: 256 seconds)
2024-03-07 21:49:14 +0100chiselfuse(~chiselfus@user/chiselfuse) (Ping timeout: 260 seconds)
2024-03-07 21:50:29 +0100fmd(~fmd@user/framend) (Ping timeout: 240 seconds)
2024-03-07 21:51:18 +0100chiselfuse(~chiselfus@user/chiselfuse)
2024-03-07 21:52:00 +0100rncwnd(~quassel@2a01:4f8:221:27c6::1)
2024-03-07 22:01:14 +0100chiselfuse(~chiselfus@user/chiselfuse) (Remote host closed the connection)
2024-03-07 22:01:29 +0100zetef(~quassel@95.77.17.251)
2024-03-07 22:02:10 +0100chiselfuse(~chiselfus@user/chiselfuse)
2024-03-07 22:04:10 +0100L29Ah(~L29Ah@wikipedia/L29Ah) ()
2024-03-07 22:06:54 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
2024-03-07 22:08:10 +0100zetef_(~quassel@5.2.182.98)
2024-03-07 22:08:13 +0100zetef(~quassel@95.77.17.251) (Ping timeout: 264 seconds)
2024-03-07 22:08:52 +0100alexherbo2(~alexherbo@2a02-8440-3240-c50e-314b-952c-1197-8413.rev.sfr.net)
2024-03-07 22:18:48 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 22:23:51 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 272 seconds)
2024-03-07 22:27:02 +0100alexherbo2(~alexherbo@2a02-8440-3240-c50e-314b-952c-1197-8413.rev.sfr.net) (Remote host closed the connection)
2024-03-07 22:31:49 +0100jau_(~user@134.101.168.5.dynamic-pppoe.dt.ipv4.wtnet.de) (Quit: Leaving)
2024-03-07 22:32:03 +0100ski(~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 260 seconds)
2024-03-07 22:33:25 +0100ski(~ski@ext-1-033.eduroam.chalmers.se)
2024-03-07 22:36:08 +0100wootehfoot(~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
2024-03-07 22:38:43 +0100rncwnd(~quassel@2a01:4f8:221:27c6::1) (Ping timeout: 255 seconds)
2024-03-07 22:39:00 +0100mark`(~user@user/mark/x-6044658)
2024-03-07 22:39:26 +0100mark`(~user@user/mark/x-6044658) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.1))
2024-03-07 22:41:00 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 22:42:01 +0100target_i(~target_i@user/target-i/x-6023099) (Quit: leaving)
2024-03-07 22:47:41 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
2024-03-07 22:48:12 +0100machinedgod(~machinedg@d173-183-246-216.abhsia.telus.net)
2024-03-07 22:51:06 +0100michalz(~michalz@185.246.207.200) (Quit: ZNC 1.8.2 - https://znc.in)
2024-03-07 22:54:43 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 22:57:55 +0100rncwnd(~quassel@2a01:4f8:221:27c6::1)
2024-03-07 23:01:36 +0100noumenon(~noumenon@113.51-175-156.customer.lyse.net)
2024-03-07 23:02:03 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2024-03-07 23:03:24 +0100pavonia(~user@user/siracusa)
2024-03-07 23:04:21 +0100jargon(~jargon@154.sub-174-205-226.myvzw.com)
2024-03-07 23:05:18 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Ping timeout: 260 seconds)
2024-03-07 23:06:16 +0100Katarushisu1(~Katarushi@finc-20-b2-v4wan-169598-cust1799.vm7.cable.virginm.net) (Quit: Ping timeout (120 seconds))
2024-03-07 23:06:58 +0100phma(phma@2001:5b0:211f:bff8:ed6a:61e2:ef0c:3875) (Read error: Connection reset by peer)
2024-03-07 23:08:05 +0100phma(phma@2001:5b0:2172:bea8:4de3:ce84:5b1f:c1a2)
2024-03-07 23:08:52 +0100Katarushisu1(~Katarushi@finc-20-b2-v4wan-169598-cust1799.vm7.cable.virginm.net)
2024-03-07 23:15:23 +0100euphores(~SASL_euph@user/euphores) (Quit: Leaving.)
2024-03-07 23:15:36 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2024-03-07 23:16:03 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 23:19:12 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-03-07 23:20:57 +0100srz(~srz@181.228.49.93)
2024-03-07 23:23:02 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Ping timeout: 260 seconds)
2024-03-07 23:25:01 +0100euphores(~SASL_euph@user/euphores)
2024-03-07 23:25:45 +0100zetef_(~quassel@5.2.182.98) (Remote host closed the connection)
2024-03-07 23:25:46 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2024-03-07 23:29:24 +0100Square3(~Square4@user/square)
2024-03-07 23:31:18 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2024-03-07 23:31:53 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2024-03-07 23:32:16 +0100Square(~Square@user/square) (Ping timeout: 255 seconds)
2024-03-07 23:32:49 +0100tri(~tri@ool-18bbef1a.static.optonline.net)
2024-03-07 23:33:25 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2024-03-07 23:37:10 +0100tri(~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds)
2024-03-07 23:43:02 +0100fmd(~fmd@2a02-8429-4b52-f901-ef8a-cb4a-81a3-e1f5.rev.sfr.net)
2024-03-07 23:45:25 +0100takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2024-03-07 23:49:13 +0100Sgeo(~Sgeo@user/sgeo)