2023/10/18

2023-10-18 00:05:41 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 260 seconds)
2023-10-18 00:06:39 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-10-18 00:14:48 +0200malte(~malte@mal.tc) (Remote host closed the connection)
2023-10-18 00:15:58 +0200malte(~malte@mal.tc)
2023-10-18 00:21:28 +0200__monty__(~toonn@user/toonn) (Quit: leaving)
2023-10-18 00:22:19 +0200fweht(uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 00:22:41 +0200tzh_(~tzh@c-71-193-181-0.hsd1.or.comcast.net)
2023-10-18 00:25:02 +0200tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Ping timeout: 258 seconds)
2023-10-18 00:25:22 +0200lisbeths(uid135845@id-135845.lymington.irccloud.com)
2023-10-18 00:25:54 +0200malte(~malte@mal.tc) (Remote host closed the connection)
2023-10-18 00:26:05 +0200gmg(~user@user/gehmehgeh) (Quit: Leaving)
2023-10-18 00:27:08 +0200malte(~malte@mal.tc)
2023-10-18 00:32:44 +0200waleee(~waleee@2001:9b0:21c:e600:f2f3:f744:435d:137c) (Ping timeout: 248 seconds)
2023-10-18 00:33:10 +0200waleee(~waleee@h-176-10-137-138.na.cust.bahnhof.se)
2023-10-18 00:39:21 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com)
2023-10-18 00:41:35 +0200tzh_(~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Ping timeout: 240 seconds)
2023-10-18 00:46:21 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 00:49:45 +0200zmt01(~zmt00@user/zmt00) (Quit: Leaving)
2023-10-18 00:51:40 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
2023-10-18 00:56:39 +0200tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net)
2023-10-18 01:02:15 +0200Pozyomka(~pyon@user/pyon)
2023-10-18 01:03:04 +0200waleee(~waleee@h-176-10-137-138.na.cust.bahnhof.se) (Ping timeout: 272 seconds)
2023-10-18 01:04:01 +0200edwtjo(~edwtjo@h-46-59-62-248.A213.priv.bahnhof.se)
2023-10-18 01:04:01 +0200edwtjo(~edwtjo@h-46-59-62-248.A213.priv.bahnhof.se) (Changing host)
2023-10-18 01:04:01 +0200edwtjo(~edwtjo@fsf/member/edwtjo)
2023-10-18 01:14:13 +0200Inst(~Inst@120.244.192.250) (Ping timeout: 252 seconds)
2023-10-18 01:22:04 +0200xff0x(~xff0x@ai101218.d.east.v6connect.net) (Ping timeout: 272 seconds)
2023-10-18 01:22:45 +0200 <EvanR> githubs syntax coloring for haskell is annoying because it colors stuff like Char and Bool one color but "user defined data types" another color. Except Char and Bool are defined the same way
2023-10-18 01:23:39 +0200xff0x(~xff0x@ai101218.d.east.v6connect.net)
2023-10-18 01:29:53 +0200thegeekinside(~thegeekin@189.180.124.118) (Remote host closed the connection)
2023-10-18 01:32:07 +0200chomwitt(~chomwitt@ppp-94-67-206-212.home.otenet.gr) (Ping timeout: 264 seconds)
2023-10-18 01:32:17 +0200Inst(~Inst@120.244.192.250)
2023-10-18 01:33:43 +0200 <EvanR> which makes those definitions in GHC.Base look extra funny
2023-10-18 01:35:32 +0200harveypwca(~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db) (Quit: Leaving)
2023-10-18 01:43:53 +0200adanwan_(~adanwan@gateway/tor-sasl/adanwan)
2023-10-18 01:44:27 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2023-10-18 01:44:39 +0200adanwan(~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 252 seconds)
2023-10-18 01:44:51 +0200Luj(~Luj@2a01:e0a:5f9:9681:c367:ba44:42cf:91d7) (Quit: Ping timeout (120 seconds))
2023-10-18 01:45:09 +0200Luj(~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb)
2023-10-18 01:45:32 +0200aforemny_(~aforemny@2001:9e8:6cf3:2200:78b4:c4c0:dc3:eb14) (Ping timeout: 258 seconds)
2023-10-18 01:45:32 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds)
2023-10-18 01:46:06 +0200aforemny(~aforemny@i59F516F9.versanet.de)
2023-10-18 01:47:29 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-10-18 01:48:03 +0200Alleria(~JohnGalt@user/alleria)
2023-10-18 01:49:25 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 252 seconds)
2023-10-18 01:51:38 +0200Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 255 seconds)
2023-10-18 02:07:21 +0200zmt00(~zmt00@user/zmt00)
2023-10-18 02:15:52 +0200emmanuelux(~emmanuelu@user/emmanuelux) (Quit: au revoir)
2023-10-18 02:19:59 +0200thegeekinside(~thegeekin@189.180.124.118)
2023-10-18 02:29:27 +0200jrm(~jrm@user/jrm) (Quit: ciao)
2023-10-18 02:30:21 +0200jespada(~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Ping timeout: 260 seconds)
2023-10-18 02:33:16 +0200jespada(~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net)
2023-10-18 02:35:31 +0200jrm(~jrm@user/jrm)
2023-10-18 02:44:02 +0200danza(~francesco@ge-19-118-207.service.infuturo.it)
2023-10-18 02:44:28 +0200ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 248 seconds)
2023-10-18 02:45:10 +0200ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net)
2023-10-18 02:49:30 +0200Sciencentistguy6(~sciencent@hacksoc/ordinary-member)
2023-10-18 02:51:45 +0200Sciencentistguy(~sciencent@hacksoc/ordinary-member) (Ping timeout: 255 seconds)
2023-10-18 02:51:46 +0200Sciencentistguy6Sciencentistguy
2023-10-18 02:53:14 +0200thyriaen(~thyriaen@2a01:aea0:dd4:7157:6245:cbff:fe9f:48b1)
2023-10-18 02:53:55 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it)
2023-10-18 02:55:59 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 255 seconds)
2023-10-18 02:56:45 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915)
2023-10-18 02:57:58 +0200whatsupdoc(uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 02:58:45 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed)
2023-10-18 03:01:01 +0200phma_(phma@2001:5b0:211b:9d88:b368:1baa:7a2:22b7)
2023-10-18 03:04:32 +0200phma(~phma@host-67-44-208-18.hnremote.net) (Ping timeout: 255 seconds)
2023-10-18 03:05:20 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 03:07:14 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2023-10-18 03:07:36 +0200hiyori(~hiyori@user/hiyori) (Quit: Client closed)
2023-10-18 03:08:05 +0200danza(~francesco@ge-19-118-207.service.infuturo.it) (Ping timeout: 240 seconds)
2023-10-18 03:37:04 +0200otto_s(~user@p5b0445cd.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
2023-10-18 03:38:41 +0200chexum(~quassel@gateway/tor-sasl/chexum) (Ping timeout: 252 seconds)
2023-10-18 03:38:45 +0200otto_s(~user@p5b044495.dip0.t-ipconnect.de)
2023-10-18 03:39:09 +0200chexum(~quassel@gateway/tor-sasl/chexum)
2023-10-18 03:39:39 +0200thyriaen(~thyriaen@2a01:aea0:dd4:7157:6245:cbff:fe9f:48b1) (Quit: Leaving)
2023-10-18 03:44:26 +0200solrize(~solrize@2601:644:8501:aaf0::86ea) (Ping timeout: 260 seconds)
2023-10-18 03:52:07 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2023-10-18 03:56:26 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it) (Remote host closed the connection)
2023-10-18 03:56:49 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it)
2023-10-18 04:11:16 +0200td_(~td@i53870913.versanet.de) (Ping timeout: 255 seconds)
2023-10-18 04:13:04 +0200td_(~td@i5387093F.versanet.de)
2023-10-18 04:16:34 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 04:16:50 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 04:26:58 +0200chexum(~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
2023-10-18 04:27:06 +0200chexum(~quassel@gateway/tor-sasl/chexum)
2023-10-18 04:29:02 +0200xff0x(~xff0x@ai101218.d.east.v6connect.net) (Ping timeout: 255 seconds)
2023-10-18 04:30:06 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2023-10-18 04:30:06 +0200finn_elija(~finn_elij@user/finn-elija/x-0085643)
2023-10-18 04:30:06 +0200finn_elijaFinnElija
2023-10-18 04:38:44 +0200phma_phma
2023-10-18 04:43:21 +0200aforemny(~aforemny@i59F516F9.versanet.de) (Ping timeout: 260 seconds)
2023-10-18 04:44:07 +0200thegeekinside(~thegeekin@189.180.124.118) (Ping timeout: 255 seconds)
2023-10-18 04:47:51 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 04:50:35 +0200aforemny(~aforemny@i59F516FB.versanet.de)
2023-10-18 04:50:37 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it) (Remote host closed the connection)
2023-10-18 04:51:00 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it)
2023-10-18 04:51:31 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 260 seconds)
2023-10-18 04:52:21 +0200Square(~Square@user/square)
2023-10-18 04:52:36 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 258 seconds)
2023-10-18 05:02:16 +0200zer0bitz_(~zer0bitz@user/zer0bitz)
2023-10-18 05:03:00 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 05:05:15 +0200zer0bitz(~zer0bitz@user/zer0bitz) (Ping timeout: 258 seconds)
2023-10-18 05:06:32 +0200Inst(~Inst@120.244.192.250) (Ping timeout: 246 seconds)
2023-10-18 05:10:17 +0200hiyori(~hiyori@user/hiyori)
2023-10-18 05:13:48 +0200Vajb(~Vajb@207.61.167.122) (Ping timeout: 248 seconds)
2023-10-18 05:17:53 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5)
2023-10-18 05:20:32 +0200xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2023-10-18 05:24:04 +0200Square3(~Square4@user/square)
2023-10-18 05:26:02 +0200danse-nr3__(~francesco@151.57.110.75)
2023-10-18 05:26:56 +0200danse-nr3_(~francesco@ge-19-118-207.service.infuturo.it) (Read error: Connection reset by peer)
2023-10-18 05:27:06 +0200aforemny(~aforemny@i59F516FB.versanet.de) (Ping timeout: 258 seconds)
2023-10-18 05:27:26 +0200aforemny(~aforemny@i59F516ED.versanet.de)
2023-10-18 05:29:00 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 05:29:30 +0200andydude(~andrewr@151.200.15.160)
2023-10-18 05:29:34 +0200ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 255 seconds)
2023-10-18 05:31:24 +0200ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net)
2023-10-18 05:45:54 +0200Vajb(~Vajb@207.61.167.122) (Ping timeout: 245 seconds)
2023-10-18 05:54:07 +0200Alleria(~JohnGalt@user/alleria) (Quit: Textual IRC Client: www.textualapp.com)
2023-10-18 05:54:42 +0200gdown(~gavin@h69-11-149-109.kndrid.broadband.dynamic.tds.net) (Ping timeout: 258 seconds)
2023-10-18 06:04:53 +0200euleritian(~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 06:05:11 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 06:06:35 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-10-18 06:07:11 +0200sabino(~sabino@user/sabino) (Quit: Lambda _ -> x)
2023-10-18 06:10:52 +0200gabiruh(~gabiruh@vps19177.publiccloud.com.br) (Ping timeout: 272 seconds)
2023-10-18 06:11:38 +0200gabiruh(~gabiruh@vps19177.publiccloud.com.br)
2023-10-18 06:21:27 +0200danse-nr3__(~francesco@151.57.110.75) (Ping timeout: 255 seconds)
2023-10-18 06:33:58 +0200rosco(~rosco@yp-150-69.tm.net.my)
2023-10-18 06:40:13 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds)
2023-10-18 06:42:26 +0200danse-nr3(~francesco@151.57.110.75)
2023-10-18 06:45:20 +0200euleritian(~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de)
2023-10-18 06:47:25 +0200qqq(~qqq@92.43.167.61)
2023-10-18 06:53:43 +0200Square3(~Square4@user/square) (Ping timeout: 255 seconds)
2023-10-18 06:55:35 +0200johnw(~johnw@69.62.242.138) (Quit: ZNC - http://znc.in)
2023-10-18 06:55:54 +0200euleritian(~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Ping timeout: 245 seconds)
2023-10-18 06:55:56 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-10-18 07:00:22 +0200euleritian(~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de)
2023-10-18 07:03:53 +0200Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2023-10-18 07:04:44 +0200euleritian(~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Ping timeout: 248 seconds)
2023-10-18 07:05:52 +0200euleritian(~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de)
2023-10-18 07:09:08 +0200vglfr(~vglfr@88.155.159.184)
2023-10-18 07:09:12 +0200andydude(~andrewr@151.200.15.160) ()
2023-10-18 07:14:39 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 07:19:13 +0200euleritian(~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 07:19:15 +0200takuan(~takuan@178-116-218-225.access.telenet.be)
2023-10-18 07:19:25 +0200sm(~sm@plaintextaccounting/sm) (Ping timeout: 258 seconds)
2023-10-18 07:19:30 +0200euleritian(~euleritia@77.22.252.56)
2023-10-18 07:24:12 +0200vglfr(~vglfr@88.155.159.184) (Read error: Connection reset by peer)
2023-10-18 07:24:34 +0200vglfr(vglfr@gateway/vpn/protonvpn/vglfr)
2023-10-18 07:25:23 +0200chomwitt(~chomwitt@2a02:587:7a17:8900:1ac0:4dff:fedb:a3f1)
2023-10-18 07:26:33 +0200rgw(~R@2605:a601:a0df:5600:88:c751:f921:bfac) (Read error: Connection reset by peer)
2023-10-18 07:28:54 +0200michalz(~michalz@185.246.207.221)
2023-10-18 07:37:09 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-10-18 07:38:19 +0200johnw(~johnw@69.62.242.138)
2023-10-18 07:40:44 +0200rosco(~rosco@yp-150-69.tm.net.my) (Read error: Connection reset by peer)
2023-10-18 07:42:11 +0200euleritian(~euleritia@77.22.252.56) (Ping timeout: 255 seconds)
2023-10-18 07:42:34 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds)
2023-10-18 07:42:38 +0200vglfr(vglfr@gateway/vpn/protonvpn/vglfr) (Ping timeout: 255 seconds)
2023-10-18 07:42:54 +0200rosco(~rosco@193.138.218.161)
2023-10-18 07:42:59 +0200vglfr(~vglfr@88.155.159.184)
2023-10-18 07:47:55 +0200euleritian(~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de)
2023-10-18 07:48:46 +0200whatsupdoc(uid509081@id-509081.hampstead.irccloud.com)
2023-10-18 07:50:38 +0200Inst(~Inst@120.244.192.250)
2023-10-18 07:52:33 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 07:54:56 +0200lisbeths(uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 07:55:31 +0200shriekingnoise(~shrieking@186.137.175.87) (Ping timeout: 255 seconds)
2023-10-18 07:56:56 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 07:57:40 +0200 <dminuoso> The only annoying part here is that it is not customizable.
2023-10-18 07:57:57 +0200 <dminuoso> So you are subject to someone elses opinion, as with any syntax highlighter or formatter.
2023-10-18 07:58:38 +0200Square3(~Square4@user/square)
2023-10-18 08:05:25 +0200sm(~sm@plaintextaccounting/sm) (Ping timeout: 258 seconds)
2023-10-18 08:06:41 +0200acidjnk_new(~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de)
2023-10-18 08:17:35 +0200bradparker(sid262931@id-262931.uxbridge.irccloud.com) (Ping timeout: 240 seconds)
2023-10-18 08:18:15 +0200rosco(~rosco@193.138.218.161) (Ping timeout: 240 seconds)
2023-10-18 08:20:07 +0200gooba(~gooba@90-231-13-185-no3430.tbcn.telia.com) (Ping timeout: 255 seconds)
2023-10-18 08:20:18 +0200rosco(~rosco@193.138.218.161)
2023-10-18 08:20:50 +0200bradparker(sid262931@id-262931.uxbridge.irccloud.com)
2023-10-18 08:24:43 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-10-18 08:31:58 +0200friendshipaka(~Friendshi@user/Friendship) (Read error: Connection reset by peer)
2023-10-18 08:32:18 +0200friendshipaka(~Friendshi@user/Friendship)
2023-10-18 08:33:37 +0200td_(~td@i5387093F.versanet.de) (Ping timeout: 255 seconds)
2023-10-18 08:43:50 +0200gooba(~gooba@90-231-13-185-no3430.tbcn.telia.com)
2023-10-18 08:43:50 +0200td_(~td@i5387091B.versanet.de)
2023-10-18 08:45:36 +0200p3n_(~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1) (Quit: ZNC 1.8.2 - https://znc.in)
2023-10-18 08:46:31 +0200euleritian(~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 08:46:48 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 08:49:04 +0200p3n(~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1)
2023-10-18 08:49:21 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 08:53:51 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds)
2023-10-18 08:57:56 +0200fendor(~fendor@2a02:8388:1640:be00:aab:1226:f274:5021)
2023-10-18 09:03:56 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-10-18 09:04:24 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.5)
2023-10-18 09:04:42 +0200lottaquestions(~nick@2607:fa49:503d:b200:641c:fc5a:8196:c097)
2023-10-18 09:05:54 +0200lottaquestions_(~nick@2607:fa49:503d:b200:aeea:7f35:a3ca:4b4a) (Ping timeout: 245 seconds)
2023-10-18 09:09:04 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 09:09:28 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 272 seconds)
2023-10-18 09:10:14 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-10-18 09:15:30 +0200gmg(~user@user/gehmehgeh)
2023-10-18 09:25:43 +0200danse-nr3(~francesco@151.57.110.75) (Read error: Connection reset by peer)
2023-10-18 09:25:53 +0200danse-nr3(~francesco@151.47.117.140)
2023-10-18 09:32:55 +0200CiaoSen(~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef)
2023-10-18 09:33:24 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds)
2023-10-18 09:35:03 +0200dcoutts(~duncan@net77-43-75-226.mclink.it)
2023-10-18 09:38:43 +0200mc47(~mc47@xmonad/TheMC47)
2023-10-18 09:40:33 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 09:40:34 +0200Pickchea(~private@user/pickchea)
2023-10-18 09:40:54 +0200Jackneill(~Jackneill@20014C4E1E0E6F00DA1379EF70CDB149.dsl.pool.telekom.hu)
2023-10-18 09:43:28 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 09:44:05 +0200danse-nr3(~francesco@151.47.117.140) (Ping timeout: 246 seconds)
2023-10-18 09:47:11 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 255 seconds)
2023-10-18 09:50:33 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Ping timeout: 245 seconds)
2023-10-18 09:52:58 +0200danse-nr3(~francesco@151.47.117.140)
2023-10-18 09:56:12 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-10-18 09:56:36 +0200chele(~chele@user/chele)
2023-10-18 10:00:32 +0200dcoutts(~duncan@net77-43-75-226.mclink.it) (Ping timeout: 246 seconds)
2023-10-18 10:02:13 +0200remexre(~remexre@user/remexre) (Ping timeout: 252 seconds)
2023-10-18 10:10:47 +0200econo_(uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 10:11:51 +0200remexre(~remexre@user/remexre)
2023-10-18 10:14:54 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 10:22:26 +0200 <danse-nr3> NonNull seems interesting hackage.haskell.org/package/mono-traversable-1.0.15.3/docs/Data-NonNull.html, wondering why it seems to exist only within mono-traversable
2023-10-18 10:24:51 +0200__monty__(~toonn@user/toonn)
2023-10-18 10:34:19 +0200dsrt^(~cd@76.145.193.217) (Remote host closed the connection)
2023-10-18 10:34:19 +0200cuiltb^(~cd@76.145.193.217) (Remote host closed the connection)
2023-10-18 10:34:37 +0200dsrt^(~cd@76.145.193.217)
2023-10-18 10:34:37 +0200cuiltb^(~cd@76.145.193.217)
2023-10-18 10:35:55 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 10:36:34 +0200dcoutts(~duncan@net77-43-75-226.mclink.it)
2023-10-18 10:39:01 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-10-18 10:42:55 +0200billchenchina(~billchenc@2a0c:b641:7a2:230::10) (Ping timeout: 264 seconds)
2023-10-18 10:46:31 +0200dcoutts(~duncan@net77-43-75-226.mclink.it) (Ping timeout: 255 seconds)
2023-10-18 10:49:23 +0200zer0bitz_zer0bitz
2023-10-18 10:52:14 +0200zer0bitz(~zer0bitz@user/zer0bitz) ()
2023-10-18 10:54:45 +0200kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2023-10-18 10:58:07 +0200zer0bitz(~zer0bitz@user/zer0bitz)
2023-10-18 10:58:46 +0200 <Athas> How do you install Accelerate nowadays? Which versions of GHC is it compatible with? Is there a shell.nix somewhere that just does everything for me?
2023-10-18 11:01:22 +0200Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2023-10-18 11:03:49 +0200azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
2023-10-18 11:07:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds)
2023-10-18 11:09:36 +0200 <tomsmeding> Athas: No explicit nix support (yet). The master branch versions (of accelerate{,-llvm{,-native,-ptx}}) are compatible with, I believe, 8.10 through 9.4
2023-10-18 11:09:45 +0200 <tomsmeding> you'll need LLVM <= 14
2023-10-18 11:09:48 +0200 <tomsmeding> er, <= 15
2023-10-18 11:09:48 +0200Guest97(~Guest97@163.116.195.115)
2023-10-18 11:09:52 +0200lortabac(~lortabac@89.207.171.151)
2023-10-18 11:10:17 +0200euleritian(~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de)
2023-10-18 11:10:34 +0200Guest97(~Guest97@163.116.195.115) (Client Quit)
2023-10-18 11:10:53 +0200dcoutts(~duncan@net77-43-75-226.mclink.it)
2023-10-18 11:11:17 +0200 <tomsmeding> (note that if you build 'accelerate' master with -fdebug, you'll need to add 'post-checkout-command: git submodule update --init --recursive' to the 'source-repository-package' cabal.project stanza)
2023-10-18 11:11:28 +0200 <tomsmeding> (the default is -f-debug)
2023-10-18 11:11:55 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 11:12:34 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-10-18 11:14:19 +0200 <tomsmeding> the hackage 1.3 versions still work, but require LLVM <= 12 (iirc)
2023-10-18 11:15:01 +0200 <tomsmeding> for GPU you'll need cuda <= 11, due to issues with c2hs/language-c
2023-10-18 11:15:51 +0200vglfr(~vglfr@88.155.159.184) (Ping timeout: 240 seconds)
2023-10-18 11:16:52 +0200lortabac(~lortabac@89.207.171.151) (Remote host closed the connection)
2023-10-18 11:17:14 +0200lortabac(~lortabac@89.207.171.151)
2023-10-18 11:19:04 +0200ubert(~Thunderbi@178.165.203.252.wireless.dyn.drei.com)
2023-10-18 11:21:37 +0200 <Athas> tomsmeding: what about the released versions? I always found it a bit difficult to figure out how to put together the half dozen different Accelerate repositories I need.
2023-10-18 11:21:55 +0200qqq(~qqq@92.43.167.61) (Ping timeout: 255 seconds)
2023-10-18 11:23:32 +0200 <Athas> Hm, the releases look three years old, so I suppose they are not representative anymore.
2023-10-18 11:25:57 +0200 <tomsmeding> Athas: the released versions work fine if you are okay with installing LLVM 12 :p
2023-10-18 11:26:21 +0200 <tomsmeding> 'accelerate' is the surface language plus the interpreter; the compiled backends are accelerate-llvm-native and accelerate-llvm-ptx
2023-10-18 11:27:13 +0200lortabac(~lortabac@89.207.171.151) (Remote host closed the connection)
2023-10-18 11:27:27 +0200tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Quit: zzz)
2023-10-18 11:27:38 +0200lortabac(~lortabac@89.207.171.151)
2023-10-18 11:28:56 +0200 <tomsmeding> for the master branch versions, the package names are the same and live under github.com/AccelerateHS/
2023-10-18 11:29:21 +0200rosco(~rosco@193.138.218.161) (Ping timeout: 258 seconds)
2023-10-18 11:31:14 +0200vglfr(~vglfr@88.155.159.184)
2023-10-18 11:34:01 +0200lortabac(~lortabac@89.207.171.151) (Ping timeout: 260 seconds)
2023-10-18 11:34:11 +0200 <haskellbridge> <A​quas> How does accelerate work? It interpretes its surface syntax to cuda C code via LLVM?
2023-10-18 11:34:31 +0200 <tomsmeding> basically
2023-10-18 11:34:48 +0200 <tomsmeding> the "interprets" is a reasonably complicated process, but yet :
2023-10-18 11:34:49 +0200 <tomsmeding> * :p
2023-10-18 11:34:55 +0200lortabac(~lortabac@89.207.171.151)
2023-10-18 11:35:07 +0200aforemny(~aforemny@i59F516ED.versanet.de) (Ping timeout: 255 seconds)
2023-10-18 11:36:28 +0200aforemny(~aforemny@i59F516FA.versanet.de)
2023-10-18 11:36:49 +0200 <haskellbridge> <A​quas> This sounds to be tweaking the GHC's compilation process. How does this work?
2023-10-18 11:37:00 +0200euleritian(~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 11:37:17 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 11:41:32 +0200 <tomsmeding> no, accelerate is "just" a library; by using the functions from the library, you're actually building a syntax tree instead of running the computations directly. (This is why you need to use 'run' to run the computation in the end.) This syntax tree then gets compiled as with a usual compiler, just at Haskell runtime.
2023-10-18 11:42:18 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed)
2023-10-18 11:42:46 +0200lortabac(~lortabac@89.207.171.151) (Ping timeout: 260 seconds)
2023-10-18 11:42:52 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-10-18 11:43:17 +0200lortabac(~lortabac@89.207.171.151)
2023-10-18 11:43:53 +0200 <Athas> It's essentially a JIT compiler.
2023-10-18 11:44:31 +0200 <Athas> That also means you can easily do interesting things like partial evaluation, where the Haskell level computation emits an Accelerate program. One of the Accelerate examples use this to specialise a ray tracer to a specific scene.
2023-10-18 11:47:09 +0200Inst(~Inst@120.244.192.250) (Ping timeout: 245 seconds)
2023-10-18 11:49:01 +0200Inst(~Inst@120.244.192.250)
2023-10-18 11:52:39 +0200 <haskellbridge> <A​quas> So LLVM is called at Haskell runtime?
2023-10-18 11:53:34 +0200lortabac(~lortabac@89.207.171.151) (Ping timeout: 255 seconds)
2023-10-18 11:54:42 +0200 <Athas> Yes.
2023-10-18 11:59:11 +0200 <tomsmeding> Aquas: you can also run the compilation process at Haskell compile time via TemplateHaskell by using runQ
2023-10-18 11:59:26 +0200 <tomsmeding> but personally I've never used that, so I'm not sure if that flow is still supported :D
2023-10-18 12:00:06 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-10-18 12:07:27 +0200 <Square> in the middle of my nix build i see "uploading 'https://hydra.iohk.io/nix-cache-info'...". A bjt
2023-10-18 12:07:37 +0200 <Square> A bit sus. *
2023-10-18 12:10:22 +0200ft(~ft@p200300cf3f482500978224aa0512647c.dip0.t-ipconnect.de) (Quit: leaving)
2023-10-18 12:12:46 +0200xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 255 seconds)
2023-10-18 12:14:55 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
2023-10-18 12:15:46 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 12:25:15 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
2023-10-18 12:25:44 +0200euleritian(~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de)
2023-10-18 12:26:31 +0200aforemny(~aforemny@i59F516FA.versanet.de) (Ping timeout: 260 seconds)
2023-10-18 12:27:41 +0200aforemny(~aforemny@2001:9e8:6ce3:9f00:c447:f7a7:e738:aefa)
2023-10-18 12:28:40 +0200euleritian(~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 12:29:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 12:33:31 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 260 seconds)
2023-10-18 12:34:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 12:39:28 +0200ubert1(~Thunderbi@77.119.220.59.wireless.dyn.drei.com)
2023-10-18 12:40:04 +0200CiaoSen(~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) (Ping timeout: 245 seconds)
2023-10-18 12:40:40 +0200ubert(~Thunderbi@178.165.203.252.wireless.dyn.drei.com) (Ping timeout: 255 seconds)
2023-10-18 12:40:40 +0200ubert1ubert
2023-10-18 12:41:01 +0200rosco(~rosco@193.138.218.161)
2023-10-18 12:41:29 +0200 <Inst> https://paste.tomsmeding.com/58hJ8xnN
2023-10-18 12:41:33 +0200 <Inst> any idea how to make this idiom fly?
2023-10-18 12:41:54 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 12:42:25 +0200 <Inst> and it's takne from a codewars kata, where it's all about overloading names to make an "English" expression work
2023-10-18 12:42:40 +0200 <Inst> the point is more, if you want multiple toplevel pure assignment
2023-10-18 12:43:02 +0200 <Inst> the verticalized list idiom doesn't work
2023-10-18 12:44:15 +0200coot(~coot@89-69-206-216.dynamic.chello.pl) (Ping timeout: 240 seconds)
2023-10-18 12:50:41 +0200 <tomsmeding> honestly I'd just `zero = ($ 0)` \n `one = ($ 1)` \n etc. :p
2023-10-18 12:50:50 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 12:50:57 +0200 <tomsmeding> if you want a bunch of names defined, define a bunch of names
2023-10-18 12:51:28 +0200 <tomsmeding> fancy haskell constructs are for manipulating data, not binders in haskell itself
2023-10-18 12:51:32 +0200 <tomsmeding> that's what TemplateHaskell is for
2023-10-18 12:52:02 +0200 <tomsmeding> this might not actually be that verbose in TH
2023-10-18 12:52:44 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2023-10-18 12:53:52 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit)
2023-10-18 12:55:36 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 258 seconds)
2023-10-18 12:56:26 +0200stiell_(~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
2023-10-18 12:56:45 +0200danse-nr3(~francesco@151.47.117.140) (Ping timeout: 258 seconds)
2023-10-18 12:56:58 +0200stiell_(~stiell@gateway/tor-sasl/stiell)
2023-10-18 12:57:49 +0200pavonia(~user@user/siracusa) (Quit: Bye!)
2023-10-18 13:01:19 +0200stiell_(~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
2023-10-18 13:01:41 +0200stiell_(~stiell@gateway/tor-sasl/stiell)
2023-10-18 13:02:25 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 13:03:48 +0200CiaoSen(~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef)
2023-10-18 13:05:04 +0200ggVGc(~ggVGc@a.lowtech.earth) (Quit: WeeChat 3.6)
2023-10-18 13:05:15 +0200 <Square> I believe there is a trick to create a proxy by using pure or return in some combination instead of Proxy :: Proxy MyType. Anyone know that one? I can't seem to recall how its done.
2023-10-18 13:05:17 +0200xff0x(~xff0x@ai101218.d.east.v6connect.net)
2023-10-18 13:05:55 +0200 <Square> oh, maybe it was from an value: pure value
2023-10-18 13:07:49 +0200 <tomsmeding> :t pure (undefined :: Int) :: Proxy Int
2023-10-18 13:07:50 +0200 <lambdabot> Proxy Int
2023-10-18 13:08:05 +0200 <tomsmeding> Square: Proxy implements Applicative, so 'pure :: a -> f a' becomes 'pure :: a -> Proxy a'
2023-10-18 13:08:26 +0200 <Square> right. Thanks
2023-10-18 13:08:31 +0200 <tomsmeding> but that really helps only if you already have an 'a' lying around
2023-10-18 13:08:48 +0200 <tomsmeding> (and it does not aid readability :p )
2023-10-18 13:09:06 +0200 <Square> yeah, wish there was a shorter version directly from type
2023-10-18 13:10:14 +0200 <ncf> :t Proxy @Int
2023-10-18 13:10:15 +0200 <lambdabot> error: parse error on input ‘@’
2023-10-18 13:11:04 +0200 <Square> sweet. I'll try that
2023-10-18 13:11:32 +0200 <ncf> TypeApplications
2023-10-18 13:13:47 +0200 <albet70> > fmap (+1) (Left 2)
2023-10-18 13:13:48 +0200arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net)
2023-10-18 13:13:49 +0200 <lambdabot> Left 2
2023-10-18 13:14:04 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 13:19:16 +0200hiyori(~hiyori@user/hiyori) (Quit: Client closed)
2023-10-18 13:21:32 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Ping timeout: 272 seconds)
2023-10-18 13:26:26 +0200dcoutts(~duncan@net77-43-75-226.mclink.it) (Ping timeout: 255 seconds)
2023-10-18 13:27:08 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds))
2023-10-18 13:28:08 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 13:31:07 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 13:32:06 +0200 <tomsmeding> > first (+1) (Left 2)
2023-10-18 13:32:08 +0200 <lambdabot> error:
2023-10-18 13:32:08 +0200 <lambdabot> • Couldn't match type ‘(b, d)’ with ‘Either a0 b0’
2023-10-18 13:32:08 +0200 <lambdabot> Expected type: Either a0 b0 -> (b, d)
2023-10-18 13:32:16 +0200 <tomsmeding> er
2023-10-18 13:32:27 +0200 <tomsmeding> oh
2023-10-18 13:33:17 +0200 <tomsmeding> % Data.Bifunctor.first (+1) (Left 2)
2023-10-18 13:33:17 +0200 <yahb2> Left 3
2023-10-18 13:33:51 +0200 <tomsmeding> why does lambdabot have arrows imported instead of bifunctors
2023-10-18 13:34:49 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 255 seconds)
2023-10-18 13:37:16 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed)
2023-10-18 13:37:40 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 13:39:28 +0200cpressey15(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 13:40:01 +0200Vajb(~Vajb@207.61.167.122) (Ping timeout: 252 seconds)
2023-10-18 13:42:38 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Ping timeout: 245 seconds)
2023-10-18 13:42:56 +0200cpressey15cpressey
2023-10-18 13:45:15 +0200Square2(~Square4@user/square)
2023-10-18 13:47:29 +0200Square(~Square@user/square) (Ping timeout: 255 seconds)
2023-10-18 13:47:30 +0200Square3(~Square4@user/square) (Ping timeout: 272 seconds)
2023-10-18 13:50:01 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds))
2023-10-18 13:50:54 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 13:56:15 +0200aforemny(~aforemny@2001:9e8:6ce3:9f00:c447:f7a7:e738:aefa) (Ping timeout: 240 seconds)
2023-10-18 13:57:31 +0200 <Inst> hmmm
2023-10-18 13:57:39 +0200 <Inst> here's an idea for "IO monad sucks / Haskell syntax sucks"
2023-10-18 13:57:48 +0200 <Inst> you'd still want isMain for that
2023-10-18 13:57:58 +0200 <Inst> this is actually a pretty interesting idea for a library
2023-10-18 13:58:34 +0200 <Inst> but it's pretty much "OOP", unfortunately, i.e, trying to generate monadic types that are universally records
2023-10-18 13:58:42 +0200 <Inst> so you'd bypass the variadic function issue for Haskell
2023-10-18 13:59:03 +0200 <Inst> it'd be a pretty interesting basis for an alt prelude
2023-10-18 13:59:35 +0200 <Inst> the ability to do IO actions as getLine {text = hello}
2023-10-18 13:59:38 +0200 <Inst> nah, the syntax still sucks here
2023-10-18 14:00:22 +0200aforemny(~aforemny@2001:9e8:6ce4:a700:b6be:fb5b:7ea6:79a3)
2023-10-18 14:02:43 +0200 <yushyin> haskell syntax (extensions aside) is fine and clear
2023-10-18 14:08:36 +0200 <Inst> there is precisely one problem with Haskell syntax, imo, and that's the lack of variadics
2023-10-18 14:08:54 +0200 <Inst> it makes it harder to have ergonomic library API design
2023-10-18 14:09:22 +0200 <Inst> algol syntax languages have input("Enter name here: ") and input() at the same time
2023-10-18 14:09:39 +0200 <Inst> you have to do funky variadic function overloading with typeclasses to get that
2023-10-18 14:09:42 +0200danse-nr3(~francesco@151.37.121.111)
2023-10-18 14:09:54 +0200 <nullie> wouldn't it become typing hell
2023-10-18 14:09:55 +0200 <Inst> being able to do foo bar baz and foo, and have both typecheck
2023-10-18 14:10:04 +0200 <cheater> What is Haskell? A miserable little pile of syntaxes.
2023-10-18 14:10:28 +0200 <Inst> the two ways to do it right now is to get a typeclass to overload
2023-10-18 14:10:39 +0200 <Inst> and do some weird crap with that
2023-10-18 14:10:48 +0200 <Inst> or to use a default record, and overload arguments onto the default record, but that's still painful
2023-10-18 14:10:52 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 14:11:13 +0200lortabac(~lortabac@37.169.5.141)
2023-10-18 14:11:15 +0200 <Inst> what we do right now is have variant functions, but that's unergonomic
2023-10-18 14:11:26 +0200qqq(~qqq@92.43.167.61)
2023-10-18 14:11:34 +0200 <Inst> getLinePrompt is a pain
2023-10-18 14:12:00 +0200 <Inst> unless there's more ways i'm unfamiliar with :(
2023-10-18 14:12:23 +0200 <Inst> @danse-nr3: do I know you by another name on Matrix?
2023-10-18 14:12:23 +0200 <lambdabot> Unknown command, try @list
2023-10-18 14:31:59 +0200lortabac(~lortabac@37.169.5.141) (Read error: Connection reset by peer)
2023-10-18 14:33:02 +0200Vajb(~Vajb@207.61.167.122) (Ping timeout: 255 seconds)
2023-10-18 14:42:32 +0200nickiminjaj(~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2023-10-18 14:43:33 +0200hgolden(~hgolden@2603-8000-9d00-3ed1-1ee4-1b7c-94a7-8fa7.res6.spectrum.com)
2023-10-18 14:51:57 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 14:52:07 +0200Square(~Square@user/square)
2023-10-18 15:00:19 +0200acidjnk_new(~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2023-10-18 15:04:01 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 15:06:33 +0200 <cpressey> Hi, could anyone help me understand why the following is not a syntax error?
2023-10-18 15:06:36 +0200 <cpressey> > let 99 = 3 * 5 in 99 + 1
2023-10-18 15:06:37 +0200 <lambdabot> 100
2023-10-18 15:07:57 +0200 <tomsmeding> > let Just x = Just 42 in x
2023-10-18 15:07:58 +0200 <lambdabot> 42
2023-10-18 15:08:16 +0200 <tomsmeding> > let (x, 42) = (10, 42) in x
2023-10-18 15:08:17 +0200 <lambdabot> 10
2023-10-18 15:08:19 +0200 <tomsmeding> > let (x, 43) = (10, 42) in x
2023-10-18 15:08:21 +0200 <lambdabot> *Exception: <interactive>:3:5-22: Non-exhaustive patterns in (x, 43)
2023-10-18 15:08:31 +0200 <tomsmeding> cpressey: it's a degenerate pattern that happens to bind no variables
2023-10-18 15:09:13 +0200 <tomsmeding> the reason why it doesn't give a _runtime_ error about non-exhaustive patterns (because the pattern does, of course, not match) is laziness: the match is never evaluated because none of its bound variables are ever used
2023-10-18 15:09:22 +0200wib_jonas(~wib_jonas@business-37-191-60-209.business.broadband.hu)
2023-10-18 15:09:26 +0200 <tomsmeding> notwithstanding the fact that that is immediate because there _are_ no bound variables
2023-10-18 15:09:49 +0200 <tomsmeding> it's a cute one though :)
2023-10-18 15:10:06 +0200 <tomsmeding> could go on the haskell wtf list, after
2023-10-18 15:10:11 +0200 <tomsmeding> > let 2 + 2 = 5 in 2 + 2
2023-10-18 15:10:12 +0200 <lambdabot> 5
2023-10-18 15:10:39 +0200 <tomsmeding> cpressey: how did you find it
2023-10-18 15:11:00 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl)
2023-10-18 15:11:00 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host)
2023-10-18 15:11:00 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 15:11:28 +0200 <wib_jonas> tomsmeding: I think that one just defines a (+) operator so that's less surprising
2023-10-18 15:11:43 +0200 <tomsmeding> for a haskell programmer it is indeed not surprising
2023-10-18 15:11:45 +0200 <cpressey> tomsmeding: the first version was "let 15 = 3 * 5 in 15 + 1" to see if Haskell would allow it
2023-10-18 15:11:52 +0200 <tomsmeding> right
2023-10-18 15:12:04 +0200 <tomsmeding> % :set -XBangPatterns
2023-10-18 15:12:05 +0200 <yahb2> <no output>
2023-10-18 15:12:10 +0200 <tomsmeding> % let !99 = 3 * 5 in 99 + 1
2023-10-18 15:12:10 +0200 <yahb2> *** Exception: <interactive>:41:5-15: Non-exhaustive patterns in 99
2023-10-18 15:12:15 +0200 <tomsmeding> right
2023-10-18 15:12:22 +0200 <tomsmeding> if you make the pattern strict, it fails at runtime :)
2023-10-18 15:12:27 +0200Vajb(~Vajb@207.61.167.122) (Ping timeout: 258 seconds)
2023-10-18 15:13:21 +0200 <cpressey> Anything to make it issue a warning at compile-time?  To the effect that you have a pattern that doesn't have any variables?
2023-10-18 15:13:26 +0200 <tomsmeding> % :set -Wall
2023-10-18 15:13:26 +0200 <yahb2> <no output>
2023-10-18 15:13:32 +0200 <tomsmeding> % let 99 = 3 * 5 in ()
2023-10-18 15:13:33 +0200 <yahb2> <interactive>:45:5: warning: [-Wunused-pattern-binds] ; This pattern-binding binds no variables: 99 = 3 * 5 ; ; <interactive>:45:5: warning: [-Wincomplete-uni-patterns] ; Pattern match(es)...
2023-10-18 15:13:38 +0200 <tomsmeding> cpressey: -Wall
2023-10-18 15:13:51 +0200 <tomsmeding> which everybody should use, as usual, and somehow not everybody does, as usual
2023-10-18 15:13:59 +0200 <cpressey> well, -Wincomplete-uni-patterns it seems, but yes, thank you :)
2023-10-18 15:14:05 +0200 <tomsmeding> % 2
2023-10-18 15:14:05 +0200 <yahb2> <interactive>:47:1: warning: [-Wtype-defaults] ; • Defaulting the following constraints to type ‘Integer’ ; (Show a0) ; arising from a use of ‘Yahb2Defs.limitedPrint’ ; ...
2023-10-18 15:14:10 +0200 <tomsmeding> % :unset -Wall
2023-10-18 15:14:10 +0200 <yahb2> don't know how to reverse -Wall
2023-10-18 15:14:14 +0200 <tomsmeding> oh
2023-10-18 15:14:15 +0200 <tomsmeding> % :q
2023-10-18 15:14:15 +0200 <yahb2> <bye>
2023-10-18 15:14:17 +0200 <tomsmeding> % 1
2023-10-18 15:14:18 +0200 <yahb2> 1
2023-10-18 15:14:45 +0200 <tomsmeding> problem with -Wall in the interactive repl is that defaulting is damn useful in the repl and it throws warnings all over the place (as it should)
2023-10-18 15:15:19 +0200 <tomsmeding> cpressey: -Wunused-pattern-binds might be more specifically about this
2023-10-18 15:15:52 +0200 <tomsmeding> (it's so strange that it triggers _two_ warnings!)
2023-10-18 15:16:11 +0200 <tomsmeding> wow
2023-10-18 15:16:23 +0200 <tomsmeding> https://paste.tomsmeding.com/3xo5H8qf
2023-10-18 15:16:27 +0200 <tomsmeding> that's a _lot_ of output
2023-10-18 15:16:50 +0200 <cpressey> I tried it locally with ghci -Wall and it actually gave me 5 warnings
2023-10-18 15:17:00 +0200 <tomsmeding> see my paste, you can make it 6
2023-10-18 15:17:19 +0200 <tomsmeding> only 4 on 8.10.7 though
2023-10-18 15:18:24 +0200 <cpressey> Ah, you've got a 1 on both sides, so you get overlapping patterns too
2023-10-18 15:18:56 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 15:18:57 +0200 <tomsmeding> hm? same warnings if I do "in 2"
2023-10-18 15:19:27 +0200 <tomsmeding> ah the overlapping-patterns warning is there only if GHC doesn't have to do arithmetic to see that the match is redundant
2023-10-18 15:19:42 +0200 <cpressey> Ah ok
2023-10-18 15:19:43 +0200 <tomsmeding> if you replace the "99 = 1" by "99 = 1 * 1" it disappears
2023-10-18 15:19:49 +0200 <tomsmeding> fair enough
2023-10-18 15:35:22 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com)
2023-10-18 15:38:07 +0200arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
2023-10-18 15:43:09 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 248 seconds)
2023-10-18 15:44:06 +0200Guest9(~Guest9@ext-1-173.eduroam.chalmers.se)
2023-10-18 15:44:43 +0200 <Guest9> Hi! Is there any way to pass in arguments to the compiler during compile time? I run some TH code during compile time and I would like to pass in a configurable parameter. Naturally, `cabal build my-exe -- argument` does not work
2023-10-18 15:48:40 +0200 <danse-nr3> Inst: i don't think so, i don't hang out on matrix at the moment
2023-10-18 15:55:41 +0200 <Inst> thanks
2023-10-18 15:55:46 +0200 <Inst> hmmm, also:
2023-10-18 15:56:01 +0200acidjnk_new(~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de)
2023-10-18 15:56:02 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-10-18 15:56:13 +0200 <Inst> still am trying to figure out how to implement varargs in haskell
2023-10-18 15:57:03 +0200 <Inst> could reuse the brace syntax for functions
2023-10-18 15:57:41 +0200 <Inst> and disambiguate vs record syntax by having it always default to be a secord function
2023-10-18 15:57:50 +0200 <Inst> *record function on the first brace
2023-10-18 15:58:22 +0200 <Inst> erm, record syntax
2023-10-18 15:58:36 +0200 <Inst> type system would be harder to do
2023-10-18 15:58:40 +0200 <Inst> implicit parameters?
2023-10-18 15:59:43 +0200notzmv(~zmv@user/notzmv) (Ping timeout: 264 seconds)
2023-10-18 16:00:55 +0200alphacentauri(alphacenta@gateway/vpn/protonvpn/alphacentauri) (Quit: WeeChat 4.1.0)
2023-10-18 16:01:53 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 16:04:09 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk)
2023-10-18 16:04:10 +0200shriekingnoise(~shrieking@186.137.175.87)
2023-10-18 16:06:07 +0200 <danse-nr3> no i think it was discussed here not long ago, there is no idiomadic way
2023-10-18 16:09:07 +0200 <Inst> i'mm thinking language extensions
2023-10-18 16:09:31 +0200 <Inst> foo {}
2023-10-18 16:09:42 +0200 <Inst> foo :: bunch of implicit params go here => () -> a
2023-10-18 16:10:03 +0200 <Inst> the bigger question is how it'd be unhaskelly
2023-10-18 16:13:25 +0200thegeekinside(~thegeekin@189.180.124.118)
2023-10-18 16:17:44 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds))
2023-10-18 16:18:18 +0200 <int-e> > let start f = f []; push xs x f = f (x:xs); add (x:y:xs) f = f (x+y:xs); end xs = xs in start push 42 push 23 add push 11 add end
2023-10-18 16:18:19 +0200 <lambdabot> [76]
2023-10-18 16:19:39 +0200 <danse-nr3> neat!
2023-10-18 16:19:45 +0200 <int-e> Inst: What's the type of your function?
2023-10-18 16:19:55 +0200 <probie> Inst: how often do you need a true var args function? Still, you can look at how `Text.printf` is implemented
2023-10-18 16:21:43 +0200 <int-e> danse-nr3: It's the only example I know of of something that is kind of a varargs function but doesn't rely on type classes (only polymorphism). If you overdo it it'll seriously strain the type checker though.
2023-10-18 16:24:25 +0200 <Inst> int-e: it's more a question of how to build "accessible" libraries, i.e, people are used to having non-curried functions
2023-10-18 16:24:47 +0200 <Inst> the type would be implicit params => () -> something
2023-10-18 16:24:57 +0200 <Inst> you'd invoke via fun {args...}
2023-10-18 16:25:07 +0200 <Inst> the args would then get passed as implicit params with a default value
2023-10-18 16:25:46 +0200 <Inst> like i said, i'd just be more worried about it being unhaskelly because you'd essentially end up with a hybrid algol / ml syntax from it
2023-10-18 16:25:52 +0200 <int-e> I don't see how this is accessible.
2023-10-18 16:26:57 +0200 <Inst> it's more ergonomic for the library writer, and accessible to the end user because you don't need the typeclass overloading stuff anymore
2023-10-18 16:27:10 +0200 <int-e> [citation needed]
2023-10-18 16:27:42 +0200Guest9(~Guest9@ext-1-173.eduroam.chalmers.se) (Quit: Connection closed)
2023-10-18 16:27:43 +0200 <int-e> Type errors are a boon. Variadic functions and types don't go together well. If you don't want types, don't use Haskell.
2023-10-18 16:27:59 +0200 <Inst> thanks <3
2023-10-18 16:28:10 +0200 <Inst> i was asking about how this would be unhaskelly, you answered my question for me
2023-10-18 16:28:31 +0200 <int-e> (As people have pointed out, there are tricks to get variadic functions. Those invariably have quite terrible type errors when you hold them wrong.)
2023-10-18 16:28:40 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 16:29:10 +0200 <Inst> the only benefit of the system i'd propose would be that it'd reduce the chances of error when screwing up with variadic functions
2023-10-18 16:29:19 +0200 <Inst> the natural place for such functions would be in IO or IO surrogates
2023-10-18 16:29:27 +0200 <int-e> > printf "%f" id
2023-10-18 16:29:28 +0200 <lambdabot> error:
2023-10-18 16:29:28 +0200 <lambdabot> • Could not deduce (PrintfArg (a0 -> a0))
2023-10-18 16:29:28 +0200 <lambdabot> arising from a use of ‘printf’
2023-10-18 16:29:40 +0200 <int-e> (that's not even half the error)
2023-10-18 16:29:51 +0200 <Inst> i don't think anyone would want to use it outside IO etc
2023-10-18 16:31:20 +0200 <danse-nr3> when i came to haskell at first i missed variadic functions, now i struggle to imagine an use case for them... i always end up thinking: "so... we want a list?"
2023-10-18 16:31:43 +0200 <Inst> I only miss variadic functions when I look up a Haskell library and notice the API design
2023-10-18 16:31:58 +0200 <Inst> of course the library is perfectly fine and usable, but lack of variadics makes it harder to pick up
2023-10-18 16:32:30 +0200 <Inst> in fact there's a few functions that implement variadics that i feel, not necessarily know, is smelly
2023-10-18 16:32:38 +0200 <Inst> *a few libraries
2023-10-18 16:33:05 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl) (Remote host closed the connection)
2023-10-18 16:33:49 +0200 <Inst> if such an extension existed, i'd actually want the extension split up, one for writing variadic functions, and another for calling them
2023-10-18 16:36:03 +0200 <int-e> I guess the answer to "what do people who really really want a variable number of arguments of varying types use" is something like HList.
2023-10-18 16:36:24 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 258 seconds)
2023-10-18 16:36:59 +0200 <int-e> Or possibly something on top of Template Haskell.
2023-10-18 16:37:01 +0200 <danse-nr3> or a sum type. Varying types does not have to mean any type
2023-10-18 16:40:20 +0200wib_jonas(~wib_jonas@business-37-191-60-209.business.broadband.hu) (Quit: Client closed)
2023-10-18 16:49:42 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2023-10-18 16:50:09 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-10-18 16:50:58 +0200danse-nr3(~francesco@151.37.121.111) (Ping timeout: 258 seconds)
2023-10-18 16:52:22 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 16:53:58 +0200 <probie> I think you just want a list of a boring old sum type
2023-10-18 16:54:17 +0200 <tomsmeding> the only useful variadic function I know in C is printf
2023-10-18 16:54:21 +0200 <tomsmeding> (and friends)
2023-10-18 16:54:39 +0200 <tomsmeding> C and C++, that is
2023-10-18 16:54:59 +0200 <tomsmeding> it seems to me that all other useful cases of variadic functions are not actually variadic functions, they're simply ad-hoc overloading
2023-10-18 16:55:05 +0200 <tomsmeding> we don't do that in haskell
2023-10-18 16:55:25 +0200 <tomsmeding> granted, printf is useful and awkward in haskell. But that's a small price for getting, well, haskell
2023-10-18 16:56:12 +0200 <tomsmeding> execl() and friends do not count because seriously, use execv already
2023-10-18 16:56:43 +0200 <tomsmeding> (execl() and friends only exist in C because creating and filling an array in C is annoying)
2023-10-18 16:57:23 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
2023-10-18 16:57:29 +0200 <tomsmeding> well, I said "we don't do that in haskell" -- we have type classes for that
2023-10-18 16:57:44 +0200 <tomsmeding> but it's more structured than the bare-bones ad-hoc overloading you get in C++
2023-10-18 16:59:51 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
2023-10-18 17:00:26 +0200euleritian(~euleritia@77.22.252.56)
2023-10-18 17:01:13 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de)
2023-10-18 17:04:45 +0200danse-nr3(~francesco@151.37.121.111)
2023-10-18 17:05:09 +0200 <vektor> Is there a way to constrain a data type to only take type args of certain classes? Concretely, could I build a type Vector a that guarantees that a is always Num? Or always Show? I have a datatype that makes sense only with a small set of types 'a', but I want to be agnostic of the concrete type 'a' used there. The usual solution is to just carry
2023-10-18 17:05:09 +0200 <vektor> the class constraint in all relevant functions, but I found that dissatisfactory.
2023-10-18 17:06:38 +0200 <vektor> Mostly because in many functions I don't actually care about what 'a' is, but then 20 functions down from the last mention, I want to debug-print a value of a, and have to add Show a to 20 signatures, when in my mind it doesn't even make sense to have 'a' not be show.
2023-10-18 17:08:14 +0200 <ncf> ghc has something called the "stupid context" which i learnt about recently https://hackage.haskell.org/package/ghc-9.8.1/docs/src/GHC.Core.DataCon.html
2023-10-18 17:08:26 +0200 <ncf> is that what you're looking for?
2023-10-18 17:09:01 +0200azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
2023-10-18 17:09:24 +0200 <danse-nr3> or is this a case for a plain constraint on a type parameter?
2023-10-18 17:09:56 +0200 <EvanR> check out this variadic printf: putStrLn [show 234, show 8.423, show True, show 'c']
2023-10-18 17:10:10 +0200statusbot12(~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com) (Remote host closed the connection)
2023-10-18 17:10:11 +0200 <EvanR> er, throw a concat in there
2023-10-18 17:10:24 +0200statusbot(~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com)
2023-10-18 17:10:26 +0200 <EvanR> or unlines
2023-10-18 17:10:27 +0200Achylles(~Achylles_@45.182.57.85)
2023-10-18 17:11:18 +0200 <danse-nr3> oh i see you want to have `data D = Show a => D a` for instance? Yeah makes sense i was looking for something similar some time ago
2023-10-18 17:11:54 +0200 <ddellacosta> existential types, but they have always seemed like more trouble than it's worth. Stupid context is interesting ncf , TIL, thanks
2023-10-18 17:11:56 +0200 <EvanR> Vector (String, a)
2023-10-18 17:12:14 +0200 <EvanR> very stupid context ^
2023-10-18 17:12:49 +0200 <EvanR> data StringAnd a = StringAnd String a
2023-10-18 17:13:28 +0200 <ncf> er i guess it's not GHC-specific. it's right there in the haskell 98 report: data [context =>] simpletype = constrs
2023-10-18 17:14:21 +0200 <EvanR> somewhat more seriously, it would be nice if in debug mode you could just debug values without threading Show everywhere, like a built-in Show (similar to how Typeable is built-in now)
2023-10-18 17:14:30 +0200 <[Leary]> I think that "stupid context" is referring to DatatypeContexts, in which case it's entirely useless. Re existential, you don't actually need to hide a type to carry a constraint around, so that can solve the issue given a runtime cost, but may require the constraints be present in your type sigs anyway.
2023-10-18 17:15:15 +0200 <EvanR> idris has no issue displaying something for any term, even functions
2023-10-18 17:15:17 +0200 <vektor> danse-nr3: That's what I want, yeah. Basically, define `data D a = (Show a, Num a) => Constructor1 | Constructor2`, and then never have to worry about telling ghc that 'yes, a is in fact show and Num, don't worry your pretty little head about that part'. Is that what that does?
2023-10-18 17:16:56 +0200 <vektor> as for the concurrent suggestion of "stupid context", I wasn't quite able to make sense of that yet, but it seems to build upon danse's suggestion? THough the syntax used there is `data (Eq a, Ord b) => T a b = T1 a b | T2 a`
2023-10-18 17:16:59 +0200 <ncf> [Leary]: why is it entirely useless?
2023-10-18 17:17:14 +0200 <danse-nr3> so existential types suggested above by ddellacosta seem to be the solution
2023-10-18 17:17:40 +0200 <[Leary]> ncf: You can't actually /use/ the constraint, only impose it.
2023-10-18 17:18:15 +0200 <ncf> right
2023-10-18 17:20:25 +0200 <EvanR> by using the existential, I'm not sure how that accomplishes the goal of requiring support down the line but not specifying it in the users type signatures
2023-10-18 17:20:46 +0200 <EvanR> the users still can't be totally polymorphic, they have to specify your existential
2023-10-18 17:21:06 +0200 <EvanR> also, common wisdom is you don't want to accomplish this goal
2023-10-18 17:21:10 +0200ski(~ski@88.131.7.247)
2023-10-18 17:21:18 +0200 <danse-nr3> i just started reading, seems like the main usecase suggests that the costrained parameter is not exposed in the type
2023-10-18 17:22:20 +0200 <ddellacosta> yeah, I probably shouldn't have mentioned existential types, to echo what EvanR is saying
2023-10-18 17:22:23 +0200 <EvanR> you can't have quote most of your functions not care about the type in Vector a, but still call these inner functions that require special support
2023-10-18 17:22:48 +0200 <EvanR> since they actually do care
2023-10-18 17:23:02 +0200CiaoSen(~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) (Ping timeout: 255 seconds)
2023-10-18 17:23:10 +0200 <[Leary]> vektor: You'd want `data T a b = (Eq a, Ord b) => T1 a b | Eq a => T2 a`. You /do/ have to satisfy the constraints upon constructing the data, but they're then made available upon pattern matching.
2023-10-18 17:23:29 +0200 <vektor> Ok, so DatatypeContexts and data (Show a) => D a seems to demand I carry the 'Show a' constraint everywhere I take my D a. That's the opposite of what I intended...
2023-10-18 17:23:39 +0200_xor(~xor@72.49.199.93) (Quit: Ping timeout (120 seconds))
2023-10-18 17:23:50 +0200 <vektor> [Leary], I assume that syntax does the other thing then? :D
2023-10-18 17:24:02 +0200alphacentauri(alphacenta@gateway/vpn/protonvpn/alphacentauri)
2023-10-18 17:24:18 +0200_xor(~xor@72.49.199.93)
2023-10-18 17:26:05 +0200 <EvanR> you would have to put Vector (D a) everywhere instead, so I guess it saves some typing, but that doesn't make anything fully polymorphic. Another way to reduce typing is to make a synonym for (Show a, Num a) =>, so shorthanded would be something like SN a =>
2023-10-18 17:27:33 +0200billchenchina(~billchenc@2a0c:b641:7a2:230::10)
2023-10-18 17:27:45 +0200 <c_wraith> vektor: the semantics of DatatypeContexts are *solely* that the constraint is added to the constructor. There's no provision that the constraint mean anything. This is why it's deprecated - it's useless.
2023-10-18 17:29:49 +0200 <vektor> Yeah, I vaguely remember attacking this same problem before and not making much progress. Ever since then, there's been a pesky "-XDatatypeContexts is deprecated" warning that I never really bothered to fix. I have been here before O.o
2023-10-18 17:31:20 +0200euleritian(~euleritia@77.22.252.56) (Ping timeout: 246 seconds)
2023-10-18 17:32:07 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 252 seconds)
2023-10-18 17:33:05 +0200 <EvanR> your original "problem" of putting constraints on operations that need them is actually the solution
2023-10-18 17:33:30 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 17:33:37 +0200 <EvanR> the problem of debugging stuff though, there might be a better way to go about it
2023-10-18 17:33:40 +0200 <tomsmeding> yeah, the established alternative to DatatypeContexts is just putting the constraints on the operation
2023-10-18 17:34:15 +0200 <tomsmeding> "putting the constraint _in_ the data type" is making a GADT, like [Leary] suggested
2023-10-18 17:35:42 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk)
2023-10-18 17:39:17 +0200 <vektor> Ok, I've messed about with what Leary suggested now. Running after the stack of compiler errors I inevitably get, my main observation is that I lose some of the "undesired" polymorphism. So when previously I could arrange constructors to create a value of type 'D a' and then later decide on which a to use, now I have to either decide on which a to
2023-10-18 17:39:17 +0200 <vektor> use, or carry the (Num a, Show a) constraint in places I previously didn't have to. Taking a step back, the constraint seems to no longer be needed in places that consumed or transformed D, but is now needed in places that create D. I guess that makes sense, no free lunch after all.
2023-10-18 17:40:01 +0200 <EvanR> you're basically bundling the dictionary with your value
2023-10-18 17:40:26 +0200 <vektor> sorry, what dictionary?
2023-10-18 17:40:33 +0200 <EvanR> sort of a Num a *> a, as opposed to Num a => a which is like a function waiting for a dictionary
2023-10-18 17:40:38 +0200nickiminjaj(~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2023-10-18 17:41:19 +0200 <EvanR> the dictionary is how type classes are implemented, it's a record of all the instance methods. GHC passes it around for you when there is ad-hoc polymorphism
2023-10-18 17:41:31 +0200Achylles(~Achylles_@45.182.57.85) (Quit: Leaving)
2023-10-18 17:42:02 +0200danse-nr3_(~francesco@151.57.122.70)
2023-10-18 17:42:33 +0200danse-nr3(~francesco@151.37.121.111) (Read error: Connection reset by peer)
2023-10-18 17:43:06 +0200econo_(uid147250@id-147250.tinside.irccloud.com)
2023-10-18 17:44:34 +0200 <ski> `elem :: Eq a => a -> [a] -> Bool' is transformed into `elem :: EqDict a -> a -> [a] -> Bool', where `data EqDict a = MkEqDict {(==),(/=) :: a -> a -> Bool} is the dictionary/record/"vtable" that is the translation of `class Eq a of (==),(/=) :: a -> a -> Bool'
2023-10-18 17:46:57 +0200 <EvanR> when you build a GADT with constraints on the constructor, the dictionary is bundled. When you case analyze a GADT the dictionaries come out again
2023-10-18 17:47:20 +0200 <ski> vektor : .. and `data T a b = (Eq a, Ord b) => T1 a b | Eq a => T2 a' above would then get translated into `data T a b = T1 (EqDict a) (OrdDict b) a b | T2 (EqDict a) a' .. so when you're constructing `T1's and `T2's, you're packing those instance dictionaries into the data structure. and when you're pattern-matching, you're getting them back out again
2023-10-18 17:48:15 +0200 <EvanR> in light of all this, if you just need the Show constraint, it's clear that you could get the same effect by just bundling a String instead and skip the machinery xD
2023-10-18 17:49:17 +0200 <ski> (of course, an implementation is free to inline these dictionaries wherever it can .. but it can't do that, everywhere, due "polymorphic recursion" (technical term). and also due to a bunch of language extensions, should you turn any of them on)
2023-10-18 17:49:25 +0200 <tomsmeding> (in which case a smart constructor / pattern synonym might come in handy to avoid having to keep the String up to date manually)
2023-10-18 17:49:32 +0200 <vektor> Oh, dang. I had thought the Existential thing mapped the constraint over all constructors, but if I just put it once, it's just for the first somehow...? Color me thoroughly confused.
2023-10-18 17:49:55 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl)
2023-10-18 17:49:55 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host)
2023-10-18 17:49:55 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 17:50:15 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 17:50:19 +0200 <dolio> Each constructor gets its own context.
2023-10-18 17:50:30 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 17:50:39 +0200 <ski> vektor : in `data T ... = ... | Eq a => C ..a.. | ...', `Eq a' is attached only to the data constructor `C' there
2023-10-18 17:50:52 +0200 <tomsmeding> the first step in understanding all this is reading '->' for '=>'. (The 'data T a = Eq a => C a a' notation is a bit special; the GADT version, which is 'data T a where C :: Eq a -> a -> a -> T a', is clearer.)
2023-10-18 17:51:25 +0200 <tomsmeding> er, oops, Eq a => a -> a -> T a, of course :D
2023-10-18 17:51:54 +0200 <vektor> ski: Ahhh, I see. That's why it's not doing what I hoped. I can't eliminate the redundant constraints on functions working with my data type, because the constraints I baked into the data def only apply to the first constructor...
2023-10-18 17:52:31 +0200 <EvanR> if they only apply to the first constructor then fine?
2023-10-18 17:52:49 +0200 <EvanR> you still don't need more constraints on functions accepting the type
2023-10-18 17:53:48 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 240 seconds)
2023-10-18 17:53:50 +0200 <EvanR> unless there are other arguments which need to be compatible for some reason and then we need examples
2023-10-18 17:54:16 +0200 <vektor> I mean, if I now write a prettyPrint :: D a -> String ... my expectation was that a (Show a) constraint wouldn't be necessary, as it's implied by the type: (D a) can not exist with an a that is not Show. That was the point of the exercise.
2023-10-18 17:54:27 +0200 <ski> vektor : mind, i didn't catch the start of this conversattion (e.g. hasn't seen any code snippets you might've shown)
2023-10-18 17:54:47 +0200 <EvanR> yes because you couldn't have constructed one
2023-10-18 17:55:17 +0200 <EvanR> no
2023-10-18 17:55:58 +0200 <vektor> EvanR: Are you saying if I apply the constraint to all constructors, the compiler would figure out that there can only ever be 'D a' if (Show a)?
2023-10-18 17:56:12 +0200skiidly wonders how `D's defined
2023-10-18 17:56:16 +0200 <EvanR> data T a where C1 :: Show a => a -> T a; C2 a -> T a -- here, you can constraint a non-Show a. But you wouldn't be able to pretty print it, probably. So you could show "????" instead
2023-10-18 17:56:17 +0200 <tomsmeding> prettyPrint needs to get the 'show' method for 'a' from _somewhere_; if prettyPrint takes 'Show a =>', then it gets that method as an argument. If you put 'Show a =>' on a constructor of D, that constructor has the method in one of its fields. Either way prettyPrint gets the info.
2023-10-18 17:56:19 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 17:56:30 +0200 <tomsmeding> If you do neither of those things, it can't magically conjure up the method from somewhere :p
2023-10-18 17:56:59 +0200 <EvanR> vektor, no, this is much simpler than you are thinking
2023-10-18 17:58:00 +0200 <tomsmeding> the whole intuition of "types being a member of a type class" only exists during typeclass _resolution_, which is the phase where ghc turns code with '=>' into code with '->', explictly passing the dictionaries (containing the type class methods) around
2023-10-18 17:58:24 +0200 <tomsmeding> after that, type classes don't exist any more, there's just some additional records/dictionaries of stuff being passed around
2023-10-18 17:59:13 +0200 <vektor> ski, just to fill you in, I have a data type 'D a' (or actually 'Expr x a', and yes, it's a syntax tree of a DSL) where a is only ever instantiated with types with Show and Num. I want to put those constraints into the type of D, so I don't have to make them explicit every time I try to "traceShow" a value of type a.
2023-10-18 18:00:02 +0200ubert(~Thunderbi@77.119.220.59.wireless.dyn.drei.com) (Ping timeout: 246 seconds)
2023-10-18 18:00:13 +0200 <EvanR> put those constraints into constructors that hold the said types you want to show
2023-10-18 18:00:22 +0200alphacentauri(alphacenta@gateway/vpn/protonvpn/alphacentauri) (Quit: WeeChat 4.1.0)
2023-10-18 18:00:24 +0200 <tomsmeding> right, that's the only thing you can do here
2023-10-18 18:00:30 +0200 <EvanR> constructors you can show without that information... show them without the information and you don't need the constraints
2023-10-18 18:00:32 +0200 <vektor> ... a value of type a contained within a D or Expr x of course. A naked a would still need the Show a thing. But Basically, I want to make functions like prettyPrint (D a) -> String, where I can call show on values of a without the compiler yelling.
2023-10-18 18:00:33 +0200 <ski> vektor : you're using `GADTs' for that ?
2023-10-18 18:01:20 +0200 <EvanR> a "naked a" in isolation has no support for anything, you can't even print it
2023-10-18 18:01:21 +0200 <vektor> ski: nah, just plain ADT.
2023-10-18 18:01:27 +0200 <ski> vektor : are `x' and `a' indices of `Expr' ? or just parameters ?
2023-10-18 18:01:29 +0200 <ski> ok
2023-10-18 18:01:42 +0200 <EvanR> and contradicts that you only use it at types that support Show
2023-10-18 18:02:17 +0200 <EvanR> for the purposes of pretty printing another avenue is Generic, rather than Show
2023-10-18 18:02:23 +0200 <vektor> Don't worry about x, that's just dead weight. a is the numeric type in which Expr does its computations. I.e. I can switch from Float to Double by one function call.
2023-10-18 18:02:23 +0200skiwould still like to actually see this `Expr
2023-10-18 18:02:25 +0200 <ski> '
2023-10-18 18:02:44 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 272 seconds)
2023-10-18 18:05:04 +0200danse-nr3__(~francesco@151.57.122.70)
2023-10-18 18:05:08 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 18:05:40 +0200danse-nr3_(~francesco@151.57.122.70) (Read error: Connection reset by peer)
2023-10-18 18:05:48 +0200 <vektor> ski: https://paste.tomsmeding.com/6KsU2MIg - there you go. Shown here with the currently-workshopped "everything gets constraints" version.
2023-10-18 18:07:10 +0200Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se) (Ping timeout: 272 seconds)
2023-10-18 18:08:35 +0200 <ski> imho, you might be better off with `data WrappedExpr x a = (Num a,Show a) => WrapExpr (WrappedExpr x a)' (and deleting all the bundled constraints in `Expr') -- at least that way, you'd not be putting your constraints into every single node of your syntax tree (quite redundently, one could think)
2023-10-18 18:10:16 +0200Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se)
2023-10-18 18:10:37 +0200 <ski> .. and there's really no point in putting `Show a' constraints on the nodes that can't even contain any value of a type mentioning the `a' parameter (those data constructors are `ThetaI',`Uniform',`Normal',`Null',`Var',`TNull',`Call')
2023-10-18 18:10:42 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds)
2023-10-18 18:11:18 +0200 <EvanR> yes you can presumably print Null without any additional infor
2023-10-18 18:11:38 +0200 <ski> (i'm assuming `Value a's can actually contain `a's, since there's no other place in there where `a' could actually get used)
2023-10-18 18:11:41 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 18:12:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 18:12:08 +0200ubert(~Thunderbi@77.119.220.59.wireless.dyn.drei.com)
2023-10-18 18:12:18 +0200 <vektor> I mean, I just blindly copy pasted those constraints everywhere in the hopes that some GHC-magic would activate and ghc would figure out that "oh, Expr x a implies that a is both show and num, anywhere I go, but I'm not sure it's materializing.
2023-10-18 18:12:28 +0200 <EvanR> which makes me think your actual objective is something else, given you wanted to trick GHC into thinking ^
2023-10-18 18:12:29 +0200 <ski> @where DecoratingStructures
2023-10-18 18:12:29 +0200 <lambdabot> <http://web.archive.org/web/20051126143527/http://haskell.org/hawiki/DecoratingStructures>
2023-10-18 18:12:36 +0200 <ski> @where IndirectComposite
2023-10-18 18:12:36 +0200 <lambdabot> <http://web.archive.org/web/20051126141834/http://haskell.org/hawiki/IndirectComposite>
2023-10-18 18:12:49 +0200 <vektor> Yeah, as said, a is the numeric type of the execution, so Values are where a lives.
2023-10-18 18:12:58 +0200 <EvanR> GHC is not magic and the stuff involved here is purely mechanical
2023-10-18 18:13:30 +0200 <EvanR> obeying the usual laws of nature
2023-10-18 18:13:32 +0200 <ski> what you get out it what you put in
2023-10-18 18:13:38 +0200 <vektor> I'm starting to think I've found a thing that's cognitively simple to think about ("just put an implied "Show a, Num a" onto every Expr x a), but ghc doesn't really do it simply.
2023-10-18 18:14:09 +0200 <ski> vektor : what is the current problem you're experiencing (with this strategy you just described) ?
2023-10-18 18:18:44 +0200notzmv(~zmv@user/notzmv)
2023-10-18 18:19:41 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-10-18 18:22:43 +0200 <vektor> Bunch of edge cases that interface with Expr in funny ways, gimme a few minutes.
2023-10-18 18:22:50 +0200 <EvanR> if you put the constraints in the GADT, then yes logically the a in Expr x a are instances of Show and Num, assuming you managed to build an Expr x a. Anywhere you go. To prove it, pattern match the Expr
2023-10-18 18:23:04 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk)
2023-10-18 18:24:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds)
2023-10-18 18:24:38 +0200 <vektor> Currently, I only have an ADT. That make a difference to your statement?
2023-10-18 18:24:44 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 18:24:47 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 18:24:50 +0200 <ski> it's not going to give you `Num a' and `Show a' anytime you have a value of type `Expr x a'. you have to pattern-match, as EvanR says, to extract those constraints. only in the scope of that pattern-match are those constraints known / in force
2023-10-18 18:24:50 +0200ozone(ozone@libera/bot/ozone) (Leaving the channel. /invite ozone again if needed)
2023-10-18 18:25:10 +0200 <ski> vektor : do you currently have what you showed in the paste ?
2023-10-18 18:25:41 +0200 <vektor> ski: Yeah, what's currently in the paste. I'm working on fixing the rest of the code to coordinate with it.
2023-10-18 18:25:47 +0200 <ski> i believe EvanR meant the syntax of putting `..constraints.. =>' before the data constructors, by "GADT" here
2023-10-18 18:27:56 +0200 <vektor> EvanR: Regarding the magic/mechanical comment, I'm quite aware, but I could've imagined GHC going "oh, all of these constructors have a subset of common constraints, let me take the intersection of all those and then you get them for free everywhere you meet an Expr x a. Not infeasible, afaict, but it would've surprised me if GHC just did that.
2023-10-18 18:27:57 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 18:28:09 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com)
2023-10-18 18:28:20 +0200 <ski> yea, it doesn't
2023-10-18 18:28:21 +0200 <EvanR> I'm glad GHC doesn't do surprising things
2023-10-18 18:28:27 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 18:28:43 +0200 <EvanR> I like my code to be unsurprising AF
2023-10-18 18:28:45 +0200 <ski> you only get the constraints associated with the data constructor, when you (sucessfully) match on that data constructor
2023-10-18 18:29:02 +0200zenstoic(uid461840@id-461840.hampstead.irccloud.com)
2023-10-18 18:29:30 +0200 <EvanR> I'm kind of amazed how far people can get with their compilers not understanding how they work
2023-10-18 18:29:38 +0200__monty__(~toonn@user/toonn) (Ping timeout: 255 seconds)
2023-10-18 18:29:54 +0200 <ski> compilers are shiny toys
2023-10-18 18:32:04 +0200nickiminjaj(~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2023-10-18 18:32:09 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-10-18 18:32:41 +0200 <vektor> EvanR: Well, "understanding the compiler" and "getting somewhere with the compiler" exist in a symbiotic relationship. Have to encounter situations you don't understand to learn something, but also have to stay reasonably close to what you know to stay effective. Right now I'm exploring quite a lot, so compiler surprises are expected.
2023-10-18 18:33:15 +0200alphacentauri(alphacenta@gateway/vpn/protonvpn/alphacentauri)
2023-10-18 18:33:20 +0200 <ski> correct
2023-10-18 18:33:24 +0200 <vektor> But personally I've never complained about an "oh hey, ghc can derive that instance for me" moment. Some surprises are good.
2023-10-18 18:34:21 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl)
2023-10-18 18:34:21 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host)
2023-10-18 18:34:21 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 18:35:15 +0200nickiminjaj(~nickiminj@user/laxhh) (Client Quit)
2023-10-18 18:36:36 +0200 <EvanR> I took your data type and wrote a function showE :: Expr x a -> String which makes use of show to print the Constant x (Value a). Of course, I have no way to do anything with the x
2023-10-18 18:37:02 +0200L29Ah(~L29Ah@wikipedia/L29Ah) ()
2023-10-18 18:37:17 +0200 <vektor> Cool. How's that look?
2023-10-18 18:37:29 +0200 <EvanR> the code for showE?
2023-10-18 18:37:31 +0200 <vektor> Yeah
2023-10-18 18:37:32 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 248 seconds)
2023-10-18 18:37:45 +0200 <EvanR> showE (Constant x v) = show v
2023-10-18 18:38:41 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl)
2023-10-18 18:38:41 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host)
2023-10-18 18:38:41 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 18:38:52 +0200 <EvanR> I defined a dummy type for Value a
2023-10-18 18:38:56 +0200 <vektor> Huh. Ok. So the moment I match a Constant x v, I get access to Show a, and can do show v...
2023-10-18 18:39:15 +0200 <EvanR> yes
2023-10-18 18:39:52 +0200 <EvanR> I guess it doesn't require GADTs after all
2023-10-18 18:39:57 +0200 <vektor> So with that, I can build a prettyPrinter that doesn't rely on Show a to work, because when the time comes that I need a Show a instance, I'm in your exact pattern above...
2023-10-18 18:40:15 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 18:40:28 +0200 <ski> as mentioned before, when you pattern-match, the constraints associated with the data constructor will be made available
2023-10-18 18:40:29 +0200 <EvanR> this all relies on Show
2023-10-18 18:41:16 +0200 <EvanR> you used it in the data type definition, you use it in the pretty printer, and whatever constructs Expr has to be working on Showable values
2023-10-18 18:41:31 +0200 <EvanR> at least for Constant expr
2023-10-18 18:42:01 +0200 <EvanR> Null doesn't need it
2023-10-18 18:42:09 +0200 <vektor> So I could sidestep the constraint (Show a) by just not building any Constants into the Expr...
2023-10-18 18:42:15 +0200__monty__(~toonn@user/toonn)
2023-10-18 18:42:43 +0200 <EvanR> if you take away the constraint on stuff like Null yes
2023-10-18 18:42:53 +0200 <vektor> But the prettyPrinter :: Expr x a -> String  does not need a Show a, because it gets that when it encounters a Constant.
2023-10-18 18:43:07 +0200 <ski> i guess you could provide an environment for constants
2023-10-18 18:43:09 +0200 <vektor> (that last one re: "this all relies on Show")
2023-10-18 18:43:53 +0200 <EvanR> you can and should eliminate some of these constraints to rely less on Show, since it's not doing anything for e.g. Null
2023-10-18 18:44:23 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de) (Quit: Client closed)
2023-10-18 18:45:38 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 18:46:43 +0200b_jonas(~x@89.134.28.176)
2023-10-18 18:47:59 +0200dcoutts(~duncan@net77-43-75-226.mclink.it)
2023-10-18 18:50:07 +0200danse-nr3__(~francesco@151.57.122.70) (Ping timeout: 264 seconds)
2023-10-18 18:51:03 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 18:51:20 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 18:56:00 +0200tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net)
2023-10-18 18:56:00 +0200kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection)
2023-10-18 18:56:44 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 18:57:00 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 18:57:12 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds)
2023-10-18 18:58:30 +0200billchenchina(~billchenc@2a0c:b641:7a2:230::10) (Remote host closed the connection)
2023-10-18 18:58:30 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net)
2023-10-18 18:58:40 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-10-18 18:59:04 +0200danse-nr3__(~francesco@151.57.122.70)
2023-10-18 19:05:34 +0200Pozyomka(~pyon@user/pyon) (Quit: Pozyomka, my beloved: https://i.imgur.com/BMmVfTq.png)
2023-10-18 19:06:10 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de)
2023-10-18 19:07:13 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 19:08:29 +0200Pozyomka(~pyon@user/pyon)
2023-10-18 19:10:35 +0200 <vektor> Huh. now I have my valMap :: (Num b, Show b) => (a->b) -> Value a -> Value b. I can't seem to find the right syntax to add those constraints to the Functor Value instance.
2023-10-18 19:11:21 +0200 <ski> you don't
2023-10-18 19:11:44 +0200 <vektor> Because it's not a functor, or because it doesn't need those constraints?
2023-10-18 19:12:30 +0200 <ski> `fmap :: forall a b. (a -> b) -> f a -> f b' (for some particular `f', `Value' in your case) promises to work for *all* types `a',`b', not just ones that happen to be instances of `Num' and `Show'
2023-10-18 19:13:03 +0200ncf. o O ( exofunctors )
2023-10-18 19:13:11 +0200 <ski> your `valMap' only (apparently) works for types `b' which are instances of `Num' and `Show'
2023-10-18 19:15:29 +0200hugo(znc@verdigris.lysator.liu.se)
2023-10-18 19:15:44 +0200 <EvanR> you said you will only ever use types a which have Num and Show instance. But fmap allows you to contradict that by possibly producing b (any b)
2023-10-18 19:15:47 +0200 <ski> vektor : did you add constraints on data constructors of `Value', as well ?
2023-10-18 19:16:13 +0200 <EvanR> even b that doesn't support Show or NUm
2023-10-18 19:16:26 +0200 <vektor> ski: Yeah, doing that right now. Seemed like the reasonable next step after convincing myself that prettyPrinting Expr works as intended. :)
2023-10-18 19:17:59 +0200 <vektor> EvanR, yeah kinda hoped if this worked truly as I intended, then fmap would basically be constrained to only working on with (Num b, Show b).
2023-10-18 19:18:08 +0200 <EvanR> fmap chr (MkValue 34) = ?
2023-10-18 19:18:33 +0200 <EvanR> how would it even work as you intended, is the thing
2023-10-18 19:18:45 +0200 <EvanR> I think the type system is catching a logic error here
2023-10-18 19:19:03 +0200 <vektor> what's ' chr' ?
2023-10-18 19:19:08 +0200 <ski> @type chr
2023-10-18 19:19:09 +0200 <lambdabot> Int -> Char
2023-10-18 19:19:10 +0200 <ski> > chr 34
2023-10-18 19:19:11 +0200 <EvanR> maps a number to a Char
2023-10-18 19:19:12 +0200 <lambdabot> '"'
2023-10-18 19:19:25 +0200 <vektor> ahh, ok.
2023-10-18 19:19:29 +0200 <EvanR> using unicode
2023-10-18 19:19:32 +0200 <ski> > [chr n | n <- [64 .. 95]]
2023-10-18 19:19:33 +0200 <lambdabot> "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
2023-10-18 19:20:28 +0200 <EvanR> and Char isn't a Num
2023-10-18 19:20:38 +0200 <vektor> Well, I was expecting that to not type, I guess? The deeper into this rabbit hole of "just constrain the type param of this type to only work with certain types" goes, the weirder it gets.
2023-10-18 19:20:43 +0200rosco(~rosco@193.138.218.161) (Quit: Lost terminal)
2023-10-18 19:20:57 +0200 <ski> the type of `fmap' (which you can't change) ensures that it will type correctly
2023-10-18 19:21:21 +0200 <ski> (it promises to work for *all* types `a' and `b')
2023-10-18 19:21:52 +0200 <EvanR> vektor, you're right, it will only work for certain types
2023-10-18 19:22:05 +0200 <vektor> I mean, it isn't really that the fmap shouldn't type check, I was expecting Val Char to not type check. Like, in any context. Val Char isn't, therefore fmap chr someValue shouldn't....?
2023-10-18 19:22:07 +0200 <ski> result : since your `valMap' doesn't satisfy the promises that `fmap' makes, you can implement `fmap' by `valMap'
2023-10-18 19:22:21 +0200 <ski> er .. *can't*
2023-10-18 19:22:39 +0200 <EvanR> if Value is an instance of Functor, then fmap chr value does type check
2023-10-18 19:22:49 +0200 <EvanR> but as we see that makes no sense so it can't a Functor
2023-10-18 19:22:55 +0200 <EvanR> can't be
2023-10-18 19:23:21 +0200 <ski> vektor : "I was expecting Val Char to not type check. Like, in any context. Val Char isn't" -- which is why you can't implement `fmap' by `valMap'
2023-10-18 19:23:36 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 260 seconds)
2023-10-18 19:24:46 +0200Square(~Square@user/square) (Ping timeout: 260 seconds)
2023-10-18 19:25:02 +0200 <ski> (because `fmap f (Val x)' is supposed to be `Val (f x)', therefore `fmap chr (Val 34)' would be `Val (chr 34)', iow `Val' applied to a `Char'. you can't prevent the user of `fmap' supplying a function `f' (namely `chr') whose result type is `Char')
2023-10-18 19:25:21 +0200Square2(~Square4@user/square) (Ping timeout: 260 seconds)
2023-10-18 19:25:35 +0200 <vektor> Massive Is-Ought distinction here, of course. I was imagining (and I'm not convinced *yet* it can't be) a type system that just prevents types like "Value Char" from existing. Like... at a later point? You let me have my Functor Value, but when I actually use it to fmap chr, then the type systems sees that that would create (Value Char), which
2023-10-18 19:25:35 +0200 <vektor> violates my constraint on the type (Num a). Therefore, it breaks.
2023-10-18 19:26:27 +0200 <EvanR> I like how haskell is serious about the types, resulting in behavior that follows its own logic. Many languages with a type system violate their logic for reasons, making people disregard the value of logic
2023-10-18 19:26:28 +0200 <vektor> I get how not letting me have Functor Value upholds soundness here, but I can vaguely believe that that check could be, at least for the case I'm working with, delayed by one.
2023-10-18 19:26:30 +0200cpressey(~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed)
2023-10-18 19:27:10 +0200 <EvanR> you said you would only use types which are instances of Num
2023-10-18 19:27:19 +0200 <EvanR> which contradicts functor here
2023-10-18 19:27:50 +0200 <EvanR> so you are either saved from an error, or your original plan needs rethinking
2023-10-18 19:27:50 +0200 <ski> when you use `fmap chr blah', the type system only checks the types for `fmap',`chr',`blah' (and relevant instances in scope relating to types relevant to those). it does *not* check the implementation of any of `fmap',`chr',`blah' when type-checking. that would violate the interface abstraction that the type of the involved operations provides
2023-10-18 19:28:16 +0200 <vektor> EvanR: Re Logic: Absolutely. The reason this project is in haskell is because I wouldn't trust myself enough in python to keep this code base sane. Static guarantees are very nice indeed.
2023-10-18 19:29:38 +0200 <EvanR> kind of serious about the second part, for example this whole thing is about pretty printing expressions for debugging purposes. If that's the only reason for restricting to Num and Show, maybe you should step back
2023-10-18 19:29:52 +0200 <EvanR> maybe the parameters to Expr are more polymorphic than you thought
2023-10-18 19:30:29 +0200 <EvanR> putting constraints on operations not data by default leads you in that direction
2023-10-18 19:30:30 +0200ski. o O ( s/polymorphic/parametric/ )
2023-10-18 19:30:41 +0200 <vektor> ski: I understand that part. I understand why haskell does what it does here, but I could see a haskell that looks hat fmap chr blah and says "well, the type of that is Value Char. Value a has the constraint (Num a), and Char is not Num, therefore there's a type error here. Which means I could effectively fmap over Value only with operations f ::
2023-10-18 19:30:42 +0200 <vektor> (Num a, Num b) => a -> b, but it's not enforced by the fmap, but only by the resulting type. I'm well aware that's not how haskell does things.
2023-10-18 19:31:43 +0200 <ski> vektor : but that `chr' might be a parameter, which is only known to have type `x -> y' in this context, only in another context does `x' gets pinned down to `Int' and `y' to `Char'
2023-10-18 19:31:53 +0200 <EvanR> in java i would expect people to implement Functor anyway and just have it crash when someone calls in an fmap which makes no sense
2023-10-18 19:32:21 +0200 <EvanR> in haskell you don't let it go that far, ideally
2023-10-18 19:32:24 +0200 <ski> vektor : also "Char is not Num" is easily fixed (well, "fixed")
2023-10-18 19:33:56 +0200 <ski> @let instance Num Char where _ + _ = '+'; _ - _ = '-'; _ * _ = '*'; negate _ = '-'; abs _ = '|'; signum _ = 's'; fromInteger _ = 'n'
2023-10-18 19:33:57 +0200 <lambdabot> Defined.
2023-10-18 19:34:03 +0200 <vektor> EvanR: Yeah, I'm evaluating if I should step back and keep my code as is. The resulting trails of  Show and Num everywhere are ultimately tolerable, and I'm unsure just how much technical debt I'm piling on with this change if I have to put another change onto the language. I'm coming to the conclusion that what I imagined was a simple fix isn't
2023-10-18 19:34:04 +0200 <vektor> so simple.
2023-10-18 19:34:05 +0200 <ski> there you go, `Char' is an instance of `Num'
2023-10-18 19:34:27 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 19:34:37 +0200 <vektor> Curveball: Does it become a simple fix if I were to enumerate all possible acceptable types a? (Probably not, right?)
2023-10-18 19:34:37 +0200 <[exa]> ski: as an absolute bonus, (+) and (*) seem to be associative.
2023-10-18 19:34:49 +0200 <EvanR> vektor, actually, yes
2023-10-18 19:35:06 +0200 <ski> instances are OWA (Open-World Assumption), not CWA (Closed-World Assumption) (these are logic programming terminology. type classes are related to logic programming). you can't ensure noone won't later make a type an instance of a class
2023-10-18 19:36:09 +0200 <vektor> [exa] and while negate negate x =/= x, at least negate x == negate negate negate x. That's not too bad.
2023-10-18 19:36:43 +0200 <EvanR> implementing Num for Char just means you need to come up with another example re: Functor
2023-10-18 19:37:10 +0200 <EvanR> and there's no way to implement Num for literally all types
2023-10-18 19:37:15 +0200 <ski> [exa] : but distributive law fails .. dang
2023-10-18 19:37:18 +0200 <vektor> logic programming. Another field this small project of mine interfaces with that I understand not nearly enough of. Beyond the, ohh, half a dozen other computer science fields that the project interacts with, lol.
2023-10-18 19:37:43 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds)
2023-10-18 19:38:07 +0200 <ski> LP is a lovely paradigm
2023-10-18 19:38:20 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 19:38:24 +0200ski's recently been reading about ordered linear logic programming
2023-10-18 19:39:43 +0200 <vektor> Now that I think about it, logic programming is probably, out of all the fields I should be knowing more about, the one field my project doesn't directly interface with, just kinda compete with in a way. Well, a flavor of logic programming anyway.
2023-10-18 19:39:52 +0200 <ski> vektor : just in case you didn't know, inference rules in type systems are basically logic programming clauses (rules and facts), making up a logic program (although it might not be to useful to execute, at least naively, depending)
2023-10-18 19:40:31 +0200L29Ah(~L29Ah@wikipedia/L29Ah)
2023-10-18 19:41:02 +0200 <vektor> When I was looking into type inference  (the x in Expr x a is for type elaborations) I think I remember seeing a talk about someone who did exactly that; doing type inference as a logic program.
2023-10-18 19:41:02 +0200mc47(~mc47@xmonad/TheMC47) (Remote host closed the connection)
2023-10-18 19:41:34 +0200 <ski> apart from the connection between type classes & instances and predicates & clauses that i already mentioned above
2023-10-18 19:42:18 +0200 <vektor> ski: Shouldn't it then be possible to simply assert "Value Char isn't" in that logic program and be done with it, making my vision of Utopia from above viable? It'd break anytime you fmap with something funny, but work as long as the fmap is from Num to Num.
2023-10-18 19:42:20 +0200 <EvanR> vektor, ok, maybe it's not so simple. But if you are thinking there are only 3 possible a, you can define data ConcreteExpr a where AExpr :: Expr A -> ConcreteExpr A; BExpr :: Expr B -> ConcreteExpr B; CExpr :: Expr C -> ConcreteExpr C, then ConcreteExpr a can only exist at those three types
2023-10-18 19:43:21 +0200 <ski> vektor : in case you're interested, i could suggest a couple of papers
2023-10-18 19:43:21 +0200 <EvanR> if A B and C are Num and Show, then functions on ConcreteExpr obviously know that
2023-10-18 19:43:22 +0200 <ski> @where polymorphic-type-inference
2023-10-18 19:43:22 +0200 <lambdabot> "Polymorphic Type Inference" by Michael I. Schwartzbach in 1995-03 at <https://cs.au.dk/~mis/typeinf.p(s|df)>,<http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.1493>
2023-10-18 19:43:25 +0200 <ski> @where on-understanding
2023-10-18 19:43:25 +0200 <lambdabot> "On Understanding Types, Data Abstraction, and Polymorphism" by Luca Cardelli,Peter Wegner in 1985-12 at <http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf>
2023-10-18 19:43:27 +0200 <vektor> EvanR: Why do I have the feeling this sounds nice in a minimally working example, but is horrible once my 20 constructors of Expr get involved? :O
2023-10-18 19:43:29 +0200 <ski> @where on-understanding-revisited
2023-10-18 19:43:29 +0200 <lambdabot> "On Understanding Data Abstraction, Revisited" by William R. Cook in 2009-10 at <http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf>
2023-10-18 19:44:12 +0200 <EvanR> vektor, it's wrapping the large parameterized Expr type, not duplicating. But yes it could get hairy for other reasons. And you really lose out on generic programming that the usual way does by default
2023-10-18 19:44:18 +0200 <vektor> ski, my supervisor's reading 'recommendations' take precedence before yours, FYI. :)
2023-10-18 19:44:22 +0200 <ski> vektor : "the x in Expr x a is for type elaborations" -- yea, that's why i mentioned DecoratingStructures (and IndirectComposite), one and a half hour ago
2023-10-18 19:44:36 +0200 <ski> vektor : fair enough :D
2023-10-18 19:45:29 +0200 <ski> vektor : "Shouldn't it then be possible to simply assert \"Value Char isn't\" in that logic program" -- no, because it's OWA, doesn't deal in negative knowledge. knowledge can only be ("monotonically") added, not subtracted
2023-10-18 19:45:54 +0200 <vektor> Right, right.
2023-10-18 19:46:00 +0200skisees EvanR's suggesting real GADTs now
2023-10-18 19:46:01 +0200 <vektor> Did I mention I should know more about logic programming?
2023-10-18 19:46:14 +0200 <vektor> > * ski sees EvanR's suggesting real GADTs now
2023-10-18 19:46:14 +0200 <vektor> Lol
2023-10-18 19:46:15 +0200 <lambdabot> <hint>:1:1: error: parse error on input ‘*’
2023-10-18 19:46:41 +0200 <vektor> quoting, not prompting, ya tin can.
2023-10-18 19:46:54 +0200 <EvanR> GADT LIFE
2023-10-18 19:46:59 +0200skican teen
2023-10-18 19:47:22 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk)
2023-10-18 19:48:01 +0200 <ski> vektor : anyway, i happen to think the first paper above, by Schwartzbach, is a relatively soft intro to the basics of type inference. it for sure helped me a lot when i started learning about all this, years ago, all on my own
2023-10-18 19:48:05 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 19:48:43 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 19:49:46 +0200 <vektor> I've gotten most of Stephen Diehl's WriteYouAHaskell done already one way or another. Well, the parts that are published anyway. Some gaping holes there, and I'm doing some *unusual* things that don't fit neatly into an HM algorithm.
2023-10-18 19:49:53 +0200 <vektor> But I'll be sure to give it a look.
2023-10-18 19:52:17 +0200 <[exa]> vektor: "unusual things" ?
2023-10-18 19:52:22 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 252 seconds)
2023-10-18 19:52:24 +0200 <[exa]> (/me curious)
2023-10-18 19:53:28 +0200 <vektor> My IRC chat indicates we DM'd before, so I'm pretty sure your curiosity has been fed to a degree a while back. :D
2023-10-18 19:53:34 +0200dcoutts(~duncan@net77-43-75-226.mclink.it) (Ping timeout: 272 seconds)
2023-10-18 19:55:03 +0200nickiminjaj(~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2023-10-18 19:55:24 +0200 <vektor> s/chat/client
2023-10-18 19:59:27 +0200danse-nr3__(~francesco@151.57.122.70) (Ping timeout: 240 seconds)
2023-10-18 19:59:31 +0200 <ski> vektor : your `Expr' suggests you may be doing something with stochastic distributions ?
2023-10-18 19:59:57 +0200m1dnight(~christoph@78-22-4-67.access.telenet.be) (Quit: WeeChat 4.0.5)
2023-10-18 20:00:15 +0200m1dnight(~christoph@78-22-4-67.access.telenet.be)
2023-10-18 20:00:33 +0200dcoutts(~duncan@net77-43-75-226.mclink.it)
2023-10-18 20:00:37 +0200 <vektor> That's correct.
2023-10-18 20:01:36 +0200 <EvanR> vektor, if you derive Generic, then several pretty printer libraries will just work. Or you can make your own which uses Generic
2023-10-18 20:01:45 +0200 <EvanR> might be a shortcut
2023-10-18 20:03:29 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk)
2023-10-18 20:07:47 +0200fendor(~fendor@2a02:8388:1640:be00:aab:1226:f274:5021) (Remote host closed the connection)
2023-10-18 20:09:54 +0200L29Ah(~L29Ah@wikipedia/L29Ah) ()
2023-10-18 20:10:54 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 245 seconds)
2023-10-18 20:11:07 +0200TimWolla(~timwolla@2a01:4f8:150:6153:beef::6667) (Ping timeout: 264 seconds)
2023-10-18 20:16:33 +0200__monty_1(~toonn@user/toonn)
2023-10-18 20:16:49 +0200stiell_(~stiell@gateway/tor-sasl/stiell) (*.net *.split)
2023-10-18 20:16:49 +0200gmg(~user@user/gehmehgeh) (*.net *.split)
2023-10-18 20:16:49 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (*.net *.split)
2023-10-18 20:16:49 +0200chexum(~quassel@gateway/tor-sasl/chexum) (*.net *.split)
2023-10-18 20:16:49 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex) (*.net *.split)
2023-10-18 20:16:49 +0200adanwan_(~adanwan@gateway/tor-sasl/adanwan) (*.net *.split)
2023-10-18 20:16:49 +0200ChaiTRex(~ChaiTRex@user/chaitrex) (*.net *.split)
2023-10-18 20:16:49 +0200ec(~ec@gateway/tor-sasl/ec) (*.net *.split)
2023-10-18 20:16:49 +0200califax(~califax@user/califx) (*.net *.split)
2023-10-18 20:16:49 +0200chiselfuse(~chiselfus@user/chiselfuse) (*.net *.split)
2023-10-18 20:16:50 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de) (*.net *.split)
2023-10-18 20:18:13 +0200__monty__(~toonn@user/toonn) (Ping timeout: 252 seconds)
2023-10-18 20:18:58 +0200Simikando(~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Quit: Leaving)
2023-10-18 20:25:38 +0200dcoutts(~duncan@net77-43-75-226.mclink.it) (Ping timeout: 258 seconds)
2023-10-18 20:28:55 +0200phma(phma@2001:5b0:211b:9d88:b368:1baa:7a2:22b7) (Read error: Connection reset by peer)
2023-10-18 20:29:56 +0200phma(phma@2001:5b0:210b:f338:ff94:b91f:1e4:46fd)
2023-10-18 20:33:17 +0200Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
2023-10-18 20:35:28 +0200TimWolla(~timwolla@2a01:4f8:150:6153:beef::6667)
2023-10-18 20:37:29 +0200chele(~chele@user/chele) (Remote host closed the connection)
2023-10-18 20:37:59 +0200michalz(~michalz@185.246.207.221) (Ping timeout: 255 seconds)
2023-10-18 20:40:15 +0200michalz(~michalz@185.246.207.217)
2023-10-18 20:46:47 +0200L29Ah(~L29Ah@wikipedia/L29Ah)
2023-10-18 20:50:29 +0200Pickchea(~private@user/pickchea)
2023-10-18 20:53:31 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 20:53:53 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-10-18 20:55:30 +0200moni_(~moni@cpe-174-106-185-141.ec.res.rr.com) (Remote host closed the connection)
2023-10-18 20:58:49 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
2023-10-18 21:02:05 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl)
2023-10-18 21:02:05 +0200nickiminjaj(~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host)
2023-10-18 21:02:05 +0200nickiminjaj(~nickiminj@user/laxhh)
2023-10-18 21:07:10 +0200ft(~ft@p3e9bc680.dip0.t-ipconnect.de)
2023-10-18 21:08:27 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
2023-10-18 21:08:44 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 21:12:28 +0200nickiminjaj(~nickiminj@user/laxhh) (Quit: Textual IRC Client: www.textualapp.com)
2023-10-18 21:14:57 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de)
2023-10-18 21:15:59 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 21:16:54 +0200vektor(~vektor@IP-045131036068.dynamic.medianet-world.de) (Client Quit)
2023-10-18 21:26:04 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-10-18 21:29:08 +0200harveypwca(~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db)
2023-10-18 21:34:07 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection)
2023-10-18 21:36:21 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-10-18 21:49:03 +0200califax(~califax@user/califx)
2023-10-18 21:52:27 +0200bjobjo(~bjobjo@user/bjobjo) (Quit: leaving)
2023-10-18 21:54:59 +0200CiaoSen(~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef)
2023-10-18 21:56:36 +0200ChaiTRex(~ChaiTRex@user/chaitrex)
2023-10-18 21:58:34 +0200chiselfuse(~chiselfus@user/chiselfuse)
2023-10-18 21:59:13 +0200ec(~ec@gateway/tor-sasl/ec)
2023-10-18 21:59:21 +0200stiell_(~stiell@gateway/tor-sasl/stiell)
2023-10-18 21:59:27 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643)
2023-10-18 22:00:11 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2023-10-18 22:04:10 +0200gmg(~user@user/gehmehgeh)
2023-10-18 22:05:04 +0200Inst(~Inst@120.244.192.250) (Ping timeout: 245 seconds)
2023-10-18 22:07:59 +0200ski(~ski@88.131.7.247) (Ping timeout: 258 seconds)
2023-10-18 22:09:12 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 22:13:32 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Ping timeout: 248 seconds)
2023-10-18 22:16:34 +0200vglfr(~vglfr@88.155.159.184) (Read error: Connection reset by peer)
2023-10-18 22:16:54 +0200vglfr(vglfr@gateway/vpn/protonvpn/vglfr)
2023-10-18 22:20:50 +0200Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
2023-10-18 22:22:21 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.5)
2023-10-18 22:26:53 +0200zenstoic(uid461840@id-461840.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 22:28:50 +0200asivitz(uid178348@id-178348.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2023-10-18 22:28:55 +0200Inst(~Inst@120.244.192.250)
2023-10-18 22:32:44 +0200vglfr(vglfr@gateway/vpn/protonvpn/vglfr) (Ping timeout: 255 seconds)
2023-10-18 22:37:07 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
2023-10-18 22:37:28 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
2023-10-18 22:44:32 +0200takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2023-10-18 22:47:09 +0200__monty_1__monty__
2023-10-18 22:47:25 +0200__monty__(~toonn@user/toonn) (Quit: leaving)
2023-10-18 22:48:03 +0200vglfr(~vglfr@88.155.159.184)
2023-10-18 22:50:38 +0200oo_miguel(~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Ping timeout: 255 seconds)
2023-10-18 22:57:10 +0200Jackneill(~Jackneill@20014C4E1E0E6F00DA1379EF70CDB149.dsl.pool.telekom.hu) (Ping timeout: 252 seconds)
2023-10-18 23:02:30 +0200michalz(~michalz@185.246.207.217) (Remote host closed the connection)
2023-10-18 23:04:40 +0200shapr(~user@2600:1700:c640:3100:70ed:821a:ab80:9f0d)
2023-10-18 23:09:02 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-10-18 23:09:05 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e)
2023-10-18 23:10:12 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 23:10:27 +0200tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer)
2023-10-18 23:10:49 +0200jmdaemon(~jmdaemon@user/jmdaemon)
2023-10-18 23:11:02 +0200Vajb(~Vajb@207.61.167.122) (Read error: Connection reset by peer)
2023-10-18 23:11:11 +0200Vajb(~Vajb@207.61.167.122)
2023-10-18 23:15:27 +0200logothesia(~logothesi@user/logothesia)
2023-10-18 23:15:39 +0200logothesia(~logothesi@user/logothesia) ()
2023-10-18 23:19:25 +0200mvk(~mvk@2607:fea8:5c9a:a600::900d)
2023-10-18 23:19:28 +0200mvk(~mvk@2607:fea8:5c9a:a600::900d) (Client Quit)
2023-10-18 23:21:05 +0200acidjnk_new(~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2023-10-18 23:26:25 +0200jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds)
2023-10-18 23:32:34 +0200harveypwca(~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db) (Quit: Leaving)
2023-10-18 23:38:44 +0200falafel(~falafel@62.175.113.194.dyn.user.ono.com)
2023-10-18 23:39:01 +0200euleritian(~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds)
2023-10-18 23:39:47 +0200euleritian(~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de)
2023-10-18 23:46:41 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-10-18 23:51:33 +0200sm(~sm@plaintextaccounting/sm)
2023-10-18 23:52:10 +0200jmdaemon(~jmdaemon@user/jmdaemon)
2023-10-18 23:57:07 +0200gmg(~user@user/gehmehgeh) (Quit: Leaving)
2023-10-18 23:59:32 +0200pavonia(~user@user/siracusa)
2023-10-18 23:59:49 +0200Guest|69(~Guest|69@rn-nat-129-97-131-0.dynamic.uwaterloo.ca)
2023-10-18 23:59:57 +0200Guest|69(~Guest|69@rn-nat-129-97-131-0.dynamic.uwaterloo.ca) (Client Quit)