Home liberachat/#haskell: Logs Calendar

Logs on 2023-03-16 (liberachat/#haskell)

00:02:35 freeside joins (~mengwong@103.252.202.85)
00:07:15 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 255 seconds)
00:07:37 ryanbooker joins (uid4340@id-4340.hampstead.irccloud.com)
00:10:52 azimut joins (~azimut@gateway/tor-sasl/azimut)
00:14:49 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 256 seconds)
00:16:25 × Midjak quits (~Midjak@82.66.147.146) (Quit: Leaving)
00:16:25 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
00:16:25 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
00:16:25 wroathe joins (~wroathe@user/wroathe)
00:17:32 × Square2 quits (~Square4@user/square) (Ping timeout: 268 seconds)
00:18:46 × irrgit quits (~irrgit@146.70.27.242) (Ping timeout: 268 seconds)
00:24:55 × mmhat quits (~mmh@p200300f1c715f77cee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
00:25:18 mmhat joins (~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de)
00:25:33 × thegeekinside quits (~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
00:26:36 thegeekinside joins (~thegeekin@189.217.80.156)
00:34:51 × masterbuilder quits (~masterbui@user/masterbuilder) (Ping timeout: 248 seconds)
00:36:53 masterbuilder joins (~masterbui@user/masterbuilder)
00:44:16 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
00:48:59 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
00:50:50 × vglfr quits (~vglfr@37.73.89.236) (Ping timeout: 268 seconds)
00:54:29 mauke_ joins (~mauke@user/mauke)
00:55:51 irrgit_ joins (~irrgit@89.47.234.74)
00:56:22 × mauke quits (~mauke@user/mauke) (Ping timeout: 276 seconds)
00:56:22 mauke_ is now known as mauke
00:56:50 irrgit__ joins (~irrgit@176.113.74.130)
01:00:27 × irrgit_ quits (~irrgit@89.47.234.74) (Ping timeout: 250 seconds)
01:03:05 <jean-paul[m]> What are GHC.Num.Integer.IS, IP, IN? https://gist.github.com/exarkun/db734e5bb8bf6a4ddbf12549aa61f389
01:08:58 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
01:09:32 <c_wraith> that message makes no sense given that definition.
01:10:17 caryhartline joins (~caryhartl@cpe-76-184-32-233.tx.res.rr.com)
01:10:19 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
01:10:43 <c_wraith> the definition isn't matching constructors - it uses a wildcard match. So it's impossible for there to be constructors it's not matching
01:11:44 <jean-paul[m]> glad it's not just me, I guess
01:12:37 <jean-paul[m]> maybe I shouldn't use ghc 9.0.2
01:13:04 <c_wraith> as far as what those constructors are - they represent different cases of arbitrary-sized integers. But that's very internal stuff that you shouldn't need to know unless you're intentionally messing with the internals
01:14:13 <jean-paul[m]> hrm 9.4.0 says the same
01:14:44 <jean-paul[m]> the whole source file is "module CollatzConjecture (collatz) where" plus what's in the pastebin
01:15:01 <c_wraith> and what are you doing with the file?
01:15:57 <jean-paul[m]> stack build w/ this package.yaml - https://gist.github.com/exarkun/db734e5bb8bf6a4ddbf12549aa61f389 (gist updated to add file)
01:16:23 <int-e> jean-paul[m]: the constructors are an implementation detail you shouldn't have to worry about. I'd replace `odd n` by `otherwise`.
01:16:26 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
01:16:27 ddellacosta joins (~ddellacos@146.70.171.100)
01:16:56 <int-e> (The constructurs are, respectively, for small integers (fitting into a single Int), and positive and negative big integers.
01:16:59 <int-e> )
01:17:40 <jean-paul[m]> int-e: is the `otherwise` suggestion related to the warning? or just a general tip?
01:17:44 <int-e> The compiler doesn't understand that one of the final two guards will always match
01:18:02 <c_wraith> it will help with other warnings. not the one you're getting.
01:18:03 <int-e> it relates to the warning; with that change, the pattern will be seen as complete
01:18:28 <jean-paul[m]> so it sees through the pattern match into the guard cases and decides the guard cases are incomplete
01:18:29 <jean-paul[m]> ?
01:18:44 <c_wraith> Oh. That case. That seems silly, but yeah, I see.
01:18:58 <jean-paul[m]> (but if it is so smart why can't it say "guard cases incomplete" instead of "pattern matches non-exhaustive")
01:19:15 <c_wraith> It's not able to determine the pattern matches are complete, so it lists all the *constructors* that potentially won't be matched.
01:19:19 <int-e> No, the reason here is that it's not smart.
01:19:38 <int-e> So it assumes that there are cases where all the guards fail, and then you still have to match the argument.
01:19:50 <int-e> And it just lists all the constructors that the type happens to have.
01:20:08 <int-e> ...as c_wraith just said as well.
01:21:06 <c_wraith> I totally underestimated how weird that warning could get in that case
01:21:41 <jean-paul[m]> oh. hmm. so in general, if a case of a pattern match uses a guard that doesn't match a later pattern gets a chance at it?
01:21:42 <jean-paul[m]> I don't think I appreciated that fact.
01:21:51 <c_wraith> yes, that's true.
01:22:07 <c_wraith> patterns and guards are checked top to bottom, with fall-through
01:22:30 <int-e> > let f n | odd n = "odd"; f 0 = "zero"; f n = "anything else" in map f [-2..2]
01:22:30 <jean-paul[m]> great, learned something. thank you :)
01:22:32 <lambdabot> ["anything else","odd","zero","odd","anything else"]
01:30:38 × caryhartline quits (~caryhartl@cpe-76-184-32-233.tx.res.rr.com) (Quit: caryhartline)
01:33:28 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
01:33:47 razetime joins (~Thunderbi@117.193.7.63)
01:37:43 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 250 seconds)
01:51:39 × mei quits (~mei@user/mei) (Ping timeout: 255 seconds)
01:52:51 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
01:55:43 mei joins (~mei@user/mei)
02:00:01 × mmhat quits (~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.8)
02:00:41 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 246 seconds)
02:02:22 × xff0x quits (~xff0x@ai098135.d.east.v6connect.net) (Ping timeout: 268 seconds)
02:03:19 freeside joins (~mengwong@103.252.202.85)
02:05:55 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
02:08:35 × Fischmiep quits (~Fischmiep@user/Fischmiep) (Ping timeout: 264 seconds)
02:09:10 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 276 seconds)
02:11:48 Fischmiep joins (~Fischmiep@user/Fischmiep)
02:14:06 × adanwan_ quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
02:14:06 × ec quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
02:14:07 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
02:14:22 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
02:14:33 azimut joins (~azimut@gateway/tor-sasl/azimut)
02:14:38 ec joins (~ec@gateway/tor-sasl/ec)
02:16:45 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
02:19:07 slack1256 joins (~slack1256@186.11.43.166)
02:21:31 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 276 seconds)
02:21:58 × ddellacosta quits (~ddellacos@146.70.171.100) (Quit: WeeChat 3.8)
02:25:39 ddellacosta joins (~ddellacos@146.70.165.203)
02:28:01 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 276 seconds)
02:29:17 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 250 seconds)
02:29:23 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
02:30:39 Lord_of_Life_ is now known as Lord_of_Life
02:32:50 freeside joins (~mengwong@103.252.202.85)
02:35:17 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 255 seconds)
02:38:49 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
02:39:10 azimut joins (~azimut@gateway/tor-sasl/azimut)
02:41:13 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
02:45:09 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
02:46:32 × AlexZenon quits (~alzenon@178.34.160.55) (Ping timeout: 246 seconds)
02:47:31 × Alex_test quits (~al_test@178.34.160.55) (Ping timeout: 276 seconds)
02:47:38 freeside joins (~mengwong@103.252.202.85)
02:51:31 Alex_test joins (~al_test@178.34.160.55)
02:51:54 gehmehgeh joins (~user@user/gehmehgeh)
02:52:02 AlexZenon joins (~alzenon@178.34.160.55)
02:52:24 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 255 seconds)
02:55:32 × gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds)
02:56:54 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
02:57:25 × ryanbooker quits (uid4340@id-4340.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
02:58:39 chexum joins (~quassel@gateway/tor-sasl/chexum)
03:02:53 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff) (Remote host closed the connection)
03:04:16 <EvanR> imagine a bug where even n is False and odd n is also False xD
03:04:38 <EvanR> it would take days to track down
03:06:24 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
03:08:46 freeside joins (~mengwong@103.252.202.85)
03:10:49 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
03:12:37 gastus_ joins (~gastus@5.83.191.17)
03:14:34 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
03:16:22 × gastus quits (~gastus@5.83.191.9) (Ping timeout: 268 seconds)
03:16:46 talismanick joins (~talismani@2601:200:c000:f7a0::5321)
03:18:13 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
03:21:19 × td_ quits (~td@i53870901.versanet.de) (Ping timeout: 276 seconds)
03:22:24 td_ joins (~td@i53870903.versanet.de)
03:24:44 × raym quits (~ray@user/raym) (Ping timeout: 246 seconds)
03:25:20 raym joins (~ray@user/raym)
03:29:22 × razetime quits (~Thunderbi@117.193.7.63) (Quit: See You Space Cowboy)
03:29:52 × dibblego quits (~dibblego@haskell/developer/dibblego) (Ping timeout: 252 seconds)
03:34:51 dibblego joins (~dibblego@122-199-1-30.ip4.superloop.au)
03:34:51 × dibblego quits (~dibblego@122-199-1-30.ip4.superloop.au) (Changing host)
03:34:51 dibblego joins (~dibblego@haskell/developer/dibblego)
03:39:56 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
03:47:45 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 255 seconds)
03:51:58 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
03:51:58 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
03:51:58 finn_elija is now known as FinnElija
03:52:19 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
03:58:40 × bhall quits (~brunohall@195.147.207.136) (Ping timeout: 265 seconds)
04:17:15 × talismanick quits (~talismani@2601:200:c000:f7a0::5321) (Ping timeout: 248 seconds)
04:21:45 mbuf joins (~Shakthi@49.207.178.186)
04:23:41 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
04:28:15 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 255 seconds)
04:56:04 trev joins (~trev@user/trev)
04:56:33 pyook joins (~pyook@user/puke)
05:04:16 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
05:09:29 talismanick joins (~talismani@2601:200:c000:f7a0::5321)
05:17:25 × slack1256 quits (~slack1256@186.11.43.166) (Ping timeout: 256 seconds)
05:34:25 freeside joins (~mengwong@103.252.202.85)
05:38:47 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
05:38:57 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 256 seconds)
05:46:50 × jonathanx quits (~jonathan@h-176-10-144-60.NA.cust.bahnhof.se) (Remote host closed the connection)
05:51:38 harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
05:55:31 bgs joins (~bgs@212-85-160-171.dynamic.telemach.net)
05:57:19 freeside joins (~mengwong@103.252.202.85)
05:58:56 jinsun joins (~jinsun@user/jinsun)
06:00:48 shriekingnoise_ joins (~shrieking@186.137.175.87)
06:00:57 × YoungFrog quits (~youngfrog@2a02:a03f:ca07:f900:9c2d:58ba:f0b6:128f) (Quit: ZNC 1.7.x-git-3-96481995 - https://znc.in)
06:01:17 YoungFrog joins (~youngfrog@39.129-180-91.adsl-dyn.isp.belgacom.be)
06:01:43 × shriekingnoise quits (~shrieking@186.137.175.87) (Ping timeout: 260 seconds)
06:02:15 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
06:03:14 freeside joins (~mengwong@103.252.202.85)
06:08:11 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 248 seconds)
06:09:30 freeside joins (~mengwong@103.252.202.85)
06:14:03 × freeside quits (~mengwong@103.252.202.85) (Ping timeout: 248 seconds)
06:17:35 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:24:16 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
06:28:49 bhall joins (~brunohall@195.147.207.136)
06:33:36 razetime joins (~Thunderbi@117.193.7.63)
06:38:32 freeside joins (~mengwong@122.11.248.245)
06:39:38 michalz joins (~michalz@185.246.207.221)
06:43:53 acidjnk joins (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
06:48:02 × thegeekinside quits (~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
06:57:45 × shriekingnoise_ quits (~shrieking@186.137.175.87) (Ping timeout: 268 seconds)
06:58:32 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
06:59:15 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:01:26 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:19aa:397c:29a:40e4) (Remote host closed the connection)
07:09:35 Midjak joins (~Midjak@82.66.147.146)
07:10:51 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
07:11:43 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
07:12:12 × acidjnk quits (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
07:21:54 travisb__ joins (~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net)
07:23:35 × travisb_ quits (~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Ping timeout: 264 seconds)
07:23:41 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
07:46:33 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:52:32 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
07:53:49 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
07:54:07 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
07:58:36 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
08:01:53 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
08:05:11 × harveypwca quits (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving)
08:05:31 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 248 seconds)
08:06:03 × razetime quits (~Thunderbi@117.193.7.63) (Ping timeout: 255 seconds)
08:06:25 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 250 seconds)
08:07:15 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
08:07:21 lortabac joins (~lortabac@2a01:e0a:541:b8f0:f01a:e318:a715:dc16)
08:13:09 acidjnk joins (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
08:13:35 thyriaen joins (~thyriaen@2a01:aea0:dd4:5328:6245:cbff:fe9f:48b1)
08:25:53 razetime joins (~Thunderbi@117.254.34.235)
08:25:55 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:f01a:e318:a715:dc16) (Ping timeout: 260 seconds)
08:33:46 MajorBiscuit joins (~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a)
08:35:23 chele joins (~chele@user/chele)
08:38:04 ccapndave joins (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch)
08:39:12 × razetime quits (~Thunderbi@117.254.34.235) (Quit: See You Space Cowboy)
08:39:12 × EvanR quits (~EvanR@user/evanr) (Remote host closed the connection)
08:39:32 EvanR joins (~EvanR@user/evanr)
08:42:58 Major_Biscuit joins (~MajorBisc@c-001-031-036.client.tudelft.eduvpn.nl)
08:46:27 × MajorBiscuit quits (~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a) (Ping timeout: 260 seconds)
08:47:20 × ccapndave quits (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Quit: Textual IRC Client: www.textualapp.com)
08:50:24 × pyook quits (~pyook@user/puke) ()
09:03:05 × ft quits (~ft@p3e9bc443.dip0.t-ipconnect.de) (Quit: leaving)
09:06:55 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
09:11:01 × bhall quits (~brunohall@195.147.207.136) (Ping timeout: 276 seconds)
09:13:54 lortabac joins (~lortabac@2a01:e0a:541:b8f0:3f4e:b1b7:8b56:e5ae)
09:15:25 bhall joins (~brunohall@195.147.207.136)
09:19:45 merijn joins (~merijn@185.143.104.11)
09:21:27 CiaoSen joins (~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
09:22:47 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.)
09:23:53 chexum joins (~quassel@gateway/tor-sasl/chexum)
09:26:19 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
09:27:03 × talismanick quits (~talismani@2601:200:c000:f7a0::5321) (Ping timeout: 260 seconds)
09:32:16 freeside_ joins (~mengwong@202.161.55.11)
09:34:06 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 265 seconds)
09:34:43 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
09:34:59 × acidjnk quits (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
09:38:39 × cheater quits (~Username@user/cheater) (Ping timeout: 256 seconds)
09:39:11 mmhat joins (~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de)
09:44:05 cheater joins (~Username@user/cheater)
09:48:59 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
09:54:22 cheater_ joins (~Username@user/cheater)
09:54:55 × bhall quits (~brunohall@195.147.207.136) (Read error: Connection reset by peer)
09:55:18 bhall joins (brunohall@gateway/vpn/protonvpn/bhall)
09:56:26 pavonia_ joins (~user@user/siracusa)
09:56:29 × cheater quits (~Username@user/cheater) (Ping timeout: 250 seconds)
09:56:35 × Fischmiep quits (~Fischmiep@user/Fischmiep) (Quit: Ping timeout (120 seconds))
09:56:37 cheater_ is now known as cheater
09:57:06 Fischmiep joins (~Fischmiep@user/Fischmiep)
09:59:24 × tv quits (~tv@user/tv) (Ping timeout: 252 seconds)
09:59:31 × pavonia quits (~user@user/siracusa) (Ping timeout: 250 seconds)
09:59:36 pavonia_ is now known as pavonia
10:03:59 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
10:04:08 ubert1 joins (~Thunderbi@2a02:8109:abc0:6434:7f78:da32:9c8a:9bc6)
10:07:33 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 255 seconds)
10:08:11 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 248 seconds)
10:11:44 tv joins (~tv@user/tv)
10:18:10 gurkenglas joins (~gurkengla@dynamic-046-114-182-248.46.114.pool.telefonica.de)
10:23:08 freeside joins (~mengwong@122.11.248.245)
10:24:01 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
10:25:49 × freeside_ quits (~mengwong@202.161.55.11) (Ping timeout: 265 seconds)
10:28:02 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
10:28:14 freeside joins (~mengwong@122.11.214.174)
10:33:19 mncheck joins (~mncheck@193.224.205.254)
10:33:54 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
10:34:58 × freeside quits (~mengwong@122.11.214.174) (Read error: Connection reset by peer)
10:38:11 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer)
10:53:35 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:3f4e:b1b7:8b56:e5ae) (Ping timeout: 264 seconds)
10:59:45 zeenk joins (~zeenk@2a02:2f04:a307:2300::7fe)
10:59:48 lortabac joins (~lortabac@2a01:e0a:541:b8f0:2a8c:2678:6ba3:2f77)
11:04:19 merijn joins (~merijn@185.143.104.11)
11:05:44 dcoutts joins (~duncan@host86-144-78-144.range86-144.btcentralplus.com)
11:08:29 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 246 seconds)
11:11:51 cheater_ joins (~Username@user/cheater)
11:12:14 xff0x joins (~xff0x@ai098135.d.east.v6connect.net)
11:14:25 _xor joins (~xor@74.215.46.17)
11:14:30 acidjnk joins (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
11:14:34 × cheater quits (~Username@user/cheater) (Ping timeout: 252 seconds)
11:14:36 cheater_ is now known as cheater
11:20:11 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:2a8c:2678:6ba3:2f77) (Ping timeout: 248 seconds)
11:23:17 freeside joins (~mengwong@122.11.248.245)
11:27:55 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
11:42:27 Square2 joins (~Square4@user/square)
11:43:41 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
11:47:18 lortabac joins (~lortabac@2a01:e0a:541:b8f0:4df1:b4ff:90fe:9e78)
11:53:21 × Square2 quits (~Square4@user/square) (Quit: Leaving)
11:53:51 Square2 joins (~Square4@user/square)
11:57:06 freeside joins (~mengwong@122.11.248.245)
11:59:44 Square2 is now known as Square
12:01:11 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
12:01:58 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
12:09:47 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
12:12:45 merijn joins (~merijn@185.143.104.11)
12:12:54 wootehfoot joins (~wootehfoo@user/wootehfoot)
12:16:02 <mesaoptimizer2> note to self, I still have to make an issue re HLS eglot :config bug
12:21:59 cheater_ joins (~Username@user/cheater)
12:23:17 cheater__ joins (~Username@user/cheater)
12:23:27 × cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds)
12:23:32 cheater__ is now known as cheater
12:24:41 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 250 seconds)
12:26:25 × cheater_ quits (~Username@user/cheater) (Ping timeout: 250 seconds)
12:27:23 merijn joins (~merijn@185.143.104.11)
12:28:51 × bhall quits (brunohall@gateway/vpn/protonvpn/bhall) (Ping timeout: 255 seconds)
12:29:32 ggVGc joins (~ggVGc@a.lowtech.earth)
12:32:24 freeside joins (~mengwong@122.11.248.245)
12:36:01 × CiaoSen quits (~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
12:36:48 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 265 seconds)
12:41:53 L29Ah joins (~L29Ah@wikipedia/L29Ah)
12:42:21 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
12:47:29 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 246 seconds)
13:00:21 × hugo- quits (znc@verdigris.lysator.liu.se) (Ping timeout: 268 seconds)
13:06:41 freeside joins (~mengwong@122.11.248.245)
13:11:27 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
13:15:09 × cheater quits (~Username@user/cheater) (Ping timeout: 268 seconds)
13:15:24 cheater joins (~Username@user/cheater)
13:19:39 × cheater quits (~Username@user/cheater) (Ping timeout: 256 seconds)
13:20:23 slack1256 joins (~slack1256@186.11.43.166)
13:22:29 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
13:23:42 cheater joins (~Username@user/cheater)
13:24:45 hugo- joins (znc@verdigris.lysator.liu.se)
13:29:51 freeside joins (~mengwong@122.11.248.245)
13:32:23 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 265 seconds)
13:33:47 merijn joins (~merijn@185.143.104.11)
13:34:55 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
13:39:12 bhall joins (brunohall@gateway/vpn/protonvpn/bhall)
13:41:07 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 246 seconds)
13:41:44 × acidjnk quits (~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
13:45:39 wootehfoot joins (~wootehfoo@user/wootehfoot)
13:48:04 acidjnk joins (~acidjnk@p200300d6e715c492f5536687732e5bb6.dip0.t-ipconnect.de)
13:50:18 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 255 seconds)
13:54:28 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
13:54:45 Guest31 joins (~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
14:02:02 × elkcl quits (~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru) (Ping timeout: 246 seconds)
14:03:09 freeside joins (~mengwong@122.11.248.245)
14:07:23 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
14:08:12 bitmapper joins (uid464869@id-464869.lymington.irccloud.com)
14:08:56 thegeekinside joins (~thegeekin@189.217.80.156)
14:09:13 razetime joins (~Thunderbi@117.254.34.235)
14:25:50 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
14:27:25 × dsrt^ quits (~dsrt@c-24-30-76-89.hsd1.ga.comcast.net) (Remote host closed the connection)
14:27:35 × gurkenglas quits (~gurkengla@dynamic-046-114-182-248.46.114.pool.telefonica.de) (Ping timeout: 246 seconds)
14:29:31 × thegeekinside quits (~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
14:29:54 thegeekinside joins (~thegeekin@189.217.80.156)
14:32:58 × thegeekinside quits (~thegeekin@189.217.80.156) (Remote host closed the connection)
14:33:08 thegeekinside joins (~thegeekin@189.217.80.156)
14:37:06 freeside joins (~mengwong@122.11.248.245)
14:40:08 CiaoSen joins (~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
14:41:35 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 264 seconds)
14:42:37 gaff joins (~gaff@49.207.227.108)
14:43:28 <gaff> is there a way to get the complete list of OPTIONS_GHC pragmas from the commandline?
14:43:54 <gaff> i need it for configuring omnicompletion in vim
14:44:15 × thegeekinside quits (~thegeekin@189.217.80.156) (Remote host closed the connection)
14:45:44 × Guest31 quits (~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
14:46:12 elkcl joins (~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru)
14:47:05 <gaff> sorry, i meant complete list of OPTIONS_GHC pragmas
14:49:00 <geekosaur> `ghc --show-options` ? although it doesn't leave out mode options, but you can distinguish those because they all start with `--`
14:50:59 <geekosaur> it also doesn't distinguish dynamic ones but I think at this point they're all either mode options or dynamic ones
14:51:23 Sgeo joins (~Sgeo@user/sgeo)
14:52:24 freeside joins (~mengwong@122.11.248.245)
14:52:36 <geekosaur> single character options being an exception here, so that may be a problem
14:56:46 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
14:57:26 <gaff> geekosaur: i ran that command just before you told me. but i noticed things are missing there; for example, -fno-warn-orphans
14:59:37 y04nn joins (~username@185.213.154.207)
14:59:44 <mauke> "In GHC < 8 the syntax for -W<wflag> was -fwarn-<wflag> (e.g. -fwarn-incomplete-patterns). This spelling is deprecated, but still accepted for backwards compatibility. Likewise, -Wno-<wflag> used to be fno-warn-<wflag> (e.g. -fno-warn-incomplete-patterns)."
15:00:11 <mauke> https://downloads.haskell.org/ghc/latest/docs/users_guide/using-warnings.html
15:01:17 <gaff> i am runing running ghc 8.10.4
15:01:55 <geekosaur> right, so that's a backward compatibility thing
15:02:06 <geekosaur> I don't know how that's handled
15:02:18 × mjacob quits (~mjacob@adrastea.uberspace.de) (Read error: Connection reset by peer)
15:02:34 <geekosaur> but the modern spelling is -Wno-orphans
15:02:38 <mauke> gaff: so that applies to you
15:03:40 <gaff> ah i see. thanks. i used the old -fno-warn-orphans in code and it works ... so i suppose it is the backward compatability thing
15:05:45 <gaff> geekosaur: so show-options output cleansed of mode options (the stuff preceeded by --) should work, uh?
15:06:18 <geekosaur> and single character options aside from -W/-w, yes
15:06:55 <mauke> if you want to see the deprecated forms as well, ghc --show-options | sed '/^-W/ { p; s/^-Wno/-fno-warn/; t; s/^-W/-fwarn-/ }'
15:06:57 <geekosaur> hm, actually more complex than that because you'll still get stuff like -odir
15:07:15 <gaff> geekosaur: yeah
15:07:25 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
15:07:36 <geekosaur> this might be a question for #ghc, there should probably be a way to get this (--show-dynamic-options?)
15:07:47 <mauke> (I've been practicing my sed)
15:07:48 <geekosaur> completion is pretty pervasive these days
15:07:50 mjacob joins (~mjacob@adrastea.uberspace.de)
15:08:05 <gaff> so how do you get the stuff that is just for the OPTIONS_GHC pragmas that put as file header?
15:09:15 <gaff> mauke: thanks for the sed thing; looks like an easy pattern match substitution
15:10:37 <mauke> as a human: https://downloads.haskell.org/ghc/latest/docs/users_guide/flags.html#flag-reference
15:10:49 <mauke> "Type: dynamic" are the ones that can be used in files
15:10:53 <gaff> i am looking for this stuff as input for some code i am writing for vim omnicompletion
15:11:12 <geekosaur> so if you keep asking you'll get a different answer?
15:11:57 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 250 seconds)
15:12:25 freeside joins (~mengwong@122.11.248.245)
15:12:32 <gaff> mauke: hey, thanks. have to manually parse that stuff
15:13:09 <gaff> geekosaur: no, sorry for the double prodding ... sometimes i can not remember
15:17:10 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Remote host closed the connection)
15:19:12 <geekosaur> mrr, does ghcup not install the ghc users guide? (trying to work out an awk expression to pull out dynamic options from that table)
15:19:27 <geekosaur> I see libraries but not the guide
15:22:49 <gaff> geekosaur: ghcup has the users guide, at least in my case. ~/.ghcup/ghc/8.10.4/share/doc/ghc-8.10.4/html/users_guide/
15:23:53 <geekosaur> wonder what that translates to in xdg mode
15:24:07 <mauke> no, that only contains a man page here
15:24:41 <geekosaur> crud, I have it… for 8.10
15:24:49 <geekosaur> not 9.2.5 which I was looking at
15:24:50 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
15:25:04 <mauke> oh, I'm dumb
15:25:18 <mauke> I was looking in users_guide, not html/users_guide
15:27:28 <mauke> heh, class="row-even" ... class="row-odd"
15:28:50 <mauke> get with the times, guys! tr:nth-child(even)
15:29:14 aztex joins (~aztex@ext-1-370.eduroam.chalmers.se)
15:29:36 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
15:29:44 <aztex> I was under the impression that a data type needs to have  a Monad instance for using the do notationg
15:29:45 <int-e> . o O ( But will it work in Internet Explorer? ;-) )
15:30:09 × slack1256 quits (~slack1256@186.11.43.166) (Ping timeout: 250 seconds)
15:30:14 <aztex> but something like this:
15:30:14 <aztex> data Foo
15:30:15 <aztex> foo :: Foo
15:30:15 <aztex> foo = do
15:30:16 <aztex>   baz "baz"
15:30:16 <aztex> baz = undefined
15:30:19 <aztex> seems to compile fine
15:30:34 <aztex> what does the compiler interpret the `do` notation in this program
15:30:47 <aztex> Foo is clearly not defined as a Monad
15:31:56 <int-e> @undo do baz "baz"
15:31:56 <lambdabot> baz "baz"
15:33:06 <mauke> aztex: the desugaring of multiple lines/"statements" requires Monad
15:33:08 <int-e> `do` notation is pure syntactic sugar; it's tied to Monad only if you have more than one non-let statement.
15:33:28 <mauke> for a single expression you don't need any extra operations
15:33:31 <mauke> or let, yeah
15:33:39 <int-e> cf. https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14
15:33:57 shriekingnoise joins (~shrieking@186.137.175.87)
15:34:11 <aztex> ah okay so if I did `baz "baz"` twice it would fail right?
15:34:17 <int-e> yes
15:34:27 cheater_ joins (~Username@user/cheater)
15:34:27 <int-e> because then it would desugar to a use of >>
15:34:41 <int-e> @undo baz; bar
15:34:41 <aztex> phew thats a relief
15:34:41 <lambdabot> <unknown>.hs:1:4:Parse error: ;
15:34:45 <int-e> @undo do baz; bar
15:34:46 <lambdabot> baz >> bar
15:35:19 <aztex> I think I had the same intuition as everyone is discussing here but I was shocked when the do notation with one statement worked
15:36:03 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer)
15:36:20 econo joins (uid147250@user/econo)
15:36:25 <int-e> understandable, but now you know why :)(
15:36:38 <aztex> yes thanks :)
15:37:55 × cheater quits (~Username@user/cheater) (Ping timeout: 256 seconds)
15:38:31 <gaff> geekosaur: well, thanks for your help
15:38:39 <gaff> mauke: thanks a bunch
15:39:04 <geekosaur> I still think you should ask for --show-dynamic-options in #ghc, since completion isn't going away
15:39:29 <geekosaur> or file an issue for it (https://gitlab.haskell.org/ghc/ghc/issues)
15:39:36 merijn joins (~merijn@185.143.104.11)
15:39:42 <gaff> sure. i didn't know about the #ghc channel. hearing it for the first time from you
15:39:43 × cheater_ quits (~Username@user/cheater) (Ping timeout: 276 seconds)
15:41:30 × gaff quits (~gaff@49.207.227.108) ()
15:42:44 × ddellacosta quits (~ddellacos@146.70.165.203) (Quit: WeeChat 3.8)
15:43:48 ddellacosta joins (~ddellacos@146.70.165.203)
15:44:29 × aztex quits (~aztex@ext-1-370.eduroam.chalmers.se) (Quit: Client closed)
15:45:34 × razetime quits (~Thunderbi@117.254.34.235) (Quit: See You Space Cowboy)
15:51:25 <EvanR> :t let baz = undefined in do { baz "baz" }
15:51:26 <lambdabot> t
15:51:59 <EvanR> cool we can use do notation anywhere as long as it's 1 "statement" xD
15:52:09 <geekosaur> > do do do do do 1
15:52:11 <lambdabot> 1
15:52:49 <EvanR> > let please = id in please do "something"
15:52:50 <lambdabot> error:
15:52:50 <lambdabot> Unexpected do block in function application:
15:52:50 <lambdabot> do "something"
15:53:23 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:4df1:b4ff:90fe:9e78) (Quit: WeeChat 2.8)
15:53:32 <geekosaur> need BlockArguments
15:53:53 <EvanR> :set -XBlockArguments
15:54:16 <geekosaur> @let {-# LANGUAGE BlockArguments #-}
15:54:18 <lambdabot> Defined.
15:54:31 <geekosaur> > let please = id in please do "something"
15:54:33 <lambdabot> error:
15:54:33 <lambdabot> Unexpected do block in function application:
15:54:33 <lambdabot> do "something"
15:54:40 <geekosaur> hm
15:55:01 <int-e> :t let monadic :: Monad m => m a -> m a; monadic = id in monadic $ do undefined
15:55:03 <lambdabot> Monad m => m a
15:55:42 × dgb83 quits (~dgb@astra4961.startdedicated.net) (Quit: The Lounge - https://thelounge.github.io)
15:56:17 JamesG joins (~JamesG@2600:8800:8c84:5d00:9878:b9de:731b:d1c2)
15:56:38 <EvanR> intercal's please syntax which if not used often enough results in the program randomly ... not doing something
15:56:39 <int-e> geekosaur: lambdabot parses the expression using haskell-src-exts before passing it on to ghc.
15:56:55 <geekosaur> hm, right
15:57:10 <geekosaur> so that doesn't know BlockArguments yet
15:57:30 <int-e> EvanR: hmm, that seems to be a mix of the politeness check and the random compiler error
15:57:44 freeside joins (~mengwong@122.11.248.245)
15:58:26 <int-e> (you can be either insufficiently and overly polite btw; both checks are deterministic)
15:58:38 <EvanR> a linter for intercal which mishaves even worse than the language
15:58:47 <int-e> (while the random compiler error non-deterministically introduces a run-time error into your code)
15:59:14 <EvanR> it's not random? ok
15:59:49 <tdammers> IIRC it's not random, but the correct percentage is undocumented and implementation-specific
16:00:00 <dminuoso> There was a simple way to take an arbitrary haskell expression and turn it into a Dec that TH would accept. Any pointers?
16:00:10 × steve[m] quits (~stevetrou@2001:470:69fc:105::e0b) (Quit: You have been kicked for being idle)
16:00:11 <dminuoso> (or well, top level declaration rather than expression)
16:01:09 <dminuoso> Or do I need ghc-lib for that?
16:02:28 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
16:02:52 <dminuoso> % :set -XTemplateHaskell
16:02:52 <yahb2> <no output>
16:02:59 <dminuoso> % show [d| instance Show Foo |]
16:02:59 <yahb2> <interactive>:24:24: error: ; • Not in scope: type constructor or class ‘Foo’ ; • In the Template Haskell quotation [d| instance Show Foo |]
16:03:04 <dminuoso> % show [d| instance Show String |]
16:03:04 <yahb2> <interactive>:26:1: error: ; • Ambiguous type variable ‘m0’ arising from a use of ‘show’ ; prevents the constraint ‘(Show ; (m0 Language.Haskell.TH.Lib.I...
16:03:05 <int-e> dminuoso: just [| e |]... wait, Dec? There's [d| ... |] for DecsQ
16:03:21 <dminuoso> % :t [d| instance Show String |]
16:03:21 <yahb2> [d| instance Show String |] ; :: Language.Haskell.TH.Syntax.Quote m => ; m Language.Haskell.TH.Lib.Internal.Decs
16:03:32 <dminuoso> % show $([d| instance Show String |])
16:03:32 <yahb2> <interactive>:30:8: error: ; • Couldn't match type ‘[Language.Haskell.TH.Syntax.Dec]’ ; with ‘Language.Haskell.TH.Syntax.Exp’ ; Expected: Language.Haskell.TH.Lib.Inte...
16:03:35 <dminuoso> Oh no mmm
16:04:00 <dminuoso> % runQ (liftIO . print $ [d| instance Show String |])
16:04:01 <yahb2> <interactive>:32:1: error: Variable not in scope: runQ :: t0 -> t ; ; <interactive>:32:7: error: ; Variable not in scope: liftIO :: IO () -> t0
16:04:55 chomwitt joins (~chomwitt@2a02:587:7a19:9200:1ac0:4dff:fedb:a3f1)
16:05:22 <int-e> % Language.Haskell.TH.runQ [d| instance Show String |]
16:05:22 <yahb2> [InstanceD Nothing [] (AppT (ConT GHC.Show.Show) (ConT GHC.Base.String)) []]
16:05:27 <dminuoso> Ah yes.
16:05:31 <dminuoso> Cheers.
16:05:40 <dminuoso> Hecate: ^-
16:05:51 int-e was testing in ghci (hint!)
16:05:58 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
16:06:23 cheater_ joins (~Username@user/cheater)
16:06:23 cheater_ is now known as cheater
16:13:02 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
16:14:21 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
16:14:27 codaraxis joins (~codaraxis@user/codaraxis)
16:16:24 mixfix41 joins (~sdenynine@user/mixfix41)
16:16:34 Guest31 joins (~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
16:22:35 × mbuf quits (~Shakthi@49.207.178.186) (Quit: Leaving)
16:24:34 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 246 seconds)
16:25:53 × mesaoptimizer2 quits (34cef275bb@user/PapuaHardyNet) (Quit: Gateway shutdown)
16:26:02 mesaoptimizer2 joins (34cef275bb@198.108.77.94)
16:26:14 × mesaoptimizer2 quits (34cef275bb@198.108.77.94) (Changing host)
16:26:14 mesaoptimizer2 joins (34cef275bb@user/PapuaHardyNet)
16:26:43 × Guest31 quits (~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Ping timeout: 260 seconds)
16:29:50 × inversed quits (~inversed@bcdcac82.skybroadband.com) (Read error: No route to host)
16:30:46 freeside joins (~mengwong@122.11.248.245)
16:34:31 inversed joins (~inversed@bcdcac82.skybroadband.com)
16:35:02 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
16:36:42 Guest98 joins (~Guest98@astra4961.startdedicated.net)
16:36:58 × Guest98 quits (~Guest98@astra4961.startdedicated.net) (Client Quit)
16:40:17 migas joins (~migas@astra4961.startdedicated.net)
16:40:32 × elkcl quits (~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru) (Ping timeout: 252 seconds)
16:46:58 Pickchea joins (~private@user/pickchea)
16:50:00 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
16:50:21 cheater_ joins (~Username@user/cheater)
16:52:15 × cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds)
16:52:25 cheater_ is now known as cheater
16:55:04 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Ping timeout: 260 seconds)
16:55:59 × CiaoSen quits (~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
16:57:02 harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
16:58:02 × JamesG quits (~JamesG@2600:8800:8c84:5d00:9878:b9de:731b:d1c2) (Quit: Client closed)
16:59:12 freeside joins (~mengwong@122.11.248.245)
17:05:40 cheater_ joins (~Username@user/cheater)
17:07:55 <Profpatsch> Is there a ghc-lib based quasiquote for haskell code? like the outdated https://hackage.haskell.org/package/haskell-src-exts-qq
17:08:45 cheater__ joins (~Username@user/cheater)
17:08:46 × cheater quits (~Username@user/cheater) (Ping timeout: 276 seconds)
17:08:50 cheater__ is now known as cheater
17:09:23 cassiopea joins (~cassiopea@user/cassiopea)
17:09:49 × cheater_ quits (~Username@user/cheater) (Ping timeout: 250 seconds)
17:11:18 man_max joins (~man_max@94-43-231-47.dsl.utg.ge)
17:11:57 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
17:12:02 × man_max quits (~man_max@94-43-231-47.dsl.utg.ge) (Client Quit)
17:12:05 <merijn> Profpatsch: Isn't that just the standard TH quasiquoters?
17:12:42 jmdaemon joins (~jmdaemon@user/jmdaemon)
17:12:44 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Client Quit)
17:13:03 hrberg joins (~quassel@171.79-160-161.customer.lyse.net)
17:13:29 <Profpatsch> merijn: you might have a point
17:13:31 <Profpatsch> huh
17:13:42 <merijn> i.e. [d|, [e| and friends
17:13:59 <Profpatsch> that, but I feel like I want to write code to generate haskell files
17:14:04 <Profpatsch> not immediately compile it
17:14:06 <Profpatsch> but check into git
17:14:26 <merijn> Profpatsch: -ddump-splices ;)
17:14:29 <Profpatsch> lol
17:14:50 <geekosaur> haskell-src-meta?
17:15:04 <Hecate> ooooooh
17:15:05 <merijn> You can even tell it to dump splices in a separate directory instead of dist-newstyle now (consult GHC user guide for details :p)
17:15:23 <Hecate> thank you int-e & dminuoso <3
17:15:30 <Profpatsch> merijn: huh
17:15:34 <Profpatsch> maybe that’s actually a good idea
17:15:36 <Profpatsch> idk
17:15:50 <Profpatsch> feels like an idea worth trying
17:15:52 <merijn> Profpatsch: there's a dump-directory or something to aggregate all the splices in one place now
17:16:07 <merijn> I forget the exact flag, but it's in the user guide somewhere between the dump flags
17:16:15 <merijn> Gotta run and pretend to be social now ;)
17:16:48 <Profpatsch> geekosaur: idk what that does
17:16:50 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
17:17:06 <Profpatsch> but yeah, gotta run as well, train has arrived
17:17:10 × ubert1 quits (~Thunderbi@2a02:8109:abc0:6434:7f78:da32:9c8a:9bc6) (Remote host closed the connection)
17:17:20 L29Ah parts (~L29Ah@wikipedia/L29Ah) ()
17:17:24 × harveypwca quits (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving)
17:17:29 <geekosaur> primary intent is to use haskell-src-ext to parse Haskell and produce TH ASTs instead of HSE ASTs
17:18:12 <geekosaur> but you could presumably dump-splices that, or build your own quasiquoter using HSE
17:18:16 × feliix42_ quits (~felix@gibbs.uberspace.de) (Read error: Connection reset by peer)
17:21:12 × merijn quits (~merijn@185.143.104.11) (Ping timeout: 264 seconds)
17:21:25 feliix42 joins (~felix@gibbs.uberspace.de)
17:25:06 × inversed quits (~inversed@bcdcac82.skybroadband.com) (Read error: Connection reset by peer)
17:25:33 × thyriaen quits (~thyriaen@2a01:aea0:dd4:5328:6245:cbff:fe9f:48b1) (Quit: Leaving)
17:25:48 inversed joins (~inversed@bcdcac82.skybroadband.com)
17:26:08 × inversed quits (~inversed@bcdcac82.skybroadband.com) (Read error: Connection reset by peer)
17:26:53 inversed joins (~inversed@bcdcac82.skybroadband.com)
17:28:07 freeside joins (~mengwong@122.11.248.245)
17:29:53 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
17:30:21 × y04nn quits (~username@185.213.154.207) (Ping timeout: 255 seconds)
17:31:44 × noctux quits (~noctux@user/noctux) (Read error: Connection reset by peer)
17:32:13 elkcl joins (~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru)
17:32:23 × cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds)
17:32:52 × c_wraith quits (~c_wraith@adjoint.us) (Ping timeout: 260 seconds)
17:33:02 c_wraith joins (~c_wraith@adjoint.us)
17:33:05 notzmv joins (~zmv@user/notzmv)
17:33:11 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 264 seconds)
17:34:20 noctux joins (~noctux@user/noctux)
17:34:25 Ashkan joins (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
17:34:45 <Ashkan> Hello people:)
17:34:45 <Ashkan> Does this make sense https://paste.tomsmeding.com/0fxeAcDL ?
17:36:18 <monochrom> You can answer these kinds of questions ("I have thought up an abstraction. Does it make sense?") by providing both of the following:
17:36:55 <Ashkan> Idea is to give fine-grain control over how a game would interact with the input/output. A turn-based game can not progress unless some input is provided. The type class is meant to somewhat enforce that (by *not* providing a non-blocking input reading method). Real-time game is somewhat opposite : the game can progress on its own so a non-blocking
17:36:55 <Ashkan> read-input method is provided (`try`)
17:37:03 <monochrom> 1. Examples of useful programs written in terms of those methods only ("programming to the interface"). More examples are stronger evidence.
17:37:04 cheater joins (~Username@user/cheater)
17:37:28 <monochrom> 2. Examples of useful instances of those classes. More examples are stronger evidence.
17:38:29 <monochrom> Here is an example of someone achieving #1 brilliantly, but only because #2 is basically non-existent, thus showing that their abstraction is garbage.
17:38:37 × hugo- quits (znc@verdigris.lysator.liu.se) (Ping timeout: 256 seconds)
17:39:00 <EvanR> most turn based games do have to do something apart from user input. Nethack is maybe the exception which can only manage to have the cursor blink while the user is thinking
17:39:03 <monochrom> There is a joke among mathematicians about an unlucky PhD student.
17:39:35 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
17:39:59 <c_wraith> Ashkan: based on your questions after the last few weeks, I have to suggest you forget about scala completely when you're writing Haskell, and that you try to see how far you can get without ever creating a new class.
17:40:19 <Ashkan> monochrom I have two example actually. (A) tic-tac-toe game. After coding I realised nowhere I used the non-blocking read-input so it game me the hint. (B) a rather contrived *counter* game which is not really a game per se but rather a process that increase a counter periodically and could be somehow controlled by input but progresses nonetheless
17:40:20 <Ashkan> even if left on its own. In this counter game I only use the non-blocking read-input function. So far I have two perfect fits:D
17:40:26 <monochrom> The PhD student thought up a new kind of abstraction --- the usual axioms of rings plus their own new axioms --- and can prove that every ring that satisifies those extra axioms have super-nice properties. So, like doing #1 with great success.
17:40:56 <monochrom> The supervisor asked "can you give an actual example of such kind of rings?" The student said no.
17:41:15 <monochrom> The supervisor went on to prove that the only ring that satisifies the extra axioms is {0}.
17:41:22 <monochrom> So, #2 utterly fails.
17:42:03 <c_wraith> is {0} even a ring? hmm. I suppose there's no requirement that the two identity elements be different
17:42:16 <int-e> Rolling with #1 though I imagine there should be a notion of time in a real-time game abstraction.
17:42:24 <monochrom> Yeah under some definitions {0} is allowed.
17:42:30 <EvanR> I miss the old days when haskell game questions instantly turned into suggestions and discussion of FRP. A system with really nice properties and no real examples xD
17:42:39 <int-e> Starting with #2 seems more healthy.
17:42:40 <monochrom> But it's a joke so I can easily say {0,1} instead. :)
17:43:22 <monochrom> Right. Exactly the disease of most OO people to start with #1 exclusively.
17:43:25 <int-e> monochrom: hey at least there was *one* example
17:43:56 <Ashkan> EvanR thank you for the example. This is a client-server game host (of sorts). In the world of my project (which is sometimes intentionally contrived to force certain ideas) a turn based game does not progress unless input is provided. The client side is at liberty to do its own thing while waiting for output from the game.
17:44:31 <int-e> (People complain about premature optimization but nobody complains about premature abstraction.)
17:44:46 <c_wraith> I actually see a lot of people trying to do things like unify mutable and persistent data structures under a single class somewhat often. that's a case where #2 is easy but #1 fails
17:44:47 <monochrom> Oh but I did :)
17:44:52 <int-e> monochrom: I know :)
17:44:53 <monochrom> @quote monochrom premature
17:44:53 <lambdabot> monochrom says: premature generality is the root of OOP
17:44:58 <EvanR> OO is full of examples. Unicorn horse, circle ellipse, you name it
17:45:05 <int-e> monochrom: Okay, I didn't know of that instance.
17:45:06 <EvanR> cat meow
17:45:45 <int-e> DesignPatternFactoryMethod
17:45:53 <monochrom> Anyway, both Piaget's theory for teaching-learning and programmers' advice of "make a prototype first" say that you should start with #2 not #1.
17:46:01 × Nosrep quits (~Nosrep@user/nosrep) (Remote host closed the connection)
17:46:37 <monochrom> OO does not have to start with #1 but unfortunately most OO teachers teach that. Premature future-proofing, without even knowing the future.
17:47:41 × Pickchea quits (~private@user/pickchea) (Ping timeout: 256 seconds)
17:47:41 × ghostbuster quits (~admin@user/ghostbuster) (Ping timeout: 256 seconds)
17:48:01 <monochrom> The expression problem implies that there are at least two possible futures and future-proofing for one of them conflicts with future-proofing the other, so you will always be wrong (Murphy's law).
17:48:05 Pickchea joins (~private@user/pickchea)
17:48:34 chele_ joins (~chele@user/chele)
17:48:49 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 256 seconds)
17:49:13 <Ashkan> I have to read everything here twice, once read everything quickly and then again more carefully filter all your OOP-this OOP-that ,hmmm , opinions to actually get to the point of what your guys are saying:D  I've been warned but honestly didn't expect this to be true:D
17:49:53 whatsupdoc joins (uid509081@id-509081.hampstead.irccloud.com)
17:49:55 <EvanR> OOP courses have to future proof their own need for existence
17:50:09 ghostbuster joins (~admin@user/ghostbuster)
17:50:09 <monochrom> heh
17:50:30 <EvanR> you're right why are we even talking about OOP
17:50:49 <EvanR> this is worse than AI
17:51:00 × chele quits (~chele@user/chele) (Ping timeout: 246 seconds)
17:51:00 <monochrom> Oh that's because the pasted classes obviously came from OO thinking. :)
17:51:06 <Ashkan> I'm trying to understand why #2 is more important. So idea is if nothing fits the abstraction then its useless, right ? kinda obvious honestly or is there like a deeper meaning I'm missing ?
17:51:44 <monochrom> Oh, all great truths are obvious tautologies that people don't want to believe.
17:52:52 <monochrom> And that makes those tautologies so deep. At least feeling so deep.
17:53:20 <EvanR> every theorem is obvious once you have the proof, someone told me
17:53:23 <monochrom> My http://www.vex.net/~trebla/humour/tautologies.html is full of them :)
17:53:40 <int-e> Ashkan: Without examples to abstract from your abstraction will probably either provide too little or too much to fit the use cases, and erring on either side is painful (one side more than the other)
17:54:02 hugo joins (znc@verdigris.lysator.liu.se)
17:54:23 Guest31 joins (~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
17:58:13 <Ashkan> Okay so , unless I'm missing the point here, there is only so much I can do right now in terms of examples. But that is the case with all the abstractions. If I had every (or even most of) actual things I'm gonna write against this and only then being to abstract away then I would simply refactor mechanically till the type-classes emerge.
17:58:40 <geekosaur> if any do
17:58:49 <geekosaur> most people never have to define a typeclass
17:58:55 <int-e> I guess I should say "generalization" because there's also the notion of "abstraction" that's about having a well-defined public interface. Which, in Haskell, you can achieve through modules; there's no need to have type classes.
17:59:32 <Ashkan> The point is to have rather very few but (hopefully) *representative* examples and try to exercise one's abstracting skills to a *problem statement*, not the solution !
18:00:40 freeside joins (~mengwong@122.11.248.245)
18:01:32 <EvanR> to get concrete about blocking and non-blocking I/O stuff, check out haskell's concurrency primitives so you don't have to deal with blocking and non-blocking versions of things. I.e. use blocking everywhere
18:02:19 <monochrom> I don't abstract until there is sufficient benefit to abstract. So, until I repeat myself badly enough.
18:02:20 <EvanR> non-blocking I/O is this thing you need in C because multiple threads are so painful
18:03:15 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 246 seconds)
18:03:22 <monochrom> Plus the bonus that I actually see what I'm repeating at all.
18:04:14 <monochrom> If you say you already have two games and so you already know what they're repeating and your classes came from that, then cool.
18:05:58 <Ashkan> For example an application framework or a lib author might have a few real world example to being with and following this advice it would result in a piece of code that overfits those particular examples but can't comfortable model anything else. There is always a degree of introspection and seeing-into-the-future when modelling
18:05:58 <Ashkan> abstractions/generalisations. The whole point is that you don't have enough to mechanically arrive at a solution !
18:06:36 <monochrom> Oh this is why versions 1, 2, 3, 4... all exist. :)
18:07:31 × cheater quits (~Username@user/cheater) (Ping timeout: 256 seconds)
18:07:55 <Ashkan> That is also true but happens as a natural outcome of "not knowing everything right now" rather than "don't generalise because OOP":)
18:08:39 <monochrom> Well, like I said, OO is not by itself premature abstraction, but OO people do that all the time.
18:09:08 <monochrom> There is an economic plus Dunning-Kruger explanation.
18:09:28 <int-e> Without context, https://paste.tomsmeding.com/0fxeAcDL is a great example of premature abstraction.
18:09:31 <monochrom> Those who are actually good at guessing good abstractions have all gone to mathematics.
18:09:33 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
18:09:50 <monochrom> Programming is left with those who are bad at it.
18:10:16 <int-e> There may be a context in which this is useful, but I find it hard to imagine what that would be.
18:10:22 <monochrom> Now enter Dunning-Kruger to see that programmers think they're great at abstractions.
18:10:26 cheater joins (~Username@user/cheater)
18:10:35 <EvanR> this discussion is overly abstract xD
18:11:17 shapr joins (~user@68.54.166.125)
18:12:47 <monochrom> Programmers are also super grateful that OO allows them to feel productive (as opposed to being productive) because they can mindlessly write scaffolding and procrastinate asking the difficult questions.
18:13:52 <EvanR> that's a downside of haskell. I often realize I could just write the code to solve the problem without setting up a bunch of engineering first. So instead of cart before the horse there's just no cart
18:14:13 <monochrom> Haskell looks so hard because after writing "f x y =" you now have to immediately ask yourself which algorithm to use, why it's correct. No room for procrastination.
18:14:35 <monochrom> In OO you could keep on writing more class declarations.
18:14:46 cheater_ joins (~Username@user/cheater)
18:15:19 × cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds)
18:15:21 cheater_ is now known as cheater
18:16:11 × Guest31 quits (~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
18:16:32 <monochrom> Again, not to say that OO is meant to be abused this way, but consider human nature, what do you think selfish mediocre people actually want to do?
18:18:09 <int-e> . o O ( type RealTimeGame m i o = TurnBasedGame m (Maybe i) o )
18:18:24 <int-e> . o O ( Looks weird, doesn't it? )
18:19:02 <monochrom> That may require some kind of discrete-time assumption...
18:19:38 <int-e> Yeah I was getting there... I imagine the idea is to read input once per frame or some other sort of tick.
18:20:05 <monochrom> With this, one cannot avoid mentioning FRP any longer :)
18:22:54 <EvanR> FRP!
18:23:22 <Ashkan> Honestly I'm not sure I'm following ... lets make this conversation even more useful by solving this problem :
18:23:22 <Ashkan> Model the following:
18:23:23 <Ashkan> There is a client-server game setting. Games actually run on the server side and receive input / provide output. There is no graphics or rendering or complex IO of any kind to these games. All they do is to process input and produce output.
18:23:23 <Ashkan> There is a distinction between games that do not progress until next input is provided and those that might progress even if no input is provided.
18:23:28 <int-e> hmm "fast reverse proxy"
18:24:01 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
18:24:27 <int-e> Ashkan: You can do that but WHY?
18:24:42 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
18:25:24 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
18:26:00 <int-e> People write game. Some games are client-server games. What's the context in which you have so many different games that you want to abstract from them uniformly? And what makes you think that you can do that abstraction in a meaningful way without having a collection of actual games first?
18:26:19 man_max joins (~man_max@94-43-231-47.dsl.utg.ge)
18:26:21 talismanick joins (~talismani@2601:200:c000:f7a0::5321)
18:27:39 <EvanR> that client already has mildly complex IO requirements because of the full duplex
18:27:58 × cassiopea quits (~cassiopea@user/cassiopea) (Remote host closed the connection)
18:28:01 <Ashkan> To avoid the million questions that could be asked about why a real programmer (as opposed to a Dun-Krueger OOP programmer) would ever want to do this exercise, assume you are given 1 million $ reward if you can provide a as-possibly-correct-as-reasonably-feasible answer. So our programmer has every motivation to get this as right as possible. Good
18:28:01 <Ashkan> enough:D  ?
18:28:16 <EvanR> unless you never get anything from the server except after sending a message, and you get everything immediately
18:28:57 <Ashkan> The *game* has very limited access to the outside world (ideally only input/output but has to be seen). Everything else is handled by the *server* that hosts the game
18:29:00 <EvanR> in which case you can loop get command, send command, wait for response, print response
18:29:00 <int-e> Note that what you ended up with is a limited I/O abstraction with no relation to games when we ignore the identifiers.
18:29:34 hugo joins (znc@verdigris.lysator.liu.se)
18:29:58 <Ashkan> Essentially server provides input/output functions to the games. Games are to express their logic using the methods in the type-classes when they need input or are ready to emit an output
18:30:04 <int-e> How is this supposed to help with correctness...
18:30:27 <int-e> Eh, I don't think we'll agree that this is in any way useful. I'll shut up.
18:31:16 × Major_Biscuit quits (~MajorBisc@c-001-031-036.client.tudelft.eduvpn.nl) (Ping timeout: 252 seconds)
18:31:19 <EvanR> > forever ((getLine >>= sendCommand) >> (awaitResponse >>= putStrLn))
18:31:21 <lambdabot> error:
18:31:21 <lambdabot> Variable not in scope: sendCommand :: String -> IO a0error:
18:31:21 <lambdabot> Variable not in scope: awaitResponse :: IO String
18:31:31 <EvanR> I meant to do that
18:31:43 <Ashkan> I am *defining* a game as "something that doesn't do IO, only needs input and provides output as it processes the inputs and progresses the state"
18:32:16 <EvanR> are you talking about the server code or client code, because I think I just solved every client of this class above
18:33:14 × man_max quits (~man_max@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
18:34:00 <Ashkan> You guys simply can not accept that I *can* define notions that might not make much sense to you. The way to go is to just accept those notions from me (who is *defining* a world with those notions as the problem space) and then evaluate a proposed abstraction *against those definitions,*, not against your own ideas of what a game is.
18:34:29 <Ashkan> This is all in server code
18:34:55 <int-e> 18:34:45 <Ashkan> Does this make sense https://paste.tomsmeding.com/0fxeAcDL ?
18:35:01 <int-e> Not to us, evidently.
18:36:03 <geekosaur> the point is this is almost always "wrong use of typeclass"
18:36:17 <int-e> At least now it sounds more like you want a kind of sandbox.
18:36:19 <geekosaur> sure, you can define it. and make your life hell later
18:36:31 <int-e> That wasn't clear 5 minutes ago.
18:36:40 <geekosaur> becuase if it's "wring use of typeclass" it WILL bite you later
18:36:51 <geekosaur> *wrong
18:36:52 × mncheck quits (~mncheck@193.224.205.254) (Ping timeout: 246 seconds)
18:36:59 cassiopea joins (~cassiopea@user/cassiopea)
18:37:07 Major_Biscuit joins (~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a)
18:37:30 freeside joins (~mengwong@122.11.248.245)
18:37:35 <int-e> It's still useless without concrete types for i and o; and the distinction between realtime and non-realtime is still tenuous.
18:37:51 <int-e> And wouldn't implementors be better served with having a game-specific EDSL?
18:38:11 man_max joins (~man_max@94-43-231-47.dsl.utg.ge)
18:39:28 <dminuoso> Sigh, GHC strikes again.
18:39:38 <int-e> @ghc
18:39:39 <lambdabot> The signature contexts in a mutually recursive group should all be identical
18:39:52 <dminuoso> `No instance for (Database.PostgreSQL.Simple.ToField.ToField EMailAddress) arising from a use of ‘executeMany’`
18:40:06 <dminuoso> Let me ask a perhaps weird question, but what is the factual information here?
18:40:17 <dminuoso> GHC is not telling me *why* the constraint arises.
18:40:38 <Ashkan> A game accepts only values of a certain type as input `i` and can produce values of a certain type as output `o`. Why do you need concrete types for that to make sense ?
18:41:27 <dminuoso> Oh gah, I think I know why. GHC could really do better, perhaps something like `Hey, in your use of executeMany I had to resolve ToRow a, I picked this instance, that instance introduced that new constraint I couldnt satisfy`...
18:41:36 <EvanR> another thing is sometimes a record instead of a typeclass is more flexible, so maybe you can combine and nest games dynamically
18:41:36 Guest31 joins (~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
18:41:38 <mauke> <EvanR> non-blocking I/O is this thing you need in C because multiple threads are so painful <- and in Haskell, if you want tractable semantics
18:41:41 <Ashkan> int-e about the EDSL, they could be ... but how does that related to input/output ? in a way this is a very minimal DSL for input/output.
18:41:51 <int-e> dminuoso: Is that the whole error? But it's clearly from simplifying a ToRow constraint, as you're finding out.
18:42:12 <dminuoso> int-e: Yes (well there's some source hint where it originated from)
18:42:25 <dminuoso> It's just incredibly frustrating to not have more details how this constraint arised.
18:42:37 <dminuoso> Especially because GHC *knows* why, it did the journey itself.
18:42:41 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 265 seconds)
18:43:00 <int-e> . o O ( arose )
18:43:10 <int-e> (or a-rows?)
18:43:24 <dminuoso> Yeah I guess arose.
18:43:34 y04nn joins (~username@2a03:1b20:5:f011::aaae)
18:43:42 <dminuoso> But unless GHC gets better at diagnostics, Im not going to improve my English.
18:43:46 <dminuoso> Im holding it hostage that way.
18:43:52 <int-e> dminuoso: it probably doesn't remember the constraint simplification steps
18:44:12 <int-e> dminuoso: you're not hurting GHC, you're hurting people
18:44:22 <dminuoso> Oh I see. So I should just stop improving my Haskell then.
18:44:49 <dminuoso> Think it will budge?
18:46:11 <int-e> I doubt it. I mean, yes, it would be nice to have an indication that the constraint used to be a "ToRow" constraint originally, rather than having to wade through the docs for that information. But I suspect the information is not readily available anymore when the type error manifests.
18:46:18 × Major_Biscuit quits (~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a) (Ping timeout: 252 seconds)
18:52:19 <dminuoso> Okay. So the underlying error was using [] instead of ()
18:52:38 <dminuoso> I will just file this under "typeclasses are not fun"
18:53:12 hugo joins (znc@verdigris.lysator.liu.se)
18:53:38 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
18:55:49 <int-e> dminuoso: Huh, how did it arrive at EMailAddress specifically then? I guess it depends on where you put that []...
18:56:22 <dminuoso> Oh I just wrote `executeMany conn qry [toEntity <$> addresses]` with addresses being a list
18:57:10 <dminuoso> Which produced some `[[EMailAddress]]`, so it ended up having to solve for `ToRow [EmailAddress]`, matching up with ToField a => ToRow [a]
18:57:53 <dminuoso> Its kind of funny because I remember wondering "dont I need a =<< here? this looks like a nested list.. uh I dont know - the compiler will surely tell me if Im doing something wrong"
18:58:27 <int-e> Ah, and it did, but in the form of a riddle.
18:59:53 <EvanR> GHC as an imposing sphinx
19:00:19 <EvanR> your code shall not pass without answering the riddles
19:01:01 <opqdonut> oof I hate the ToRow ToField stuff
19:01:11 <opqdonut> feels like a JS API in Haskell
19:03:54 <sm> good idea for a mascot / logo EvanR
19:04:16 <EvanR> some other functional or logic languages has to have already claimed that
19:04:41 slack1256 joins (~slack1256@186.11.43.166)
19:05:36 <sm> no! it shall be ours!
19:06:50 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
19:13:36 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Remote host closed the connection)
19:19:31 <tomsmeding> I asked dall-e for "Haskell mascot" and it seems it's having trouble spelling "haskell"
19:19:40 <tomsmeding> besides choosing US sports themed stuff
19:19:49 <tomsmeding> https://tomsmeding.com/ss/get/tomsmeding/ZgJ1Gg
19:22:09 freeside joins (~mengwong@122.11.248.245)
19:23:44 <EvanR> for a split second I thought the one of the right used a lambda instead of a K
19:26:19 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
19:28:56 <sm> a most valuable haskell language post ! https://typeclasses.substack.com/p/whats-new-in-ghc-2021
19:29:36 × slack1256 quits (~slack1256@186.11.43.166) (Ping timeout: 255 seconds)
19:29:48 <dminuoso> "What's new in GHC 2021" - an article written in 2023.
19:29:52 <dminuoso> :)
19:30:45 <monochrom> haha
19:32:33 <monochrom> Also the wrong but credible interpretation that GHC2021 of 2023 is different from GHC2021 of 2021 hence "what's new" in 2023.
19:34:16 <monochrom> Personally I would think up the title "GHC2021 is a perfectly balanced language with no exploits" >:)
19:34:40 <monochrom> P.S. I just bought Yorkshire Tea yesterday!
19:40:08 <mauke> "The forall keyword is added, letting you explicitly bind type variable names. This is called existential quantification" - ah, yes
19:40:27 <EvanR> while we're calling everything wrong, waiting a year after GHC2021 to make a blog post doesn't add up to 2023
19:41:19 jero98772 joins (~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff)
19:42:01 <monochrom> That one is excused by "or so". :)
19:42:13 × Guest31 quits (~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
19:44:17 <EvanR> error bars!
19:48:56 ft joins (~ft@p3e9bc443.dip0.t-ipconnect.de)
19:51:02 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
19:51:07 × bhall quits (brunohall@gateway/vpn/protonvpn/bhall) (Ping timeout: 248 seconds)
19:53:30 freeside joins (~mengwong@122.11.248.245)
19:54:24 jappiejappie joins (~jappiejap@89-70-67-77.dynamic.chello.pl)
19:58:01 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 256 seconds)
20:08:34 freeside joins (~mengwong@122.11.248.245)
20:10:17 × y04nn quits (~username@2a03:1b20:5:f011::aaae) (Ping timeout: 246 seconds)
20:12:06 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 265 seconds)
20:13:07 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
20:14:04 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
20:16:48 y04nn joins (~username@2a03:1b20:5:f011::aaae)
20:18:20 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 246 seconds)
20:19:28 pavonia joins (~user@user/siracusa)
20:37:35 × Ashkan quits (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com) (Quit: Client closed)
20:40:05 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
20:40:25 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 246 seconds)
20:40:40 freeside joins (~mengwong@122.11.248.245)
20:41:19 ubert1 joins (~Thunderbi@p200300ecdf0c5775fd3777de0335b9cc.dip0.t-ipconnect.de)
20:43:29 finsternis joins (~X@23.226.237.192)
20:44:18 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 255 seconds)
20:45:12 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 255 seconds)
20:47:43 lxi joins (~quassel@2a02:2f08:4303:7700:8735:4ae1:b0f9:22e6)
20:51:37 × zeenk quits (~zeenk@2a02:2f04:a307:2300::7fe) (Quit: Konversation terminated!)
20:52:42 × y04nn quits (~username@2a03:1b20:5:f011::aaae) (Remote host closed the connection)
20:56:22 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
20:56:22 × infinity0 quits (~infinity0@pwned.gg) (Remote host closed the connection)
20:58:30 infinity0 joins (~infinity0@pwned.gg)
21:01:24 lxi_ joins (~quassel@2a02:2f08:4303:7700:6251:77c:f4b2:f7b8)
21:01:55 × lxi quits (~quassel@2a02:2f08:4303:7700:8735:4ae1:b0f9:22e6) (Ping timeout: 260 seconds)
21:04:09 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
21:04:30 bhall joins (brunohall@gateway/vpn/protonvpn/bhall)
21:05:27 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
21:14:48 freeside joins (~mengwong@122.11.248.245)
21:15:41 codaraxis joins (~codaraxis@user/codaraxis)
21:15:49 L29Ah joins (~L29Ah@wikipedia/L29Ah)
21:19:13 × man_max quits (~man_max@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
21:20:37 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
21:22:05 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8)
21:22:42 <dminuoso> mauke: Can we have an exists too for universal quantification?
21:22:55 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 260 seconds)
21:24:27 zeenk joins (~zeenk@2a02:2f04:a307:2300::7fe)
21:24:58 <mauke> ∃∃∃
21:28:46 andrew78 joins (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3)
21:29:36 <andrew78> Question about the capability library. I've got a `HasState "name" Type m`, is there a way I can use this whenever I require a `HasReader "name" Type m` ?
21:30:20 <dminuoso> HasState tag r m => HasReader (tag :: k) r (ReadStatePure m)
21:30:28 <dminuoso> andrew78: ^- does this help?
21:31:07 <dminuoso> So using the ReadStatePure newtype it seems you should be able to do something. But I dont know much about capability
21:31:09 <andrew78> dminuoso yes and no, Ar eyou suggesting I implement this dminuoso
21:31:14 <dminuoso> No, that instance exists
21:31:29 <dminuoso> https://hackage.haskell.org/package/capability-0.5.0.1/docs/src/Capability.Reader.Internal.Strategies.html#line-55
21:34:24 <andrew78> Ah I see, but then why do I get "Could not deduce (HasReader "name" Type" m)  from context (HasState "name" Type m)"? I would assume it would make use of this instance to check the type of the callee
21:35:19 <EvanR> did you use the newtype wrapper
21:35:22 × michalz quits (~michalz@185.246.207.221) (Remote host closed the connection)
21:35:39 × inversed quits (~inversed@bcdcac82.skybroadband.com) (Ping timeout: 248 seconds)
21:35:58 <andrew78> No, you mean that I should wrap my call with `ReadStatePure`?
21:36:16 <EvanR> the instance is for ReadStatePure
21:36:34 <EvanR> m
21:36:45 <andrew78> I'm sorry I don't see how that helps me. Am I supposed to use it in a deriving clause?
21:37:04 <andrew78> I'm not trying to derive an instance, I'm just trying to call a `HasReader` from a `HasState`
21:37:23 × ubert1 quits (~Thunderbi@p200300ecdf0c5775fd3777de0335b9cc.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
21:37:42 <EvanR> you apply newtype wrappers to bring in instances
21:37:53 <EvanR> like Sum 4 <> Sum 6
21:38:01 <EvanR> instead of 4 <> 6
21:38:29 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
21:38:47 <andrew78> yeah but I'm not dealing with concrete types, just with the capability classes
21:39:17 <EvanR> whatever operation you need to do is on something right. Do you have example code
21:39:37 <andrew78> I have `f :: (HasState "name" Ty) => m ()` and `g :: (HasReader "name" Ty m) => m ()` and I'm trying to do call g in f
21:39:47 freeside joins (~mengwong@122.11.248.245)
21:40:21 <andrew78> mistyped the `f`: `f :: (HasState "name" Ty m) => m ()`
21:41:31 <EvanR> ReadStatePure g
21:41:57 <andrew78> `Couldn't match type `m' with `ReadStatePure m0'`
21:42:35 <andrew78> which makes sense, I'm expecting `m` and this wraps the `m` into `ReadStatePure`. how can I get it out of `ReadStatePure` again?
21:42:35 <EvanR> is it a case of needing ScopedTypeVariables and forall to introduce m so the type checker knows it's the same m or
21:42:58 <andrew78> EvanR It's not
21:43:03 inversed joins (~inversed@bcdcac82.skybroadband.com)
21:43:27 <andrew78> I have ScopedTypeVariables and I just tried adding forall and I get the same error. It makes sense to me
21:43:33 <EvanR> well it needs to be the same underlying m
21:44:07 <andrew78> I think the problem is that `m` != `ReadStatePure m`
21:44:08 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
21:44:28 <EvanR> well you can unwrap any newtype wrapped thing
21:44:36 <andrew78> as a matter of fact, forcing the `m` with a type application gives us the expected error `Occurs check: cannot construct the infinite type:
21:44:36 <andrew78>         m ~ ReadStatePure m`
21:44:39 <andrew78> EvanR how?
21:44:48 <EvanR> :i Sum
21:44:53 <EvanR> @src Sum
21:44:53 <lambdabot> newtype Sum a = Sum { getSum :: a }
21:45:07 <EvanR> in that case they added a handy accessor, but in this case they didn't add one so you need to pattern match
21:45:36 <EvanR> > (\(Sum x) -> x) (Sum 5)
21:45:38 <lambdabot> 5
21:46:37 <andrew78> it makes no difference, I am back to square 1 with the error `Could not deduce (HasReader "name" Int m)`
21:46:57 <andrew78> I did `f = let ReadStatePure r = ReadStatePure g in r`
21:47:38 <EvanR> that does nothing
21:48:08 <andrew78> that's literally what you otld me to do, the `ReadStatePure` newtype has no accessor, so I pattern matched on it
21:48:26 <EvanR> you wrapped it and immediately unwrapped it
21:48:30 <EvanR> could just put g instead
21:48:47 <andrew78> yep, and that doesn't work, so what can I do?
21:49:08 Ashkan joins (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
21:49:21 <EvanR> normally if you needed a newtype for a new instance, you'd unwrap it after you did the thing you needed to do and got something that wasn't what you started with
21:49:31 <EvanR> > getSum (Sum 3 <> Sum 1)
21:49:33 <lambdabot> 4
21:50:12 <EvanR> when you just wrapped it and used it, I presume, and got can't match m with m0, maybe they really are different monads
21:50:34 <Ashkan> Hello all. I'm trying to derive an Applicative for my newtype using `DerivingVia` but can't wrap my head around this "representation" thingie. I read a few examples yet can't figure out how to find an *equivalent* or suitable(?) type to give `via` to work with
21:51:17 <andrew78> EvanR I am not working with concrete types, there is no monad at this point, just typeclasses
21:51:25 <Ashkan> Can someone point me to a doc or an article or something about this please ? thanks
21:52:40 <Ashkan> This is the code for reference
21:52:40 <Ashkan> ```
21:52:40 <andrew78> Ashkan I've been using this although it's not the best https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/deriving_via.html
21:52:41 <Ashkan> data Room i o = Room {ichan :: TChan i, ochan :: TChan o}
21:52:41 <Ashkan> newtype RoomT i o a = RoomT {runRoomT :: Room i o -> IO a} deriving (Functor, Applicative) via _
21:52:42 <Ashkan> ```
21:53:14 <TheMatten[m]> Ashkan: What `deriving via` does is that it uses `coerce` to "coerce" type of your newtype into some other type you mention in `deriving via` clause, and basically reuses it's instance - see https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Coerce.html for how `coerce` works
21:53:32 <Ashkan> andrew78 thanks. Yeah read that already, can't figure it out for my case thought ...
21:54:09 <TheMatten[m]> Ashkan: You probably want `deriving (Functor, Applicative, Monad) via ReaderT (Room i o) IO`
21:55:28 <TheMatten[m]> Because `ReaderT r m a` is newtype over `r -> m a`, which matches shape of your inner type
21:57:47 <Ashkan> I was thinking Kleisli perhaps ... but honestly can't yet form an intuition around this
21:58:03 <Ashkan> by the way, what is a "representation" of a type, exactly ?
21:58:50 × jappiejappie quits (~jappiejap@89-70-67-77.dynamic.chello.pl) (Quit: Client closed)
22:00:45 <TheMatten[m]> Ashkan: Hmm, yeah, but usually you'll probably want to derive in terms of types from `transformers`/`mtl`, because those have parameters in convenient order when you want to compose them
22:00:56 <TheMatten[m]> Ashkan: I guess that sort of depends on context in which you're asking
22:01:58 <TheMatten[m]> You may say two types have same "representation" if they're "coercible" through `coerce` interface (which I guess is your case here)
22:02:12 <Ashkan> Let me tell you my understanding and you tell me were I'm wrong:
22:02:13 <Ashkan> A `newtype` is essentially a wrapper around some other type. This other type is the representation of the newtype
22:03:04 <Ashkan> So `newtype Foo a b = Foo { name :: <some-type of a and b> }` then "<some type of a and b>" is the representation here
22:03:07 <Ashkan> so far correct ?
22:03:26 <TheMatten[m]> Ashkan: I mean, yeah, in principle
22:03:26 <TheMatten[m]> You could have nested newtypes too, and you can imagine that they could too be unwrapped to expose type that doesn't have any newtypes
22:03:32 <mauke> the <...> part does not have to use a or b
22:04:11 <Ashkan> yeah could be phantoms (that's the name, right ?) but didn't want to complicate things
22:05:33 <Ashkan> Now it comes to logic that since `newtype` (at least the simple, one layer ones) do not hide any inner structure or something, then essentially GHC should in principle be able to derive instances for the `newtype` if it can derive (or find) the instance for the representation, right ?
22:08:02 <mauke> Ashkan: https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/newtype_deriving.html
22:08:37 <Ashkan> I've read all the standard doc, except for this `coerce` thingie:D
22:09:10 <mauke> you don't need coerce for generalized newtype deriving, though
22:09:26 <Ashkan> my problem is I can't figure out *how* to arrive at the suitable representation of my type to give it to `via`
22:10:06 <Ashkan> mauke yeah but generelized deriving failed with a message to the effect that it can not arrive at the proper eta-reduction
22:10:35 <Ashkan> That's why I turned into the (to my understanding) more powerful `DervivingVia`
22:10:38 freeside joins (~mengwong@122.11.248.245)
22:10:47 <mauke> why not just write the instance manually?
22:11:43 <Ashkan> mauke I did actually ! yet I have a feeling that if I did everything right, then GHC should be able to derive all the way to `MonadIO` with minimal help from me
22:11:52 <mauke> but yeah, what TheMatten[m] said
22:12:19 <mauke> your type is essentially a composition of IO and (Room i o ->) applied to a
22:12:36 <mauke> which corresponds to ReaderT ArgumentType IO
22:13:24 <Ashkan> it is `Room i o -> IO a` . Trying to figure out a representation for it (?) although it is itself a representation of something else:D
22:13:49 <mauke> newtype RoomT i o a = RoomT{ runRoomT :: ReaderT (Room i o) IO a } deriving (Functor, Applicative) -- :-)
22:14:07 <Ashkan> But isn't `ReaderT a IO` the opposite ? is it not supposed to produce an `a` in an `IO` setting ?
22:14:57 <mauke> no, ReaderT Env IO a produces an `a` in an `IO` setting *given some environment of type `Env`*
22:15:21 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
22:15:39 <mauke> @src ReaderT
22:15:39 <lambdabot> Source not found. I am sorry.
22:15:42 <mauke> :-(
22:15:53 <Ashkan> Ohhhh ... I see ... so it is essentially `Env -> IO a` . This is exactly like my case actually
22:16:07 <mauke> https://hackage.haskell.org/package/transformers-0.6.1.0/docs/src/Control.Monad.Trans.Reader.html#ReaderT
22:16:19 <andrew78> Sorry to interrupt but I think I've found the solution to my problem from earlier:
22:16:19 <andrew78> ```
22:16:20 <andrew78> g :: HasReader "name" Int m => m ()
22:16:20 <andrew78> g = pure ()
22:16:21 <andrew78> f :: HasState "name" Int m => m ()
22:16:21 <andrew78> f = magnify @"name" @ReadStatePure @'[] g
22:16:22 <andrew78> ```
22:16:44 <mauke> pasting into IRC is not a good idea
22:16:55 <davean> Ashkan: its *litterly* Env -> IO a
22:17:03 <davean> infact, -> is a reader
22:17:06 <mauke> lrtly
22:17:21 <Ashkan> Yeah I see your point ...
22:17:30 <Ashkan> Woow I can model a lot of stuff lie this:D
22:17:35 <davean> https://hackage.haskell.org/package/mtl-2.3.1/docs/src/Control.Monad.Reader.Class.html#line-107
22:17:42 <Ashkan> like* this
22:17:44 <davean> Like seriously LITTERLY
22:17:52 <mauke> *literally
22:18:15 <mauke> yeah, (->) is the "naked reader" form
22:18:22 <davean> Env -> IO a, is EXACTLY MonadReader Env ->
22:18:24 <mauke> without the newtype wrapper
22:18:46 <davean> So you can use it *directly*
22:18:52 <mauke> but -> has no corresponding transformer form, which is what you need in your case to get "into" IO
22:19:00 <mauke> hence ReaderT
22:19:03 <davean> Right
22:19:17 × zeenk quits (~zeenk@2a02:2f04:a307:2300::7fe) (Quit: Konversation terminated!)
22:19:22 <Ashkan> Yeah, I'm seeing the light. Thanks guys. This really helps me.
22:20:00 <davean> I think it helps to see thats the exact thing MonadReader is and every other form is a juggling to make some sort of ergonomics nicer
22:21:03 <mauke> MonadReader is the general interface for all types that provide an environment of some sort
22:21:28 <mauke> you could probably define a MonadReader instance for State
22:23:20 <davean> mauke: eh ... it wouldn't really be lawful?
22:24:43 <davean> I mean you can make the instance but I think it would be semanticly incorrect
22:26:03 × Ashkan quits (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com) (Ping timeout: 260 seconds)
22:26:13 <EvanR> andrew78, you can think of variables like m0 during type checking as an unknown by specific type, and the same rules apply as if it was a known specific type like Maybe
22:26:22 <EvanR> unknown but specific*
22:27:22 <EvanR> hypothetical types
22:27:43 <EvanR> that the code is in an instance definition vs a normal function definition doesn't matter
22:31:35 × andrew78 quits (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3) (Quit: Client closed)
22:32:33 freeside joins (~mengwong@122.11.248.245)
22:36:21 andrew86 joins (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3)
22:37:15 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 256 seconds)
22:40:19 × biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer)
22:42:18 man_max joins (~man_max@94-43-231-47.dsl.utg.ge)
22:43:18 Ashkan joins (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
22:43:18 Tuplanolla joins (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi)
22:45:20 biberu joins (~biberu@user/biberu)
22:49:38 yangby joins (~secret@183.128.104.108)
22:49:39 × andrew86 quits (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3) (Quit: Client closed)
22:50:45 × yangby quits (~secret@183.128.104.108) (Client Quit)
22:58:48 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
23:00:23 freeside joins (~mengwong@122.11.248.245)
23:04:19 × bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
23:05:28 <Profpatsch> Ashkan: in case you don’t need Monad and Applicative suffices, you can even just use `Compose f g` and its instance (Applicative f, Applicative g) => Applicative (Compose f g)
23:05:37 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
23:05:42 <Profpatsch> It provides a blanket instance for every Applicative nesting
23:06:11 <Profpatsch> For Monad you need transformers unfortunately, cause you can’t just stack them in any order
23:06:59 <Profpatsch> (the blanket Applicative instance for Compose was something that blew my mind a few months ago)
23:07:00 andrew56 joins (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3)
23:07:23 <Ashkan> Profpatsch good to know. In my case, I needed all the way down to `MonadIO`
23:07:28 × andrew56 quits (~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3) (Client Quit)
23:07:53 <Profpatsch> It even has an instance (Applicative f, Selective g) => Selective (Compose f g) if you want to get fancy
23:08:08 <Profpatsch> But Selective is … out there
23:08:25 <Profpatsch> I haven’t yet found a good use for it
23:08:48 <Ashkan> The actually running of the room is a bit ugly though `liftIO . forkIO $ runReaderT (R.runRoomT (Cn.mkGame 0 1)) room`. I'm thinking maybe somehow get rid of the two `run-`s `runReaderT` and `R.runRoomT`
23:09:33 <Profpatsch> Ashkan: just write a wrapper function I guess
23:09:43 <Profpatsch> And don’t expose the deconstructor
23:09:50 <Ashkan> maybe I don't need a `newtype` and a simple alias (`type Room ... = ...`) would do ?
23:10:06 × man_max quits (~man_max@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
23:10:07 <Profpatsch> Ashkan: I’d always go for newtype unless you have a really good reason
23:10:20 <Ashkan> Yeah, I'm keeping it. You are right.
23:10:20 <Profpatsch> lens-newtype-level good reason
23:10:29 <Profpatsch> err lens-type-alias-level good
23:10:44 <Profpatsch> type aliases have never given my anything but pain in Haskell
23:11:08 <Profpatsch> And with deriving via I feel like there’s really no “too much boilerplate” excuse anymore
23:11:29 <Ashkan> I can do a `runRoom :: RoomT -> Room -> IO a`. That what you meant by wrapper function ?
23:11:37 <Profpatsch> Ashkan: e.g. https://cohost.org/Profpatsch/post/802219-deriving-via-is-aweso
23:13:17 <Profpatsch> Ashkan: I’d say just write them as you need them, you’ll see which kinds of wrapper functions make sense to reduce boilerplate
23:13:59 × acidjnk quits (~acidjnk@p200300d6e715c492f5536687732e5bb6.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
23:14:03 <Ashkan> +1
23:14:44 <EvanR> even if the line of code is only used once, you can give it a name to signal the purpose and move it to its own line
23:15:44 <EvanR> and make the surrounding code easier to read, possibly
23:16:05 <EvanR> with transformers it seems like you need an entire army of such functions
23:17:13 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 265 seconds)
23:17:43 × trev quits (~trev@user/trev) (Ping timeout: 250 seconds)
23:19:29 trev joins (~trev@user/trev)
23:21:28 × Ashkan quits (~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com) (Ping timeout: 260 seconds)
23:25:51 × xff0x quits (~xff0x@ai098135.d.east.v6connect.net) (Ping timeout: 255 seconds)
23:27:36 xff0x joins (~xff0x@178.255.149.135)
23:28:56 × mei quits (~mei@user/mei) (Remote host closed the connection)
23:29:32 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
23:31:23 mei joins (~mei@user/mei)
23:34:40 freeside joins (~mengwong@122.11.248.245)
23:37:56 segfaultfizzbuzz joins (~segfaultf@108.211.201.53)
23:38:51 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 248 seconds)
23:41:17 × xff0x quits (~xff0x@178.255.149.135) (Ping timeout: 256 seconds)
23:42:08 azimut joins (~azimut@gateway/tor-sasl/azimut)
23:42:48 xff0x joins (~xff0x@2405:6580:b080:900:b038:d8ec:f483:463a)
23:45:53 × trev quits (~trev@user/trev) (Remote host closed the connection)
23:49:00 × chele_ quits (~chele@user/chele) (Remote host closed the connection)
23:54:26 × xff0x quits (~xff0x@2405:6580:b080:900:b038:d8ec:f483:463a) (Ping timeout: 265 seconds)
23:54:48 xff0x joins (~xff0x@ai098135.d.east.v6connect.net)
23:54:49 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
23:55:43 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
23:55:43 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
23:55:43 wroathe joins (~wroathe@user/wroathe)
23:56:31 × mmhat quits (~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.8)

All times are in UTC on 2023-03-16.