Home liberachat/#haskell: Logs Calendar

Logs on 2023-12-14 (liberachat/#haskell)

00:00:37 mobivme joins (~mobivme@112.201.111.217)
00:03:03 Sgeo joins (~Sgeo@user/sgeo)
00:07:04 × acidjnk_new quits (~acidjnk@p200300d6e72b9302dc7c5b25c70fbc45.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
00:13:23 × oo_miguel quits (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Ping timeout: 260 seconds)
00:13:35 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
00:22:16 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 276 seconds)
00:25:59 × _xor quits (~xor@72.49.195.41) (Read error: Connection reset by peer)
00:26:54 _xor joins (~xor@72.49.195.41)
00:29:14 × myxos quits (~myxos@065-028-251-121.inf.spectrum.com) (Quit: myxos)
00:37:55 oo_miguel joins (~Thunderbi@78-11-179-96.static.ip.netia.com.pl)
00:41:22 × Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 256 seconds)
00:45:33 × _xor quits (~xor@72.49.195.41) (Read error: Connection reset by peer)
00:47:51 _xor joins (~xor@72.49.195.41)
00:51:18 × _xor quits (~xor@72.49.195.41) (Read error: Connection reset by peer)
00:53:35 _xor joins (~xor@72.49.195.41)
00:58:01 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 246 seconds)
01:02:16 × califax quits (~califax@user/califx) (Remote host closed the connection)
01:03:51 califax joins (~califax@user/califx)
01:13:14 TonyStone joins (~TonyStone@074-076-057-186.res.spectrum.com)
01:16:58 myxos joins (~myxos@065-028-251-121.inf.spectrum.com)
01:35:02 Square2 joins (~Square4@user/square)
01:37:51 × Square quits (~Square@user/square) (Ping timeout: 252 seconds)
01:41:29 × Joao003 quits (~Joao003@190.108.99.230) (Quit: Bye!)
02:17:58 araujo joins (~araujo@216.73.163.29)
02:18:33 pavonia joins (~user@user/siracusa)
02:18:51 alp_ joins (~alp@2001:861:e3d6:8f80:6d4b:afde:b655:292c)
02:20:16 × xff0x quits (~xff0x@ai085147.d.east.v6connect.net) (Ping timeout: 246 seconds)
02:21:32 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
02:26:11 × mhatta quits (~mhatta@www21123ui.sakura.ne.jp) (Remote host closed the connection)
02:26:15 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 252 seconds)
02:26:37 mhatta joins (~mhatta@www21123ui.sakura.ne.jp)
02:46:37 tri joins (~tri@ool-18bc2e74.dyn.optonline.net)
02:47:52 × Igloo quits (~ian@matrix.chaos.earth.li) (Ping timeout: 276 seconds)
02:51:13 × tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Ping timeout: 256 seconds)
02:57:32 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
03:00:32 × pastly quits (~pastly@gateway/tor-sasl/pastly) (Remote host closed the connection)
03:00:32 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
03:01:06 pastly joins (~pastly@gateway/tor-sasl/pastly)
03:01:21 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
03:05:59 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
03:12:44 × TonyStone quits (~TonyStone@074-076-057-186.res.spectrum.com) (Quit: Leaving)
03:16:32 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
03:16:32 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
03:16:32 finn_elija is now known as FinnElija
03:16:44 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
03:19:21 Igloo joins (~ian@matrix.chaos.earth.li)
03:19:43 × ystael quits (~ystael@user/ystael) (Ping timeout: 276 seconds)
03:26:03 × johnw quits (~johnw@69.62.242.138) (Quit: ZNC - http://znc.in)
03:29:41 × dwt_ quits (~dwt_@2601:2c6:8381:e5c:945:c021:4cfd:54e5) (Ping timeout: 240 seconds)
03:29:52 bilegeek joins (~bilegeek@2600:1008:b04c:8dbf:230:d76f:f63e:7bf5)
03:30:26 × edr quits (~edr@user/edr) (Quit: Leaving)
03:32:45 × Ranhir quits (~Ranhir@157.97.53.139) (Read error: Connection reset by peer)
03:32:59 × td_ quits (~td@i5387093E.versanet.de) (Ping timeout: 264 seconds)
03:32:59 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:c0d1:ef99:e080:d9) (Remote host closed the connection)
03:33:15 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
03:34:15 tri joins (~tri@ool-18bc2e74.dyn.optonline.net)
03:34:44 td_ joins (~td@i53870937.versanet.de)
03:35:34 Inst joins (~Inst@129.126.215.52)
03:35:41 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
03:37:03 Ranhir joins (~Ranhir@157.97.53.139)
03:39:17 tri_ joins (~tri@ool-18bc2e74.dyn.optonline.net)
03:42:36 × terrorjack quits (~terrorjac@2a01:4f8:c17:87f8::) (Quit: The Lounge - https://thelounge.chat)
03:43:46 × mobivme quits (~mobivme@112.201.111.217) (Ping timeout: 276 seconds)
03:44:59 Inst parts (~Inst@129.126.215.52) (Leaving)
03:45:28 terrorjack joins (~terrorjac@2a01:4f8:c17:87f8::)
03:45:43 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
03:57:23 × alp_ quits (~alp@2001:861:e3d6:8f80:6d4b:afde:b655:292c) (Ping timeout: 256 seconds)
03:59:12 × igemnace quits (~ian@user/igemnace) (Ping timeout: 252 seconds)
04:04:13 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
04:13:50 × tomboy64 quits (~tomboy64@user/tomboy64) (Ping timeout: 256 seconds)
04:16:11 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 264 seconds)
04:19:13 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
04:20:09 rosco joins (~rosco@42.153.128.116)
04:23:39 × rosco quits (~rosco@42.153.128.116) (Read error: Connection reset by peer)
04:23:48 not_reserved joins (~not_reser@45.88.222.254)
04:23:49 rosco joins (~rosco@2001:e68:5411:21b:709e:ff04:8b05:a76c)
04:24:01 igemnace joins (~ian@user/igemnace)
04:31:21 johnw joins (~johnw@69.62.242.138)
04:31:42 × tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
04:34:43 tri joins (~tri@ool-18bc2e74.dyn.optonline.net)
04:35:55 aforemny joins (~aforemny@2001:9e8:6cd0:cf00:ceee:c285:db94:113d)
04:36:32 × aforemny_ quits (~aforemny@i59F516CF.versanet.de) (Ping timeout: 256 seconds)
04:37:39 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
04:38:48 × waleee quits (~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 256 seconds)
04:50:04 tomboy64 joins (~tomboy64@user/tomboy64)
04:58:49 × raym quits (~ray@user/raym) (Ping timeout: 255 seconds)
04:59:14 × pastly quits (~pastly@gateway/tor-sasl/pastly) (Read error: Connection reset by peer)
04:59:14 × chiselfuse quits (~chiselfus@user/chiselfuse) (Read error: Connection reset by peer)
04:59:15 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Remote host closed the connection)
04:59:44 chiselfuse joins (~chiselfus@user/chiselfuse)
04:59:47 pastly joins (~pastly@gateway/tor-sasl/pastly)
04:59:54 ChaiTRex joins (~ChaiTRex@user/chaitrex)
05:00:18 trev joins (~trev@user/trev)
05:05:53 raym joins (~ray@user/raym)
05:09:12 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
05:11:59 × shOkEy quits (~shOkEy@92-249-185-141.pool.digikabel.hu) (Ping timeout: 264 seconds)
05:13:17 shOkEy joins (~shOkEy@176-241-19-57.pool.digikabel.hu)
05:14:54 × tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection)
05:17:33 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 268 seconds)
05:19:17 × tri_ quits (~tri@ool-18bc2e74.dyn.optonline.net) (Ping timeout: 240 seconds)
05:22:45 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
05:23:19 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
05:25:52 × araujo quits (~araujo@216.73.163.29) (Ping timeout: 268 seconds)
05:35:44 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 268 seconds)
05:35:45 × igemnace quits (~ian@user/igemnace) (Read error: Connection reset by peer)
05:38:18 <glguy> Feels like these aoc problems are specially made for Haskell this year ^_^
05:39:31 <int-e> Kind of. I misused one of my utility functions though and that cost me a lot of time.
05:41:42 <Axman6> Sounds like you need stronger types
05:42:48 <glguy> Yeah, dependent types would probably speed you up
05:43:48 euleritian joins (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de)
05:46:57 × not_reserved quits (~not_reser@45.88.222.254) (Quit: Client closed)
05:47:16 not_reserved joins (~not_reser@45.88.222.254)
05:50:46 × euleritian quits (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de) (Ping timeout: 256 seconds)
05:52:50 igemnace joins (~ian@user/igemnace)
05:56:22 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 276 seconds)
05:56:44 <xerox> lovely problem today
05:57:43 euleritian joins (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de)
06:02:27 michalz_ joins (~michalz@185.246.207.222)
06:02:56 Core6935 joins (~rosco@42.153.140.76)
06:05:30 × rosco quits (~rosco@2001:e68:5411:21b:709e:ff04:8b05:a76c) (Ping timeout: 256 seconds)
06:07:29 × michalz_ quits (~michalz@185.246.207.222) (Quit: ZNC 1.8.2 - https://znc.in)
06:07:48 michalz_ joins (~michalz@185.246.207.222)
06:10:15 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
06:10:52 rosco joins (~rosco@42.153.135.174)
06:10:58 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
06:13:14 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
06:14:14 × euleritian quits (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de) (Read error: Connection reset by peer)
06:14:35 × Core6935 quits (~rosco@42.153.140.76) (Ping timeout: 260 seconds)
06:14:47 euleritian joins (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de)
06:15:09 × euleritian quits (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de) (Read error: Connection reset by peer)
06:15:27 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
06:18:48 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:21:53 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 256 seconds)
06:22:47 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
06:26:07 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 255 seconds)
06:26:08 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
06:26:51 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
06:32:04 × Maeda quits (~Maeda@91-161-10-149.subs.proxad.net) (Quit: BRB testing...)
06:32:23 Core8308 joins (~rosco@42.153.137.144)
06:34:01 Core6606 joins (~rosco@42.153.133.247)
06:35:29 × rosco quits (~rosco@42.153.135.174) (Ping timeout: 256 seconds)
06:35:36 Maeda joins (~Maeda@91-161-10-149.subs.proxad.net)
06:36:47 × Core8308 quits (~rosco@42.153.137.144) (Ping timeout: 268 seconds)
06:39:43 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
06:40:21 × jargon quits (~jargon@32.sub-174-238-226.myvzw.com) (Remote host closed the connection)
06:42:52 × Core6606 quits (~rosco@42.153.133.247) (Read error: Connection reset by peer)
06:43:06 rosco joins (~rosco@2001:e68:5411:21b:709e:ff04:8b05:a76c)
06:44:27 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
06:50:48 × igemnace quits (~ian@user/igemnace) (Quit: WeeChat 4.1.2)
06:51:03 igemnace joins (~ian@user/igemnace)
06:55:57 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
06:56:49 alp_ joins (~alp@2001:861:e3d6:8f80:7cd1:a713:1d11:e2cd)
07:08:23 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds)
07:08:30 euleritian joins (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de)
07:11:48 × Square2 quits (~Square4@user/square) (Ping timeout: 256 seconds)
07:12:09 × euleritian quits (~euleritia@dynamic-089-204-137-160.89.204.137.pool.telefonica.de) (Read error: Connection reset by peer)
07:12:27 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
07:12:53 × petrichor quits (~znc-user@user/petrichor) (Quit: ZNC 1.8.2 - https://znc.in)
07:16:10 acidjnk joins (~acidjnk@p200300d6e72b9302007c3ef187da4880.dip0.t-ipconnect.de)
07:17:16 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
07:20:11 sord937 joins (~sord937@gateway/tor-sasl/sord937)
07:27:23 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.1.1)
07:28:37 × maars quits (uid160334@id-160334.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
07:29:03 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:51:24 × shriekingnoise quits (~shrieking@186.137.175.87) (Ping timeout: 268 seconds)
08:05:12 × not_reserved quits (~not_reser@45.88.222.254) (Ping timeout: 250 seconds)
08:13:00 not_reserved joins (~not_reser@154.16.157.96)
08:16:12 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
08:19:04 sagax joins (~sagax_nb@user/sagax)
08:20:46 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 245 seconds)
08:20:57 azimut joins (~azimut@gateway/tor-sasl/azimut)
08:29:48 akegalj joins (~akegalj@93-137-124-143.adsl.net.t-com.hr)
08:34:30 CiaoSen joins (~Jura@2a05:5800:283:500:ca4b:d6ff:fec1:99da)
08:37:44 fendor joins (~fendor@2a02:8388:1605:d100:267b:1353:13d7:4f0c)
08:39:10 vpan joins (~vpan@mail.elitnet.lt)
08:39:15 gmg joins (~user@user/gehmehgeh)
08:44:28 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
08:49:25 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
08:50:07 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
08:50:55 gmg joins (~user@user/gehmehgeh)
08:52:08 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
08:52:31 × califax quits (~califax@user/califx) (Remote host closed the connection)
08:52:50 califax joins (~califax@user/califx)
08:57:02 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
09:03:34 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 276 seconds)
09:05:17 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 240 seconds)
09:20:00 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:c0d1:ef99:e080:d9)
09:21:21 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
09:23:45 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
09:30:53 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
09:31:30 euleritian joins (~euleritia@dynamic-089-204-137-151.89.204.137.pool.telefonica.de)
09:36:54 × rosco quits (~rosco@2001:e68:5411:21b:709e:ff04:8b05:a76c) (Quit: Gotta go.)
09:36:55 × califax quits (~califax@user/califx) (Remote host closed the connection)
09:37:18 califax joins (~califax@user/califx)
09:38:35 rosco joins (~rosco@175.136.152.56)
09:42:28 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
09:44:45 danse-nr3 joins (~danse@151.57.232.210)
09:46:30 × danse-nr3 quits (~danse@151.57.232.210) (Read error: Connection reset by peer)
09:47:11 danse-nr3 joins (~danse@151.57.245.15)
09:47:32 × danse-nr3 quits (~danse@151.57.245.15) (Remote host closed the connection)
09:47:56 danse-nr3 joins (~danse@151.57.245.15)
09:49:16 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
09:54:49 × Axman6 quits (~Axman6@user/axman6) (*.net *.split)
09:54:56 × ft quits (~ft@p4fc2ae2b.dip0.t-ipconnect.de) (Quit: leaving)
09:55:22 × mikess quits (~sam@user/mikess) (Ping timeout: 255 seconds)
09:56:32 × califax quits (~califax@user/califx) (Remote host closed the connection)
09:56:59 califax joins (~califax@user/califx)
09:59:13 Axman6 joins (~Axman6@user/axman6)
10:02:40 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
10:04:22 × tzh quits (~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Quit: zzz)
10:05:29 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
10:05:34 × euleritian quits (~euleritia@dynamic-089-204-137-151.89.204.137.pool.telefonica.de) (Read error: Connection reset by peer)
10:05:50 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
10:06:35 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 264 seconds)
10:11:22 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
10:11:46 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
10:12:06 cfricke joins (~cfricke@user/cfricke)
10:13:25 chele joins (~chele@user/chele)
10:16:29 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
10:24:45 × califax quits (~califax@user/califx) (Remote host closed the connection)
10:25:07 califax joins (~califax@user/califx)
10:37:09 L29Ah joins (~L29Ah@wikipedia/L29Ah)
10:38:38 × bilegeek quits (~bilegeek@2600:1008:b04c:8dbf:230:d76f:f63e:7bf5) (Quit: Leaving)
10:43:49 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 256 seconds)
10:45:56 × not_reserved quits (~not_reser@154.16.157.96) (Quit: Client closed)
10:46:25 not_reserved joins (~not_reser@154.16.157.96)
10:51:42 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
10:51:42 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
10:51:42 finn_elija is now known as FinnElija
10:53:40 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
11:01:14 ubert joins (~Thunderbi@2a02:8109:ab8a:5a00:c848:40d2:238e:e32b)
11:02:18 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
11:03:20 __monty__ joins (~toonn@user/toonn)
11:05:50 xff0x joins (~xff0x@ai085147.d.east.v6connect.net)
11:06:39 × Pozyomka_ quits (~pyon@user/pyon) (Quit: WeeChat 4.1.1)
11:26:56 × rvalue quits (~rvalue@user/rvalue) (Ping timeout: 268 seconds)
11:32:34 × CiaoSen quits (~Jura@2a05:5800:283:500:ca4b:d6ff:fec1:99da) (Ping timeout: 246 seconds)
11:34:38 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 268 seconds)
11:35:06 euleritian joins (~euleritia@77.22.252.56)
11:35:35 waleee joins (~waleee@h-176-10-144-38.NA.cust.bahnhof.se)
11:36:20 alexherbo2 joins (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net)
11:37:51 alp__ joins (~alp@static-176-175-89-30.ftth.abo.bbox.fr)
11:40:11 michalz` joins (~michal.zi@185.246.207.193)
11:40:16 × alp_ quits (~alp@2001:861:e3d6:8f80:7cd1:a713:1d11:e2cd) (Ping timeout: 246 seconds)
11:41:19 rvalue joins (~rvalue@user/rvalue)
11:49:19 × califax quits (~califax@user/califx) (Ping timeout: 240 seconds)
11:49:26 califax_ joins (~califax@user/califx)
11:51:45 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
11:52:25 califax_ is now known as califax
11:55:55 × alp__ quits (~alp@static-176-175-89-30.ftth.abo.bbox.fr) (Ping timeout: 268 seconds)
11:56:26 <danse-nr3> hi all. Regular expressions versus monadic parsing. Is there any paper i could read or library i could use to deepen the theoretical relationship between the two?
12:02:19 <Axman6> i think the relationshipmis a lot clearer with applicstive parsing.
12:02:39 <danse-nr3> useful clue, thanks
12:03:00 <Axman6> and the differences between regular grammars and context sensitive ones
12:03:12 <danse-nr3> great
12:06:39 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
12:07:56 kilolympus joins (~kilolympu@31.205.200.246)
12:10:33 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
12:13:17 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
12:16:44 araujo joins (~araujo@45.131.194.179)
12:17:44 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
12:21:34 × euleritian quits (~euleritia@77.22.252.56) (Ping timeout: 246 seconds)
12:22:27 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 252 seconds)
12:22:36 euleritian joins (~euleritia@dynamic-089-204-137-151.89.204.137.pool.telefonica.de)
12:24:01 × akegalj quits (~akegalj@93-137-124-143.adsl.net.t-com.hr) (Ping timeout: 246 seconds)
12:25:01 × euleritian quits (~euleritia@dynamic-089-204-137-151.89.204.137.pool.telefonica.de) (Read error: Connection reset by peer)
12:25:18 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
12:26:15 Inst joins (~Inst@129.126.215.52)
12:26:28 <Inst> do you know why servant might fail to display a page? Like, what kind of firewall settings?
12:27:32 × califax quits (~califax@user/califx) (Remote host closed the connection)
12:27:44 <danse-nr3> a firewall issue would not reach servant
12:28:06 califax joins (~califax@user/califx)
12:28:10 <danse-nr3> by the way, what do you referred yesterday with "it is happening"?
12:28:24 <Inst> nah, just me going crazy
12:28:39 <danse-nr3> alright (:
12:28:40 <Inst> type MainPage = Get `[HTML] Html
12:29:20 <Inst> type Train = "train" :> Get '[HTML] Html
12:29:31 <Inst> type API = MainPage :<|> Train
12:29:34 <Inst> any idea how this could go wrong?
12:30:38 <danse-nr3> type error or other error? You mentioned a firewall before...
12:31:36 <Inst> yeah, it's def a ufw firewall issue
12:32:51 edr joins (~edr@user/edr)
12:34:43 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Read error: Connection reset by peer)
12:35:34 <Inst> fixed, thanks
12:35:42 <danse-nr3> v
12:36:00 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
12:38:37 CiaoSen joins (~Jura@2a05:5800:283:500:ca4b:d6ff:fec1:99da)
12:45:04 Pozyomka joins (~pyon@user/pyon)
12:55:02 petrichor joins (~znc-user@user/petrichor)
12:55:46 × Inst quits (~Inst@129.126.215.52) (Ping timeout: 256 seconds)
12:59:18 × danse-nr3 quits (~danse@151.57.245.15) (Ping timeout: 252 seconds)
13:01:54 × rosco quits (~rosco@175.136.152.56) (Quit: Lost terminal)
13:01:55 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
13:10:51 Inst joins (~Inst@129.126.215.52)
13:12:29 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.1.1)
13:13:48 alp__ joins (~alp@2001:861:e3d6:8f80:98fe:7956:f8fa:f788)
13:16:18 × alexherbo2 quits (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net) (Remote host closed the connection)
13:16:38 alexherbo2 joins (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net)
13:22:38 <Inst> stylistically with servant, is it correct to split the APIs up into parts?
13:23:34 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
13:28:30 hasevil joins (~hasevil@host-138-37-254-126.qmul.ac.uk)
13:29:17 <hasevil> hello, Is there a way to convert `Data.Either` to `Data.Strict.Either`
13:29:19 <hasevil> ?
13:30:50 <ncf> either Strict.Left Strict.Right
13:33:27 <hasevil> ` let strictResult = either Strict.Left (Left result) Strict.Right (Right result)`
13:33:32 danse-nr3 joins (~danse@151.43.157.65)
13:35:29 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
13:37:08 × danse-nr3 quits (~danse@151.43.157.65) (Remote host closed the connection)
13:37:45 danse-nr3 joins (~danse@151.43.157.65)
13:42:55 × todi quits (~todi@p5dca55c4.dip0.t-ipconnect.de) (Remote host closed the connection)
13:44:12 todi joins (~todi@p5dca55c4.dip0.t-ipconnect.de)
13:47:01 × not_reserved quits (~not_reser@154.16.157.96) (Quit: Client closed)
13:47:17 not_reserved joins (~not_reser@154.16.157.96)
13:51:54 rosco joins (~rosco@175.136.152.56)
13:52:14 <hasevil> https://paste.tomsmeding.com/Ptsw8YuF
13:52:27 <hasevil> ncf: I can't get that to work
13:59:11 <ncf> why not?
14:02:05 <hasevil> it won't let me convert prelude either to strict either
14:03:05 <[exa]> what's the error
14:04:01 <[exa]> btw at which point do you want to convert the either? I don't see much places where the strict either would actually need conversion there
14:07:44 × michalz` quits (~michal.zi@185.246.207.193) (Remote host closed the connection)
14:10:40 <danse-nr3> they disappeared?
14:11:04 shriekingnoise joins (~shrieking@186.137.175.87)
14:12:06 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds)
14:12:22 <hasevil> see https://paste.tomsmeding.com/Ptsw8YuF
14:15:29 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
14:17:18 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5)
14:18:24 img joins (~img@user/img)
14:20:27 × alexherbo2 quits (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net) (Remote host closed the connection)
14:20:45 ncf observes, but does not see
14:20:48 alexherbo2 joins (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net)
14:29:16 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 256 seconds)
14:29:36 euleritian joins (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de)
14:29:49 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
14:30:14 thegeekinside joins (~thegeekin@189.217.90.224)
14:30:31 × CiaoSen quits (~Jura@2a05:5800:283:500:ca4b:d6ff:fec1:99da) (Ping timeout: 276 seconds)
14:37:03 Sgeo joins (~Sgeo@user/sgeo)
14:37:20 mvk joins (~mvk@2607:fea8:5c9a:a600::cbc7)
14:37:24 × mvk quits (~mvk@2607:fea8:5c9a:a600::cbc7) (Client Quit)
14:38:52 × hasevil quits (~hasevil@host-138-37-254-126.qmul.ac.uk) (Quit: nyaa~)
14:41:51 <kuribas> Why would you need Strict Either?
14:42:06 <kuribas> Feels like premature optimization to me.
14:42:50 <danse-nr3> they would not answer to questions, just prompt us with their code
14:45:23 <kuribas> yeah, posing a vague, poorly specified question, then pasting some code, is for sure going to be getting you meaningful help.
14:48:29 zer0bitz_ joins (~zer0bitz@user/zer0bitz)
14:49:41 <kuribas> And leaving when you don't get an immediate answer.
14:52:05 × zer0bitz quits (~zer0bitz@user/zer0bitz) (Ping timeout: 240 seconds)
14:53:01 tomsavage joins (~tomsavage@149.40.96.142)
14:54:08 <[exa]> imagine the immense time pressure they must have faced!
14:54:27 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
15:02:06 ystael joins (~ystael@user/ystael)
15:04:55 × alp__ quits (~alp@2001:861:e3d6:8f80:98fe:7956:f8fa:f788) (Ping timeout: 256 seconds)
15:05:16 × not_reserved quits (~not_reser@154.16.157.96) (Quit: Client closed)
15:07:57 wib_jonas joins (~wib_jonas@business-37-191-60-209.business.broadband.hu)
15:09:21 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 4.0.5)
15:10:26 × michalz_ quits (~michalz@185.246.207.222) (Quit: ZNC 1.8.2 - https://znc.in)
15:10:45 michalz_ joins (~michalz@185.246.207.193)
15:14:02 × euleritian quits (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de) (Read error: Connection reset by peer)
15:14:21 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
15:17:03 × fendor quits (~fendor@2a02:8388:1605:d100:267b:1353:13d7:4f0c) (Remote host closed the connection)
15:25:36 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
15:26:05 euleritian joins (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de)
15:34:06 <kuribas> I am more leaning towards the idea that a language that requires monad transformers or effect systems aren't really practical.
15:34:43 <kuribas> Rather, I'd like an imperative language that has purity and side-effect annotations.
15:34:58 <kuribas> Where I could do local mutation, but the compiler proves the function pure.
15:36:25 <kuribas> So I don't need stacking monads to get the benifits of purity.
15:37:24 × alexherbo2 quits (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net) (Remote host closed the connection)
15:37:36 <danse-nr3> how does imperative relate to monad transformers or effect system?
15:37:43 alexherbo2 joins (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net)
15:38:05 × todi quits (~todi@p5dca55c4.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in)
15:38:48 × michalz_ quits (~michalz@185.246.207.193) (Quit: ZNC 1.8.2 - https://znc.in)
15:39:08 michalz_ joins (~michalz@185.246.207.221)
15:40:40 <kuribas> You need monad transformers to mimic effects.
15:40:54 fendor joins (~fendor@2a02:8388:1605:d100:267b:1353:13d7:4f0c)
15:41:02 <dolio> What about all the other monads that aren't just local mutation?
15:41:03 × euleritian quits (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de) (Read error: Connection reset by peer)
15:41:08 × michalz_ quits (~michalz@185.246.207.221) (Client Quit)
15:41:16 <kuribas> They could still be monads :)
15:41:19 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
15:41:27 michalz_ joins (~michalz@185.246.207.221)
15:41:49 todi joins (~todi@p5dca55c4.dip0.t-ipconnect.de)
15:42:35 <kuribas> For example, flix has a polymorphic effect system: https://flix.dev/
15:43:37 <danse-nr3> does purescript fall in the class you consider more practical?
15:44:00 <kuribas> no
15:44:13 <kuribas> I would be happy doing purescript though.
15:45:22 <kuribas> I'd like to see a language that looks imperative (like python or ruby), but has the benifits of pureity and static types.
15:45:24 × mjs2600 quits (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net) (Ping timeout: 252 seconds)
15:45:28 <kuribas> Even dependent types.
15:47:36 <kuribas> And algebraic datatypes.
15:48:15 <Rembane> Pony?
15:48:58 <Rembane> Pony looks strange for a C++ programmer though
15:49:57 × wib_jonas quits (~wib_jonas@business-37-191-60-209.business.broadband.hu) (Quit: Client closed)
15:51:45 tri joins (~tri@ool-18bbef1a.static.optonline.net)
15:52:03 mjs2600 joins (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net)
15:53:15 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 260 seconds)
15:55:02 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Remote host closed the connection)
15:55:14 tri joins (~tri@ool-18bbef1a.static.optonline.net)
15:55:17 tri_ joins (~tri@ool-18bbef1a.static.optonline.net)
15:57:27 alp__ joins (~alp@2001:861:e3d6:8f80:ce2d:ed8b:6728:36e0)
15:58:11 <d34df00d> danse-nr3: a blog post I enjoyed some time ago slightly in line with your question: https://well-typed.com/blog/2020/06/fix-ing-regular-expressions/
16:00:05 <danse-nr3> oh, thank you d34df00d
16:02:26 × alexherbo2 quits (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net) (Remote host closed the connection)
16:02:44 alexherbo2 joins (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net)
16:05:40 × vpan quits (~vpan@mail.elitnet.lt) (Quit: Leaving.)
16:06:37 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:07:12 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:11:50 × mjs2600 quits (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net) (Ping timeout: 268 seconds)
16:11:58 mjs2600_ joins (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net)
16:17:03 × mjs2600_ quits (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net) (Ping timeout: 260 seconds)
16:19:12 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
16:22:19 × danse-nr3 quits (~danse@151.43.157.65) (Ping timeout: 276 seconds)
16:23:46 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 246 seconds)
16:27:29 danse-nr3 joins (~danse@151.19.239.57)
16:34:28 dhil joins (~dhil@2001:8e0:2014:3100:2e71:f759:1c5d:e673)
16:36:46 × Inst quits (~Inst@129.126.215.52) (Quit: Leaving)
16:48:26 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 260 seconds)
16:49:45 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
16:56:23 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:c0d1:ef99:e080:d9) (Remote host closed the connection)
16:56:39 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7854:33e:c79:490a)
16:57:06 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:58:16 <hololeap> I've got a GADT where every constructor has some kind of "children" field, and a class that unifies selecting this field with a getChildren method
16:58:16 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
16:58:42 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
16:58:47 <hololeap> is there a convenient way to also create a setChildren or modifyChildren method without explicitly writing it for each constructor?
17:00:06 <danse-nr3> did you consider lenses?
17:01:38 <hololeap> sure, but how does that help
17:02:28 <hololeap> oh, actually not _every_ constructor has children. one does not
17:02:46 <danse-nr3> if `getChildren` was `children` instead, returning a lens, you would have the three functions
17:03:06 <c_wraith> in that case, it had better be a traversal...
17:03:36 <c_wraith> but anyway, it doesn't help with not writing it for evey constructor
17:04:17 <c_wraith> But writing it for every constructor is good anyway. It means that if you change the type definition you get a compile error instead of code that still compiles but does something weird.
17:05:25 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
17:05:46 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
17:05:58 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
17:06:42 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
17:06:58 <hololeap> I could create a pattern synonym for every constructor that has this... is it possible to tie a pattern synonym to a class like you can tie types to a class with TypeFamilies, so they all have the same name but each instance has a different definition of the pattern synonym?
17:07:23 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1))
17:07:33 <c_wraith> I'm worried about your use case, with one constructor not having the field.
17:07:52 <c_wraith> It's starting to sound like it's setting yourself up for future bugs
17:08:37 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Client Quit)
17:08:37 <hololeap> basically, it's a tree that has exactly five layers, which are named via DataKinds and an enum. the last layer has no children
17:08:53 <hololeap> so it doesn't get a HasChildren instance
17:10:25 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
17:10:31 <hololeap> also, each layer has a slightly different container for the children
17:10:37 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
17:10:42 <hololeap> class HasChildren (l :: WatchLayer) where type ChildContainer l :: Type -> Type ...
17:11:13 <c_wraith> why is this a GADT at all? Are there places where you pass them around not knowing the type and need to recover it via case analysis?
17:12:29 mjs2600 joins (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net)
17:13:06 <hololeap> this is going really deep down a "must be an XY problem" rabbit hole where I have to explain the entire project
17:13:45 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
17:13:50 × rosco quits (~rosco@175.136.152.56) (Quit: Lost terminal)
17:14:28 Square joins (~Square@user/square)
17:14:29 <hololeap> if you are really that interested: https://github.com/hololeap/build-top/blob/main/src/BuildTop/Types.hs
17:14:43 <c_wraith> Well, you know how to avoid that. Write down multiple definitions once and then use whatever abstracts over them.
17:15:47 <c_wraith> But every time you explain *why* you want things like this, it sets off alarm bells that sound like "I tried that once, it was difficult to work with and didn't provide any real added safety"
17:16:10 mjs2600_ joins (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net)
17:16:20 <danse-nr3> oh, a build monitor for gentoo. Nice
17:16:50 <danse-nr3> i recall i was always stressed about not catching errors when building
17:17:01 × mjs2600 quits (~mjs2600@c-174-169-225-239.hsd1.vt.comcast.net) (Ping timeout: 245 seconds)
17:17:31 <hololeap> c_wraith: I see
17:20:08 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
17:20:27 Tuplanolla joins (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
17:21:11 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 245 seconds)
17:21:52 <c_wraith> Like, when I think about your use case (as described), my immediate thought is "use five different data types". When I hear you're using a GADT instead, I ask myself what additional value that gets you, and all I can come up with is.. passing them around with a polymorphic type variable that you intend to refine via case analysis. And that's certainly not something ridiculous to want, but it seems a bit unexpected for a tree with a fixed number of levels.
17:22:08 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
17:25:20 mikess joins (~sam@user/mikess)
17:26:00 <hololeap> fair enough. using five different data types might work just as well. I'll admit that I _wanted_ to practice GADTs here even if I could have avoided them altogether. having the levels mentioned in the types makes it feel more organized to me, even though it might not be adding any real value.
17:26:53 × qqq quits (~qqq@92.43.167.61) (Quit: leaving)
17:27:01 <hololeap> so far I haven't hit any pain points with it *shrug*
17:32:38 <c_wraith> Here's an interesting observation: when code is working correctly, GADTs don't give you additional expressive power over type classes. (they give you pretty different type errors, and a different set of tradeoffs for ease of development, so they're definitely not the same while developing code)
17:33:34 Joao003 joins (~Joao003@190.108.99.230)
17:35:38 <c_wraith> So I see a warning sign when you've got a GADT that you're using a class to provide common functionality over the different constructors.
17:36:09 <danse-nr3> "as a class"?
17:36:51 <danse-nr3> oh i see
17:40:19 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 276 seconds)
17:40:30 euleritian joins (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de)
17:42:34 × euleritian quits (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de) (Read error: Connection reset by peer)
17:42:50 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
17:42:52 × tomsavage quits (~tomsavage@149.40.96.142) (Remote host closed the connection)
17:43:04 × alp__ quits (~alp@2001:861:e3d6:8f80:ce2d:ed8b:6728:36e0) (Ping timeout: 256 seconds)
17:43:45 <hololeap> I'll definitely keep that in mind for my next project (or if I ever feel like refactoring this one)
17:45:24 waldo joins (~waldo@user/waldo)
17:47:08 sm[i] is now known as sm
17:48:11 sm shakes off the [i]
17:49:10 <danse-nr3> well done, ego aint no good
17:50:55 <monochrom> This reminds me of how Lean compiles k mutually recursive data types to one GADT-like type that takes an additional type index 1..k.
17:51:18 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
17:51:58 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
17:53:13 × alexherbo2 quits (~alexherbo@2a02-8440-3241-837e-d89e-19b9-2d52-0fce.rev.sfr.net) (Remote host closed the connection)
17:54:44 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
17:54:55 euleritian joins (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de)
17:55:15 × euleritian quits (~euleritia@dynamic-089-204-139-121.89.204.139.pool.telefonica.de) (Read error: Connection reset by peer)
17:55:32 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
17:56:32 × chele quits (~chele@user/chele) (Remote host closed the connection)
17:58:28 jmdaemon joins (~jmdaemon@user/jmdaemon)
17:59:44 aruns joins (~aruns@user/aruns)
18:01:32 × ubert quits (~Thunderbi@2a02:8109:ab8a:5a00:c848:40d2:238e:e32b) (Remote host closed the connection)
18:02:14 Guest2 joins (~Guest29@145.136.152.127)
18:03:43 <Guest2> Hi everyone, Im new with haskell but I have a question about the syntax. With this function withMVar :: MVar a -> (a -> IO b) -> IO b, is the part of (a-> IO b) a seperate function which u need to give annoted with the brackets '( )' and is this always the case?
18:03:52 × igemnace quits (~ian@user/igemnace) (Remote host closed the connection)
18:04:05 × Guest2 quits (~Guest29@145.136.152.127) (Client Quit)
18:04:16 Guest35 joins (~Guest29@145.136.152.127)
18:04:30 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
18:04:33 <Guest35> Ah I dced, but Im guest2 with this question
18:04:34 <Guest35> Guest2 19:03:43
18:04:34 <Guest35> Hi everyone, Im new with haskell but I have a question about the syntax. With this function withMVar :: MVar a -> (a -> IO b) -> IO b, is the part of (a-> IO b) a seperate function which u need to give annoted with the brackets '( )' and is this always the case?
18:06:00 <dminuoso_> Guest35: The parenthesis () are just for syntactical grouping.
18:06:35 <dminuoso_> So yes, `withMVar :: MVar a -> (a -> IO b) -> IO b` takes two arguments, the first is of type `MVar a` and the second is a function of type `a -> IO b`
18:07:09 <Guest35> But does this mean that the parenthesis, not brackets mb, are always meant for functions?
18:07:15 <dminuoso_> No.
18:07:27 <dminuoso_> The parenthesis serve the same purpose as parenthesis in mathematical notation.
18:07:33 <dminuoso_> Say when I write `(1 + 2) * 3`
18:07:49 <dminuoso_> Note that parenthesis can also be redundant:
18:07:53 <dminuoso_> (1 * 3) + 2
18:08:25 <dminuoso_> Guest35: Maybe (IO a)
18:08:34 <dminuoso_> Is an example of a type where you use parenthesis but without a function type.
18:09:04 <Guest35> I see
18:09:46 <Guest35> Ah okay, i think I understand it
18:09:51 <EvanR> the ->'s have right leaning associativity so withMVar can be read as having type MVar a -> ((a -> IO b) -> IO b)
18:10:11 <EvanR> one set of parens is unnecessary given that, the other is required
18:10:22 <dminuoso_> Guest35: To put things into perspective, even (->) is not special magic, its just an infix type!
18:10:44 <Guest35> I see
18:10:48 <dminuoso_> Guest35: We could imagine instead of having (->) there was a type `Func` instead, such that rather than `Int -> Double` you would write `Func Int Double`
18:10:55 <dminuoso_> With such a type, you would have:
18:11:27 <dminuoso_> withMVar :: Func (MVar a) (Func (Func a (IO b)) IO b)
18:11:38 <dminuoso_> Oh I missed some parenthesis there
18:11:41 <dminuoso_> withMVar :: Func (MVar a) (Func (Func a (IO b)) (IO b))
18:11:43 <dminuoso_> This looks right now.
18:11:52 <EvanR> clear as mud xD
18:11:54 <dminuoso_> Guest35: There's some useful intuition here: See how this literally is a function returning a function?
18:12:25 <Guest35> Oh man this is getting a bit confusing
18:12:31 <dminuoso_> Okay, then step back and ignore what I wrote.
18:12:34 <Guest35> Haha
18:12:37 <Guest35> Thank you though
18:12:56 <EvanR> IO a is a type
18:13:03 <EvanR> Maybe (IO a) is a type, here you need parentheses
18:13:45 <dminuoso_> Guest35: So the space can be thought as a left-associative function application operator with the highest precedence.
18:13:53 <EvanR> since Maybe IO a would mean the same thing as (Maybe IO) a, which is wrong
18:14:01 <dminuoso_> Meaning, if you wrote `Either Int Double`, this really associates as: `(Either Int) Double`
18:14:16 <dminuoso_> Not different from the value level, where writing `fmap f x` associates as `(fmap f) x`
18:14:58 <Guest35> Hmmmmm
18:15:15 <EvanR> f x y z = ((f x) y) z
18:15:38 <dminuoso_> Guest35: Now in that sense, (->) is a right-associative operator. Meaning `Int -> Double -> Char` on the other hand associates as: `Int -> (Double -> Char)`
18:15:42 <EvanR> a -> b -> c -> c = a -> (b -> (c -> d))
18:15:48 <dminuoso_> (A type level operator, of course)
18:16:04 <Guest35> Yess
18:16:07 <Guest35> I understand
18:16:45 <Guest35> The math relation between it makes it understandable
18:16:52 <Guest35> Or well
18:17:10 <Guest35> not really math, but the function relation
18:17:29 <Joao003> What are you talking about here?
18:17:30 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:17:38 <EvanR> just the role of grouping expressions properly of parentheses, which is used in math too
18:17:42 <dminuoso_> Guest35: I think its very valuable to learn about associativity (left/right associative) and precedence.
18:17:45 <EvanR> with parentheses
18:17:55 <Guest35> Yes, it is very important
18:18:22 <EvanR> sometimes you get away without parentheses in math because you can format the expression another way and the grouping is obvious
18:18:26 <dminuoso_> Especially in Haskell because we can not only have various operators, but we can define whether a given self created operator is left/right associative and also specify its precedence level.
18:18:43 <Joao003> Guest35: And you need to remember how certain functions associate (for example, (:) associates on the right)
18:18:45 <dminuoso_> So if you saw something like: foo $ f . g <$> x
18:19:09 <dminuoso_> You need to have some kind of implicit knowledge of each operators fixity.
18:19:14 <Joao003> Yes.
18:19:32 <Joao003> dminuoso_: I have never seen <$>
18:19:48 <dminuoso_> Joao003: <$> is an infix fmap, its probably one of the most common operators out there.
18:19:55 <Joao003> Nice.
18:19:59 <dminuoso_> Definitely in the top 10.
18:20:23 <dminuoso_> Intuitively Id rank it on 3 in terms of usage frequency.
18:20:37 <Joao003> Do you like coding pointfree?
18:20:40 <dminuoso_> No.
18:20:40 <EvanR> <*> and <$> are usually what triggers the "too many operators" complaint about haskell among people that don't know haskell
18:21:05 <EvanR> which is sad because those form such a great pattern, applicative programming
18:21:09 <Guest35> Isn't $ the applying operator
18:21:12 <dminuoso_> EvanR: Oh my operator frequency usage is like a bell curve with the peak being after 3 years or so. :-)
18:21:29 <EvanR> f $ x = f x
18:21:32 <Guest35> yes
18:21:33 <Guest35> exactly
18:21:39 <Guest35> So what is the use of < >
18:21:40 <EvanR> comes in handy sometimes
18:21:48 <dminuoso_> Guest35: Oh this is a long story.
18:21:49 <EvanR> <$> is the entire operator, < > isn't a thing
18:22:02 <EvanR> you can put whatever symbols in a row to make an operator
18:22:06 <dminuoso_> Guest35: The <> have become to mean a loose thing that makes sense if you have some practice.
18:22:17 <Guest35> Ah
18:22:31 <dminuoso_> Guest35: Take a look at this:
18:22:33 <Guest35> Well, ill have some practice and come back with more knownledge ;D
18:22:33 <dminuoso_> % :t <$>
18:22:33 <yahb2> <interactive>:1:1: error: parse error on input ‘<$>’
18:22:34 igemnace joins (~ian@user/igemnace)
18:22:39 <dminuoso_> :t (<$>)
18:22:40 <lambdabot> Functor f => (a -> b) -> f a -> f b
18:22:42 <dminuoso_> :t ($)
18:22:43 <lambdabot> (a -> b) -> a -> b
18:22:47 <EvanR> Guest35, f <$> x = fmap f x
18:22:56 <EvanR> or f `fmap` x
18:22:57 <dminuoso_> Guest35: If you squint a bit, `fmap` is for applying functions (under a functor).
18:23:04 <Joao003> <$> is $ for Functor
18:23:12 × todi quits (~todi@p5dca55c4.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in)
18:23:13 <Guest35> What is a Functor
18:23:16 <dminuoso_> Guest35: this is why you have a $ in that. Its just a hint because of the similarity.
18:23:21 <dminuoso_> Guest35: Something you can fmap over.
18:23:27 <Guest35> I see
18:23:31 <EvanR> Functor is a type class with one method: fmap
18:23:35 <dminuoso_> (In some sensible fashion)
18:23:42 <Joao003> Guest35: Functor is defined as the class of types with fmap
18:23:57 <dminuoso_> Guest35: So anyway. So with that in mind, let me present you with a zoo of related combinators
18:24:01 <Guest35> Thank you guys, you're all very usefull ;D
18:24:02 <dminuoso_> :t (<$>)
18:24:02 <EvanR> > fmap ord "hello"
18:24:03 <lambdabot> Functor f => (a -> b) -> f a -> f b
18:24:04 <dminuoso_> :t ($>)
18:24:04 <lambdabot> [104,101,108,108,111]
18:24:05 <lambdabot> error:
18:24:05 <lambdabot> • Variable not in scope: $>
18:24:05 <lambdabot> • Perhaps you meant one of these:
18:24:10 <dminuoso_> % import Data.Functor
18:24:10 <yahb2> <no output>
18:24:12 <EvanR> rofl
18:24:15 <dminuoso_> % :t (<$>)
18:24:15 <yahb2> (<$>) :: Functor f => (a -> b) -> f a -> f b
18:24:17 <dminuoso_> % :t (<$)
18:24:17 <yahb2> (<$) :: Functor f => a -> f b -> f a
18:24:19 <dminuoso_> % :t ($>)
18:24:19 <yahb2> ($>) :: Functor f => f a -> b -> f b
18:24:20 <Joao003> fmap takes the value out of a functor, applies a functor to it and puts it back into a functor
18:24:23 <dminuoso_> % :t ($)
18:24:23 <yahb2> ($) :: (a -> b) -> a -> b
18:24:29 <dminuoso_> Guest35: ^- do you see the pattern here?
18:24:46 <Joao003> applies a function*
18:25:03 <EvanR> not always, for example the IO functor
18:25:03 <Joao003> % :t <*>
18:25:03 <yahb2> <interactive>:1:1: error: parse error on input ‘<*>’
18:25:09 <Joao003> % :t (<*>)
18:25:09 <yahb2> (<*>) :: Applicative f => f (a -> b) -> f a -> f b
18:25:25 <dminuoso_> Guest35: Ignore for a second what these may possibly do. Just take note at the argument on which a `<` or `>` appears, also has an `f`. and if the `<` or `>` is missing, that respective side has no f either.
18:25:30 <EvanR> there's no way to take out a value from the IO functor
18:25:59 <dminuoso_> Guest35: So this has become a kind of Haskellism, where we design the operator characters in such a way, that you can somehow infer things visually from it.
18:26:20 <Guest35> so, for my newled brain, it means that u can apply a function in different ways, its like a mix of left and right associative operator
18:26:21 <dminuoso_> similarly, we have <*>, <* and *>. Though we have no (*) equivalent.
18:26:31 tzh joins (~tzh@c-71-193-181-0.hsd1.or.comcast.net)
18:26:34 <Joao003> Because (*) is multiplication
18:26:35 × thegeekinside quits (~thegeekin@189.217.90.224) (Remote host closed the connection)
18:26:56 <Guest35> Oh man
18:26:59 <EvanR> * is supposed to make you think about product
18:27:09 <EvanR> but <*> is really applicative
18:27:16 <EvanR> ff <*> xx
18:27:22 <dminuoso_> Guest35: The point Im trying to make, there is often systems behind the operator names that will make it easier to read them.
18:27:34 <EvanR> but there's an equivalent formulation of Applicative in terms of products
18:27:45 <dminuoso_> Guest35: You're not required to memorize any of this right now. :)
18:27:49 <Guest35> Haha
18:27:49 <Joao003> > [(+3),(*4)] <*> [2]
18:27:50 <lambdabot> [5,8]
18:28:02 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
18:28:26 <Guest35> Well guys
18:28:32 <Guest35> I appreciate the help, I do understand more
18:28:49 <EvanR> great
18:28:57 <Guest35> I'ma code and probably give u guys more questions in the future :D
18:29:05 <Guest35> Thanks
18:29:13 <Joao003> Guys, how do you pronounce operators like (>>=) and (<*>)?
18:29:22 <Rembane> Joao003: bind, fancy star
18:29:29 × Guest35 quits (~Guest29@145.136.152.127) (Quit: Client closed)
18:29:40 <EvanR> @quote pronounce
18:29:40 <lambdabot> DougBagley says: The Koan of Lazy Evaluation: Michel Mauny was giving a guest lecture to new computer science students. After the students were seated, Michel pronounced "Today's lecture will be
18:29:40 <lambdabot> about Lazy Evaluation", he paused for a moment then concluded with, "Are there any questions?"
18:29:46 <EvanR> oof
18:30:00 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
18:30:23 <EvanR> >>= is bind, <*> is "ap"
18:30:30 <EvanR> not that I pronounce either one
18:30:45 <EvanR> existing purely within the world of IRC in complete silence
18:31:04 <EvanR> :t ap
18:31:05 <lambdabot> Monad m => m (a -> b) -> m a -> m b
18:31:23 <EvanR> this operation predates Applicative it's so old
18:31:39 <Joao003> Rembane: I pronounce (>>=) as "insert", because you can do `reverse >>= (==)' and it becomes `\x -> (reverse x) == x'
18:32:42 <Joao003> > (reverse >>= (==)) "racecar" -- palindrome check
18:32:42 <EvanR> that's about as nonsensical as bind, so fair xD
18:32:43 <lambdabot> True
18:33:12 <Joao003> I got lambdabot to agree with you XD
18:34:46 <EvanR> insert is also the opposite of extract
18:35:05 <EvanR> which is the wrong corresponding operation in Comonad
18:35:09 × waldo quits (~waldo@user/waldo) (Ping timeout: 256 seconds)
18:35:17 <Joao003> And I pronounce <*> as "multimap", because it can do multiple maps at once
18:35:33 <Joao003> > [Left, Right] <*> [2,3]
18:35:34 <lambdabot> [Left 2,Left 3,Right 2,Right 3]
18:35:57 <dminuoso_> Joao003: And on ZipList?
18:36:01 <dminuoso_> Or on IO?
18:36:05 <EvanR> wouldn't that be multi-ap
18:36:11 <EvanR> multiple applications at once
18:36:21 <dminuoso_> The most general description you can give <*> is a very loose and rough "parallel ap"
18:36:27 <Joao003> Yes
18:36:37 <dminuoso_> Though it takes some mind twisting to see the "parallel" in examples.
18:36:42 <Joao003> Yes
18:36:54 <dminuoso_> In list it works if you think of a list as modelling non-determinsm
18:37:14 <Joao003> <$> is "fmap" of course
18:37:36 <EvanR> > cycle [Left,Right] <*> cycle [2,3]
18:37:37 <lambdabot> [Left 2,Left 3,Left 2,Left 3,Left 2,Left 3,Left 2,Left 3,Left 2,Left 3,Left ...
18:38:10 <Joao003> Only the first function maps because you're mapping onto an infinite list
18:38:27 <EvanR> now I see why you think it's a map
18:38:33 <EvanR> Left 2, Left 3
18:39:10 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 255 seconds)
18:39:22 <Joao003> Though the * tells you that it's going to do multiple things at once
18:39:30 <EvanR> haha, now it's a kleene star
18:39:30 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7854:33e:c79:490a) (Remote host closed the connection)
18:39:52 alp__ joins (~alp@2001:861:e3d6:8f80:f550:1f70:2377:c233)
18:40:25 <EvanR> the * is probably a consequence of Applicatives product alternative formulation, f a -> f b -> f (a,b) and there being not other good ascii characters to use for that
18:40:30 <EvanR> since $ is taken
18:41:12 <EvanR> .oO(<@>)
18:41:18 <Joao003> what about #?
18:41:40 <EvanR> # seems like it would be used for numbers
18:42:10 <EvanR> back when applicative was invented hashtag was not a thing
18:42:14 <Joao003> Oh
18:42:29 <Joao003> EvanR: You mean octothorpe?
18:42:42 <EvanR> there you go again pronouncing stuff
18:43:10 <hc> *reading backlog* lol@ that lazy evaluation lecure story :-)
18:43:44 <Joao003> ò_ô
18:51:33 todi joins (~todi@p5dca55c4.dip0.t-ipconnect.de)
18:52:31 <Joao003> If <$> is "fmap", then why is <$ a "replace everything with this one thing"?
18:53:27 × todi quits (~todi@p5dca55c4.dip0.t-ipconnect.de) (Client Quit)
18:54:39 <int-e> The way I remember this is... <* takes from the left, *> takes from the right, <*> takes from both sides and does something with it (apply). <$ is a variant of <* and <$> is a variant of <*>.
18:55:36 <int-e> (So the < and > are arrows to my mind.)
18:55:59 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:57:29 <Joao003> int-e: Same with >>= and =<<
18:59:46 <EvanR> :t (<*)
18:59:47 <lambdabot> Applicative f => f a -> f b -> f a
19:00:02 todi joins (~todi@p5dca55c4.dip0.t-ipconnect.de)
19:00:04 <Joao003> > [1..3] <* [1..3]
19:00:05 <lambdabot> [1,1,1,2,2,2,3,3,3]
19:00:11 <Joao003> > [1..3] *> [1..3]
19:00:12 <lambdabot> [1,2,3,1,2,3,1,2,3]
19:00:53 × danse-nr3 quits (~danse@151.19.239.57) (Ping timeout: 240 seconds)
19:03:15 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7854:33e:c79:490a)
19:04:24 <Joao003> For functions, <* picks the left and *> picks the right
19:04:40 <Joao003> So I pronounce them "pickleft" and "pickright" :)
19:05:45 <dminuoso_> Also, maybe they were just picked at random
19:06:14 <dminuoso_> Some things were just put in place without much of a thought. Case in point: fixity of ($)
19:06:17 <monochrom> I know it's a lost cause but I still like to roast: Why are you obsessed with converting code to voice? Are you a dial-up modem?
19:06:42 <int-e> I like the fixity of $
19:07:54 <int-e> Mainly I like being able to write `pure $` and then start thinking about the value that I want to return. Of course if `$` has a different fixity I never would have developed this particular habit.
19:08:02 <monochrom> (The deeper possibility is that perhaps people aren't visual learners after all, but rather auditory learners.)
19:08:25 <int-e> Or maybe they just learn if they actively engage with a topic.
19:08:28 <dminuoso_> int-e: Of course you would. Im not debating its precedence, but ($) should have been infixl not infixr.
19:08:40 <dminuoso_> It would for the most part be still usable in the same way.
19:08:41 ft joins (~ft@p4fc2ae2b.dip0.t-ipconnect.de)
19:08:52 <int-e> dminuoso_: But then I couldn't write pure $ foo . bar $ x
19:09:06 <int-e> dminuoso_: which is part of the habit I mentioned
19:09:27 waldo joins (~waldo@user/waldo)
19:09:40 <int-e> I'd have to go back and change the first $ into a .
19:10:25 <hc> Hey, I need to amend that lazy evaluation joke: "When a student raised their hand and asked a question, the lecturer responded: Okay, thank you for your question; if you would excuse me for a while, I will start to prepare the talk and in the process I will finally be able to get rid of the thousand books I've accumulated over the years" :D
19:10:42 <Joao003> lol
19:11:50 <int-e> cue loud thunking noises from the whole building including the attic, and several garbage trucks coming by and driving off again
19:13:02 <dminuoso_> By far the best lazy evaluation joke is this one: https://ro-che.info/ccc/11
19:16:29 <dminuoso_> int-e: I think left-associativity on ($) is still better on average. It matches the associativity of the function application operator (which it extends on), which means inserting/removing it wont change the visual "scanning path" for reading code.
19:16:52 <hc> dminuoso_: Hmm, they only asked him to implement the function. They never asked him to *show* the result ;p
19:17:32 × igemnace quits (~ian@user/igemnace) (Remote host closed the connection)
19:17:43 <hc> So actually his strictness analyser *is* broken =)
19:18:03 <monochrom> It is very optimistic to assume that the student question triggers cleanup. The other possibility that people actually experience and complain bitterly about is that the student question triggers buying a lot of books to help work on the question. This is fondly known as "space leak".
19:18:08 <dminuoso_> hc: That wouldnt be a strictness analyzer bug, but an evaluation bug.
19:18:22 × todi quits (~todi@p5dca55c4.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in)
19:18:28 <dminuoso_> Or well. Would it?
19:18:39 <dminuoso_> hc: Nothing in the Haskell Report prevents speculative execution.
19:19:07 <dminuoso_> In fact, given that the Haskell report is careful to not use the term "lazy" but "non-strict" instead suggests it even openly embraces speculative execution.
19:19:11 × waldo quits (~waldo@user/waldo) (Ping timeout: 264 seconds)
19:19:13 <hc> Yeah, actually, haskell is not as nonstrict as one might think
19:19:33 <hc> Some programs that we have come to expect to behave in a certain way might theoretically not work/terminate in a specific haskell implementation
19:19:39 <hc> Just like it is with C ;d
19:20:01 <hc> s/d$/b/
19:21:02 <dminuoso_> hc: So yeah, Ill claim what the interviewee is doing is just speculative execution.
19:21:11 <dminuoso_> If anything, that "speculation analyzer" seems to be working just fine.
19:21:34 <hc> Yes indeed, he's expecting them to want to see his implementation, but since they were asking about haskell, he might have been wrong about that ;)
19:26:38 <monochrom> Here is a simpler explanation. The interviewee still needs to answer "yes" or "no", and that triggers evaluation.
19:28:36 <int-e> they should've come prepared and left behind a black hole in their stead
19:30:22 shapr joins (~user@2600:1700:c640:3100:8636:87c:743f:950a)
19:30:40 danza joins (~danza@151.19.239.57)
19:31:48 <monochrom> Also, I take the view that the Haskell Report secretly wants to say "lazy". The clue is from having seq. seq is John Hughes's addition, and he said in an interview his addition is for saving space. The premise "seq helps save space" requires lazy evaluation.
19:38:36 × juri_ quits (~juri@implicitcad.org) (Ping timeout: 252 seconds)
19:39:32 <hc> So it's lazy by implication
19:40:13 <dminuoso_> monochrom: Though seq by specification doesnt mandate lazy evaluation, its why we have pseq.
19:40:22 <int-e> "It's not lazy, it violates the left-most outermost evaluation order! And sometimes it even breaks sharing!!1elevne"
19:40:43 juri_ joins (~juri@79.140.115.48)
19:42:39 <monochrom> I have discussed this before. Here it goes again.
19:43:25 <int-e> for me? you shouldn't :P
19:43:55 <int-e> (maybe it's not too late for this spark to fizzle out)
19:44:09 <monochrom> The C standard, for example, allows a compiler to decide to compile "unsigned f(unsigned x, unsigned y) { return x; }" to take Ω(2^y) time.
19:44:51 <monochrom> The only reason no one actually does that is because competition. Who would use that compiler when other choices gives you sweet O(1) time?
19:45:31 waldo joins (~waldo@user/waldo)
19:46:37 <monochrom> The lesson is that most standards feel like leaving open efficiency, hoping that compiler vendors don't troll you because why would they.
19:47:48 <monochrom> seq is not standardized to be eager or whatever, but in practice compiler writers are driven to make it eager or very much close enough.
19:49:16 <int-e> . o O ( Hardcore C compiler/computer... whenever you trigger undefined behavior, your computer explodes )
19:50:36 <EvanR> that would end the fun quite early. Instead it should deliver electric shock to the user
19:50:49 <int-e> The contract that ghc tries to abide by is basically not to force any unneeded bottoms. Which mostly covers expensive computations too because the compiler generally can't prove that those terminate.
19:51:01 <int-e> EvanR: That's the normal game mode, not the hardcore one.
19:51:09 <dminuoso_> monochrom: Your analogy is flawed: a non-strict seq is not a performance loss, its the opposite, its potential for better performance.
19:51:14 <EvanR> oh ok, ultra violence < nightmare
19:51:44 <dminuoso_> (or well, non-lazy I should say)
19:51:45 <monochrom> Rather than "flawed", the better position is "it cuts both ways".
19:51:45 × juri_ quits (~juri@79.140.115.48) (Read error: Connection reset by peer)
19:52:07 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
19:52:59 juri_ joins (~juri@79.140.115.48)
19:53:11 <dminuoso_> So I guess this goes into int-e's portion of "not forcing unneeed bottoms"
19:53:24 <EvanR> oh now we're non-lazy too? I'm getting sick of non-semantics xD
19:53:37 <dminuoso_> Introducing any fancy speculative execution + non-strict seq would be cool, but also break tons of code.
19:53:51 <dminuoso_> While I think much of ghc/base is covered correctly, the same cannot be said of most hackage.
19:53:51 <hc> By the way, speaking of compiler vendors, any of you guys know bluespec? It's a haskell verilog, basically. I've just started to have a look at it and find it quite interesting :)
19:54:57 <int-e> monochrom: `seq` is just another dependency injection, only this time it's an artificial data dependency :)
19:55:02 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
19:55:22 <int-e> (You were joking about dependency injection the other day, or maybe EvanR was?)
19:55:54 <monochrom> EvanR. (->)r is the dependency injection functor.
19:56:38 <EvanR> data dependency injection
19:56:41 <int-e> toy `seq` groceries ...that toy that the child really *needed* that has been sitting on the shelf ever since
19:57:29 <EvanR> if it's an exploding toy, then you necessarily explode before making it out of the store
19:57:29 × juri_ quits (~juri@79.140.115.48) (Read error: Connection reset by peer)
19:57:52 <int-e> who's stocking that place? ACME?
19:57:59 juri_ joins (~juri@79.140.115.48)
19:58:02 <int-e> these jokes are increasingly forced
19:58:27 <EvanR> joke parametricity?
19:58:29 <hc> No one here knows bluespec? I am really surprised no one knows it. I guess most people interested in hardware design aren't interested in haskell and vice versa?
19:58:50 <EvanR> real hardware is scary
19:58:53 <int-e> hc: I bet a lot of people have /heard/ of it but not used it.
19:59:11 <hc> EvanR: True, and fascinating :)
19:59:19 <int-e> (It is one of the more visible Haskell projects.)
19:59:22 <EvanR> abstract perfectly behaving functional hardware sounds fun
19:59:44 <hc> int-e: oh, is it? Okay :) I can recommend to play around with it, I really enjoy doing so
20:01:47 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 264 seconds)
20:03:03 <Joao003> Tell me some jokes
20:03:19 <monochrom> My point is this. Or rather, my beef is this. People have this question, they wrote "sum acc (x:xs) = sum (acc+x) xs", why does it take so much space? why does seq help? And the converse holds too, "sins (x:xs) = let r = sins xs in seq r (sin x : r)", why is that bad, why deleting seq helps?
20:04:14 <monochrom> So when it comes to space and time questions, I must use an operational model, or at least that's the best approach we have for now.
20:04:53 <monochrom> But along come do-gooder smart*ss who will say, no no no, the standard does not require lazy evaluation, it does not require seq to increase eagerness.
20:05:08 <monochrom> OK sure smart*ass, so how do you answer that question?
20:05:13 <int-e> sure, in practice you're working with, 99% of the time, ghc.
20:05:28 <EvanR> that was the position of most people on the decision to make sum use foldl and not foldl'
20:05:28 <dolio> Exactly specifying the evaluation behavior of seq could easily give sub-optimal results.
20:05:28 <monochrom> with all your high-horse denotational domains.
20:06:13 m1dnight_ joins (~christoph@78-22-4-67.access.telenet.be)
20:06:27 <dolio> Like: ack 5 5 `seq` error "bomb" `seq` ()
20:06:35 <tomsmeding> the standard may not require lazy evaluation, but it certainly doesn't require strict evaluation either -- and when the standard leaves something unspecified, and the question is about the operational behaviour of a compiled program, the only thing one CAN turn to is what the compiler does
20:06:40 <tomsmeding> or some model of that
20:06:49 × m1dnight_ quits (~christoph@78-22-4-67.access.telenet.be) (Client Quit)
20:07:05 <tomsmeding> turns out there's a neat approximation that explains most of these shenanigans, i.e. (I think) monochrom's "operational model"
20:08:08 × juri_ quits (~juri@79.140.115.48) (Ping timeout: 256 seconds)
20:08:11 <int-e> The point goes deeper though, you need an operational model to use `seq` effectively.
20:08:45 <tomsmeding> is it surprising that you need something that is more precise than the standard if the standard doesn't pin down the operational behaviour you're trying to influence? :p
20:08:53 <int-e> Because in the end it's just a tweak of the order of evaluation.
20:09:06 <Joao003> What does `seq' do? I don't know.
20:09:35 juri_ joins (~juri@implicitcad.org)
20:09:39 <int-e> as a first approximation, not entirely correct, a `seq` b evaluates a before returning the value of b.
20:09:49 <monochrom> In this context, I am surprised that people use the standard to FUD against talking operationally.
20:10:05 <int-e> (`pseq` intends to do exactly that, but the difference between pseq and seq is really quite subtle)
20:10:30 <tomsmeding> Joao003: "a `seq` b" evaluates a and b (in some order), and then returns b
20:10:49 <int-e> (so subtle, I don't quite know how to explain it without talking about strictness analysis in the compiler)
20:11:02 <Joao003> % putStrLn "a" `seq` putStrLn "b"
20:11:02 <yahb2> b
20:11:11 <mauke> it took me a while to understand why pseq can't be implemented in terms of seq
20:11:20 <tomsmeding> "evaluate" as in "force this lazy-evaluated thing"
20:11:23 <tomsmeding> not as in "do IO"
20:11:23 <Joao003> % (putStrLn "a") `seq` (putStrLn "b")
20:11:23 <yahb2> b
20:11:38 <tomsmeding> % error "oops!" `seq` 10
20:11:38 <yahb2> *** Exception: oops! ; CallStack (from HasCallStack): ; error, called at <interactive>:31:1 in interactive:Ghci5
20:11:51 <tomsmeding> % let unused = error "oops!" in 10
20:11:51 <yahb2> 10
20:11:58 <tomsmeding> % let unused = error "oops!" in unused `seq` 10
20:11:58 <yahb2> *** Exception: oops! ; CallStack (from HasCallStack): ; error, called at <interactive>:35:14 in interactive:Ghci6
20:12:12 <tomsmeding> % let unused = "safe" in unused `seq` 10
20:12:13 <yahb2> 10
20:12:13 <Joao003> % let unused = error "oops!" in const unused 10
20:12:13 <yahb2> *** Exception: oops! ; CallStack (from HasCallStack): ; error, called at <interactive>:39:14 in interactive:Ghci7
20:12:18 <geekosaur> Joao003, don't confuse evaluation with execution. `seq` doesn't execute anything, so you won't see "a" printed
20:12:39 <int-e> > const 10 undefined -- do you have the arguments in the right order?
20:12:41 <lambdabot> 10
20:12:45 <EvanR> > error "1" `seq` error "2"
20:12:46 <lambdabot> *Exception: 1
20:12:53 <Joao003> % let unused = error "oops!" in const 10 unuse
20:12:53 <yahb2> <interactive>:41:40: error: ; • Variable not in scope: unuse ; • Perhaps you meant ‘unused’ (line 41)
20:12:55 <Joao003> % let unused = error "oops!" in const 10 unused
20:12:55 <yahb2> 10
20:13:33 <EvanR> % error "1" `seq` error "2"
20:13:33 <yahb2> *** Exception: 1 ; CallStack (from HasCallStack): ; error, called at <interactive>:45:1 in interactive:Ghci8
20:13:53 <mauke> (seq a b) is a value that has a spurious data dependency on a (and a non-spurious dependency on b)
20:14:07 <Joao003> If you had to use \x y -> y, would you do `const id' or `flip const'?
20:14:30 <EvanR> or something from aviary bird combinators
20:14:47 <tomsmeding> \_ y -> y
20:14:53 <mauke> chaotic evil: pure ask
20:14:53 × alp__ quits (~alp@2001:861:e3d6:8f80:f550:1f70:2377:c233) (Ping timeout: 256 seconds)
20:15:05 <mauke> actually, that's probably the wrong type
20:15:17 <tomsmeding> no need to save one character and type "const id" instead of "\_ y -> y"
20:15:23 <EvanR> :t const id
20:15:24 <lambdabot> b -> a -> a
20:15:29 <EvanR> kite :: a -> b -> b
20:15:41 <Joao003> chaotic eviler: seq
20:15:45 <EvanR> Ki - kite. Corresponds to the encoding of false in the lambda calculus.
20:15:51 <tomsmeding> has someone already made that @pl alternative that uses only birds
20:16:19 <Joao003> holy now i want that
20:16:29 <int-e> tomsmeding: ap const and id?
20:17:11 <tomsmeding> int-e: hm?
20:17:12 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7854:33e:c79:490a) (Remote host closed the connection)
20:17:15 <int-e> (I blame @pl for the fact that I've internalized ap = S. const = K and id = I are more obvious.)
20:17:17 <tomsmeding> :t ap const and id
20:17:18 <lambdabot> error:
20:17:18 <lambdabot> • No instance for (Foldable ((->) Bool))
20:17:18 <lambdabot> arising from a use of ‘and’
20:17:44 <mauke> :t pure $fix$ pure
20:17:45 <lambdabot> error:
20:17:45 <lambdabot> • Occurs check: cannot construct the infinite type: a ~ f1 a
20:17:45 <lambdabot> Expected type: f1 a -> f1 a
20:17:48 <int-e> tomsmeding: no, `and` was from the english language. I should've added commas. And/or maybe backticks.
20:17:52 <EvanR> starling kestrel and idiot xD
20:17:59 phma_ joins (phma@2001:5b0:211f:ca48:659b:29e6:dda5:53ee)
20:18:07 <int-e> . o O ( idiom bird )
20:18:17 <tomsmeding> int-e: then I initially parsed your message correctly but I still don't know what you meant :p
20:18:23 <int-e> Which, of course, would be `ap`, just to add to the confusion.
20:18:46 <int-e> ap = (<*>) which is the core primitive of Applicative = Idiom
20:19:03 <int-e> pure is just their to make a point
20:19:04 <int-e> *there
20:19:09 <tomsmeding> :p
20:19:15 <tomsmeding> OH
20:19:22 <mauke> :t pure $fix<$> pure
20:19:24 <lambdabot> Applicative f => f (b -> b)
20:19:24 <tomsmeding> it was a list with three elements
20:19:28 tomsmeding now understands
20:19:44 iqubic joins (~avi@2601:602:9502:c70:ace6:f806:3e8:12)
20:19:48 <EvanR> but how many commas would you need
20:19:53 <tomsmeding> one
20:19:57 <int-e> tomsmeding: I can't blame you, as I said, I should've used more punctuation
20:19:58 × phma quits (phma@2001:5b0:210f:1c58:794a:9822:66f3:ee9) (Read error: Connection reset by peer)
20:20:09 <tomsmeding> two, if you're feeling smug
20:20:17 <EvanR> ap, const, and id,
20:20:18 <int-e> EvanR: if oxford then 2 else 1
20:20:19 <mauke> ap,, const and id
20:20:31 <EvanR> putting a trailing comma is all the rage these days
20:20:34 <tomsmeding> % let oxford = \_ y -> y
20:20:34 <yahb2> <no output>
20:20:39 <int-e> EvanR: in English?
20:20:43 nate4 joins (~nate@c-98-45-158-125.hsd1.ca.comcast.net)
20:20:45 <iqubic> what did I miss here?
20:20:48 <EvanR> in language of the week
20:20:50 <int-e> :t (1,2,) -- still not a pair
20:20:51 <lambdabot> (Num t1, Num t2) => t3 -> (t1, t2, t3)
20:21:05 <Joao003> (,) ap $ (,) const id
20:21:10 <int-e> iqubic: we were talking about birds
20:21:17 int-e runs
20:21:22 <monochrom> Revisionist history: [s,k] = [ap, pure] for Applicative, is that why functional programming was called applicative programming? >:)
20:21:23 <int-e> (there are logs)
20:21:39 <mauke> bird tracks are used in .lhs files
20:21:48 <probie> I like the clojure/graphql approach - the comma is another whitespace character
20:21:56 <EvanR> bird combinators are intended for illustration (and the type signatures) and not utility. That would be the batman combinator
20:22:01 <int-e> mauke: unless they're wrapped in latex
20:22:03 <iqubic> monochrom: Is that real?
20:22:16 <mauke> no, revisionist
20:22:18 <monochrom> s/for Applicative// # that was a typo and also made the whole thing confusing.
20:22:57 <monochrom> Well the whole sentence "The following is revisionist history: ..." is true honest and real.
20:22:59 <tomsmeding> I appreciate that you used the contextually correct (sed) comment marker
20:23:10 <mauke> s/sed/perl/
20:23:15 <tomsmeding> sed
20:23:48 <iqubic> Speaking of birds:
20:23:58 <iqubic> @hackage aviary
20:23:58 <lambdabot> https://hackage.haskell.org/package/aviary
20:23:59 <mauke> perl is a supersed
20:24:03 <iqubic> https://hackage.haskell.org/package/data-aviary
20:24:08 <iqubic> It's actually that.
20:24:12 <EvanR> ikr
20:24:13 <int-e> mauke: awk-ward
20:24:22 <tomsmeding> iqubic: that was what this bird stuff was inspired by ;)
20:24:39 × trev quits (~trev@user/trev) (Quit: trev)
20:25:01 <EvanR> the original question is how to say \x y -> y
20:25:10 <EvanR> other than that way I guess
20:25:15 <monochrom> flip pure >:)
20:25:21 × nate4 quits (~nate@c-98-45-158-125.hsd1.ca.comcast.net) (Ping timeout: 252 seconds)
20:25:45 <EvanR> :t flip pure
20:25:46 <lambdabot> b -> c -> c
20:25:55 <mauke> :t [const id, flip const, pure $fix<$> pure]
20:25:56 <lambdabot> [b -> a -> a]
20:26:02 <EvanR> touché
20:26:15 <iqubic> :t const
20:26:15 <monochrom> ooohhh const id is a surprise
20:26:16 <lambdabot> a -> b -> a
20:26:25 <int-e> :t ap const
20:26:26 <lambdabot> (b -> a) -> b -> b
20:26:33 <tomsmeding> monochrom: it's the only one yet that is shorter than '\_ y -> y'
20:26:42 <Joao003> map (\f -> f 1 2) [const id, flip const, pure $fix<$> pure]
20:26:47 <EvanR> kite is shorter
20:26:47 <Joao003> > map (\f -> f 1 2) [const id, flip const, pure $fix<$> pure]
20:26:49 <lambdabot> [2,2,2]
20:26:50 <int-e> (that is \x y -> y but the type is restricted, isn't it beautiful)
20:26:56 <Joao003> > map (\f -> f 1 2) [const id, flip const, pure $fix<$> pure, flip pure]
20:26:58 <lambdabot> [2,2,2,2]
20:27:08 <mauke> flip const = flip pure
20:27:11 <mauke> since pure = const
20:27:19 <iqubic> monochrom: const id x y = (const id x) y = id y = y
20:27:32 <Joao003> How is pure const then, mauke?
20:27:38 <int-e> > pure "bs" :: [String]
20:27:39 <lambdabot> ["bs"]
20:27:47 <mauke> Joao003: instance Applicative ((->) e)
20:27:57 <iqubic> > pure 1 2
20:27:58 <monochrom> But I'm more interested in using pure and id to freak out people "wait why are they even relevant?!" >:)
20:27:58 <lambdabot> 1
20:28:03 <Joao003> pure 1 2
20:28:08 <Joao003> > pure 1 2
20:28:09 <lambdabot> 1
20:28:14 <Joao003> :t pure 1
20:28:15 <lambdabot> (Applicative f, Num a) => f a
20:28:23 <iqubic> > pure id 1 2
20:28:25 <lambdabot> 2
20:28:39 <mauke> let f = ((->) e), then f a = (->) e a = e -> a
20:28:50 <Joao003> > pure [1] [2]
20:28:52 <lambdabot> [1]
20:28:53 <EvanR> > id id id id 2
20:28:54 <lambdabot> 2
20:28:55 <tomsmeding> ooh, that would be the shortest (pure id)
20:28:58 <tomsmeding> (ignoring kite)
20:29:10 <EvanR> kite sad
20:29:14 <tomsmeding> sorry kite
20:29:15 <iqubic> @check \x y -> pure x y == pure id x y
20:29:16 <lambdabot> +++ OK, passed 100 tests.
20:29:20 <int-e> > curry snd
20:29:21 <lambdabot> error:
20:29:21 <lambdabot> • No instance for (Typeable a0)
20:29:21 <lambdabot> arising from a use of ‘show_M10958710501189713508’
20:29:24 <int-e> :t curry snd
20:29:24 <monochrom> In particular the equation "flip pure = pure id" is on the order of "2+2 = 2*2 = 2^2" :)
20:29:25 <lambdabot> a -> c -> c
20:29:32 <mauke> nice
20:29:44 <int-e> (adds some spice)
20:29:50 <mauke> I like my curry without sand
20:30:09 <int-e> but how else do you get the extra crunchiness
20:30:13 × danza quits (~danza@151.19.239.57) (Ping timeout: 268 seconds)
20:30:17 <monochrom> :( haha
20:30:30 <iqubic> I love quick check. I wonder if it's actually testing the thing correctly.
20:30:36 <EvanR> in 10023 they will look at our code (and unix commands) and wonder what happened to the vowels
20:30:52 <mauke> iqubic: probably using () as the type
20:30:52 <EvanR> as in egyptian
20:30:53 × Maxdamantus quits (~Maxdamant@user/maxdamantus) (Ping timeout: 256 seconds)
20:30:58 <tomsmeding> @check \x y -> pure (x :: Int) (y :: Int) == pure id x y
20:31:00 <lambdabot> *** Failed! Falsifiable (after 2 tests and 1 shrink):
20:31:00 <lambdabot> -1 0
20:31:07 <monochrom> Oh my unix-and-c students are already wondering about that.
20:31:16 <tomsmeding> @check \x y -> pure (x :: ()) (y :: ()) == pure id x y
20:31:17 <lambdabot> +++ OK, passed 100 tests.
20:31:34 <mauke> uneiform
20:31:40 <iqubic> Why did it fail when you specialize to Int?
20:31:46 <Joao003> > pure id 1 2
20:31:48 <lambdabot> 2
20:31:52 <Joao003> > pure id [1] [2]
20:31:54 <lambdabot> [2]
20:31:56 <tomsmeding> because pure == const and pure id == flip const
20:32:03 <tomsmeding> and it was using () before, probably, due to defaulting
20:32:08 <int-e> iqubic: does it have to do with univalency? I'll show myself out.
20:32:18 <mauke> @check \x y -> x == y
20:32:19 <lambdabot> +++ OK, passed 100 tests.
20:32:23 <Joao003> tomsmeding AND WHY IS PURE == CONST
20:32:26 <iqubic> Oh. It was a false postive
20:32:31 <tomsmeding> Joao003: BECAUSE IT ISNT
20:32:35 <tomsmeding> oh
20:32:35 <tomsmeding> it is
20:32:37 <tomsmeding> I misread
20:32:44 <int-e> const is pure, but pure isn't const
20:32:45 <tomsmeding> because (r ->) is a monad
20:32:51 <EvanR> pure = const if f = (->) r
20:33:19 <iqubic> Please never use do notation with Monad ((->] r(
20:33:36 <EvanR> you don't like Reader?
20:33:49 <iqubic> Wait?!?! That's just Reader?!?!
20:33:51 <iqubic> How?!?!
20:33:54 <EvanR> lol
20:33:56 <probie> Yes
20:33:56 <iqubic> TIL.
20:34:12 <tomsmeding> @unmtl Reader r a
20:34:12 <monochrom> Reader is a newtype wrapper around (->)r.
20:34:12 <lambdabot> r -> a
20:34:28 <monochrom> "newtype Reader a = Ctor (r -> a)
20:34:39 <monochrom> At least in old versions of the library.
20:34:44 <Joao003> @src Reader
20:34:44 <lambdabot> type Reader r = ReaderT r Identity
20:34:44 <lambdabot> --OR
20:34:44 <lambdabot> data Reader r a = Reader { runReader :: r -> a }
20:34:54 <EvanR> DependencyInjection r a
20:35:19 <probie> "dependency injection" - you mean taking an additional parameter
20:35:25 <iqubic> What do the types of join and (>>=) look like when you specialize to m = ((->) r)?
20:35:37 <tomsmeding> :t (>>=)
20:35:38 <lambdabot> Monad m => m a -> (a -> m b) -> m b
20:35:40 <monochrom> But it turns out that you don't need the newtype wrapper in principle.
20:35:45 <tomsmeding> (r -> a) -> (a -> r -> b) -> r -> b
20:35:51 <EvanR> taking an additional parameter, how pedestrian
20:36:05 <iqubic> what does join look like?
20:36:10 <tomsmeding> @pl \f g r -> g (f r) r
20:36:10 <lambdabot> flip flip id . (ap .) . flip (.)
20:36:11 <EvanR> do not disrespect the UML diagrams
20:36:16 <mauke> iqubic: join f x = f x x
20:36:17 <iqubic> :t join
20:36:18 <lambdabot> Monad m => m (m a) -> m a
20:36:20 <probie> (>>=) :: (b -> a) -> (a -> b -> c) -> (b -> c)
20:36:23 <int-e> EvanR: user mode linux has diagrams?
20:36:29 <tomsmeding> (r -> r -> a) -> r -> a
20:36:35 <tomsmeding> % join (+) 3
20:36:36 <yahb2> <interactive>:63:1: error: ; Variable not in scope: join :: (a0 -> a0 -> a0) -> t0 -> t
20:36:40 <tomsmeding> > join (+) 3
20:36:41 <lambdabot> 6
20:36:44 <Joao003> tomsmeding: I was going to say that
20:36:46 <haskellbridge> 12<C​elestial> UML diagrams 😭😭😭
20:37:07 <haskellbridge> 12<C​elestial> I have a whole module dedicated to that in uni ... it sucks
20:37:15 <int-e> @quote UML
20:37:15 <lambdabot> ScottAaronson says: One of the best predictors of success in mathematical logic is having an umlaut in your name.
20:37:22 <iqubic> join f x = f x x
20:37:24 <monochrom> hahaha
20:37:29 Maxdamantus joins (~Maxdamant@user/maxdamantus)
20:37:34 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Remote host closed the connection)
20:38:03 <Joao003> @quote Haskell
20:38:03 <lambdabot> Haskell says: "Some half dozen persons have written technically on combinatory logic, and most of these, including ourselves, have published something erroneous. Since some of our fellow sinners are
20:38:03 <lambdabot> among the most careful and competent logicians on the contemporary scene, we regard this as evidence that the subject is refractory. " -- Haskell B. Curry
20:38:23 <iqubic> That's just the W combinator.
20:38:36 <mauke> I'll take that W
20:38:41 <Joao003> Haha
20:38:44 <iqubic> join for ((->) r) is just the W combinator
20:39:17 <Joao003> More combinators: fix is Y
20:39:18 <tomsmeding> pity that (>>=) and (>=>) don't become a neat combinator
20:39:44 <mauke> join: \c x -> c x x
20:39:46 <monochrom> I'm sure there is a letter left for it if we add it now.
20:39:53 <mauke> (<*>): \c g x -> c x (g x)
20:40:02 <haskellbridge> 12<C​elestial> isn't `f >>= g = \x -> g (f x) x`
20:40:05 <mauke> (=<<): \c f x -> c (f x) x
20:40:12 <tomsmeding> Celestial: true
20:40:19 <mauke> liftA2: \c f g x -> c (f x) (g x)
20:40:54 <int-e> Y does nobody teach T? (T = T0 T0 where T0 = \t0 f -> f (t0 t0 f), and you actually get T f -> f (T f) with no awkward backward step)
20:41:03 <haskellbridge> 12<C​elestial> monochrom: maybe an umlaut, so that all the english people will have trouble typing it
20:41:13 <Joao003> What is the type of <*> for f as (->) r?
20:41:25 <tomsmeding> S
20:41:56 × tri_ quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 268 seconds)
20:41:56 <mauke> hence: (=<<) c f = liftA2 c f id; (<*>) c g = liftA2 c id g
20:42:03 <monochrom> (r -> a -> b) -> (r -> a) -> (r -> b)
20:42:12 <Joao003> (r -> a -> b) -> (r -> a) -> r -> b
20:42:32 <haskellbridge> 12<C​elestial> rabrarb
20:42:48 danza joins (~danza@151.47.209.192)
20:45:27 <EvanR> % :t (<*>) @((->) Int)
20:45:27 <yahb2> (<*>) @((->) Int) :: (Int -> (a -> b)) -> (Int -> a) -> Int -> b
20:45:36 <Joao003> return and pure are the stupidest names for functions ever
20:45:54 <EvanR> they both make sense given suitable context
20:45:55 <iqubic> pure is a good name. return is just shit.
20:46:09 <tomsmeding> should have called them η
20:46:15 <EvanR> return makes your code look like imperative code
20:46:20 <Joao003> True
20:46:22 <EvanR> pure indicates there's no effect
20:46:25 <probie> int-e: I remember tutoring some students at my local university, and in their lambda calculus section either this year, or last year (time is a blur), that was the fixed point combinator they used (previous iterations of the course used Y)
20:46:25 <Joao003> Yes
20:46:26 <tomsmeding> "warm fuzzy thing" -- SPJ
20:46:36 <Joao003> I'd call it wrap
20:46:42 <int-e> probie: cool!
20:46:49 <iqubic> I want GHC to make the Monad of No Return a real thing.
20:46:51 <monochrom> Meaningful names are the stupidest names ever.
20:47:13 <Joao003> Every single person ever: no
20:47:51 <monochrom> What you want is mnemonic names (and especially admitting that they should not be taken literally).
20:47:57 <iqubic> I just looked at my code for Advent of Code and found a function called loeb. I don't know why this function works, but I know how to use it.
20:48:07 <probie> How about pointed-joinable functors?
20:48:47 <mauke> I call it "cons"
20:48:51 <iqubic> loeb :: Functor f => f (f a -> a) -> f a
20:48:59 <iqubic> loeb x = go where go = fmap ($ go) x
20:49:18 <EvanR> seems like you can understand how it works by equational reasoning
20:49:26 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Remote host closed the connection)
20:49:35 <mauke> I remember that one. the spreadsheet combinator
20:49:38 <EvanR> since there's no seq in there xD
20:49:49 <iqubic> loeb x = let go = fmap (\f -> f go) x in go
20:49:49 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
20:49:58 <Joao003> fmap is composition under (->) r
20:50:04 <monochrom> tomsmeding: For decades I had not memorized which one is η which one is µ. Recently I realized "µ -> m -> multiply" so that must be join and so the other must be pure. :)
20:50:22 <haskellbridge> 12<C​elestial> iqubic: why would you have the let bind there?
20:50:36 <mauke> recursion
20:50:38 <haskellbridge> 12<C​elestial> oh I see, I think
20:51:08 <iqubic> You don't need let binding
20:51:09 <mauke> missed opportunity to use flip id, though
20:51:10 <tomsmeding> monochrom: yes :) I noticed that a bit earlier fortunately
20:51:20 <monochrom> You want to reuse whatever data structure go is. This is memoization.
20:51:23 <EvanR> @pl f x = let go = fmap (\f -> f go) x in go
20:51:23 <lambdabot> f = fix . flip (fmap . flip id)
20:51:37 <mauke> see? pl agrees
20:51:44 <iqubic> Thanks... I hate it!!!
20:52:02 tri joins (~tri@ool-18bbef1a.static.optonline.net)
20:52:03 <Joao003> @check \f g x -> fmap f g x == (f . g) x
20:52:05 <lambdabot> error:
20:52:05 <lambdabot> • No instance for (Typeable a0) arising from a use of ‘myquickcheck’ • In th...
20:52:08 <iqubic> @pl loeb x = go where go = fmap ($ go) x
20:52:08 <lambdabot> (line 1, column 23):
20:52:08 <lambdabot> unexpected " "
20:52:08 <lambdabot> expecting operator
20:52:18 <Franciman> why doesn't ghc implement fully lazy sharing by default?
20:52:22 <Joao003> @check \f g x -> (fmap f g x) == ((f . g) x)
20:52:22 <EvanR> that command was pointless
20:52:23 <Franciman> but only when optimizing?
20:52:24 <lambdabot> error:
20:52:24 <lambdabot> • No instance for (Typeable a0) arising from a use of ‘myquickcheck’ • In th...
20:52:36 <mauke> :t fmap fix (flip (fmap fmap (flip id)))
20:52:36 <iqubic> @pl \f x -> go where go = fmap ($ go) x
20:52:36 <lambdabot> (line 1, column 22):
20:52:36 <lambdabot> unexpected " "
20:52:36 <lambdabot> expecting operator
20:52:37 <lambdabot> Functor f => f (f b -> b) -> f b
20:52:40 <monochrom> iqubic: https://www.vex.net/~trebla/tmp/Loeb.hs is my own study notes on loeb.
20:52:41 <Franciman> well, actually when optimizing the docs says it still doesn't fully use fully lazy sharing
20:52:55 <EvanR> fully lazy sharing = full laziness?
20:53:02 <Franciman>
20:53:04 <Franciman> yes
20:53:06 <Franciman> :P sorry
20:53:31 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7854:33e:c79:490a)
20:53:49 <iqubic> moeb :: (((a -> b) -> b) -> c -> a) -> c -> a
20:53:56 <iqubic> moeb f x = let go = f ($ go) x in go
20:54:08 <Joao003> we need noeb now
20:54:13 <iqubic> loeb = moeb fmap
20:54:15 <probie> I've never actually worked out if löb in Haskell is actually related to löb's theroem, or if it's just that it looks superficially similar, with "provable in PA" replaced with an arbitrary functor
20:54:53 <monochrom> I think no one have. :)
20:55:03 <int-e> maybe you can trigger edwardk into explaining that one?
20:55:09 <iqubic> probie: according to the Curry-Howard Isomorphism, they are the same.
20:55:11 <iqubic> https://www.lesswrong.com/posts/jshdZw3xofq9wgE7T/a-proof-of-loeb-s-theorem-in-haskell
20:55:23 <monochrom> ooohhh lazy evaluation applied to edwardk >:)
20:55:33 tri_ joins (~tri@ool-18bbef1a.static.optonline.net)
20:56:11 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 245 seconds)
20:56:35 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
20:56:58 <monochrom> I don't think a post using Agda/Idris/Lean/... is understandable to a narrower audience.
20:57:14 <monochrom> It is not like the post would make you write your own code in Agda.
20:57:24 <monochrom> It just needs you to read and guess.
20:57:34 <iqubic> Does moeb foldMap have any uses?
20:57:48 <iqubic> @let moeb f x = let go = f ($ go) x in go
20:57:50 <lambdabot> Defined.
20:58:02 <iqubic> :t moeb foldMap
20:58:03 <lambdabot> (Foldable t, Monoid a) => t (a -> a) -> a
20:58:13 × Joao003 quits (~Joao003@190.108.99.230) (Quit: Bye!)
20:58:15 <iqubic> What?!??!
20:58:28 juri__ joins (~juri@79.140.115.48)
20:58:45 <probie> Is provability in PA a functor? I surely can't just `fmap (const PAIsSound) (proof that 1 = 1)`?
20:59:07 <int-e> :t foldMap Endo
20:59:07 <iqubic> :t foldl' (.) id
20:59:08 <lambdabot> Foldable t => t (a -> a) -> Endo a
20:59:09 <lambdabot> Foldable t => t (c -> c) -> c -> c
20:59:23 <int-e> :t appEndo . foldMap Endo
20:59:24 <lambdabot> Foldable t => t (a -> a) -> a -> a
20:59:39 <iqubic> moeb foldMap is not quite any of those.
20:59:56 × tri_ quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 245 seconds)
21:00:00 <tomsmeding> iqubic: isn't that just modus ponens
21:00:08 <iqubic> What?
21:00:10 <tomsmeding> oh, no
21:00:17 <int-e> > appEndo (foldMap Endo [(+ -4),(*2)]) 23
21:00:19 <lambdabot> error:
21:00:19 <lambdabot> The operator ‘+’ [infixl 6] of a section
21:00:19 <lambdabot> must have lower precedence than that of the operand,
21:00:21 <tomsmeding> ignore what I said :)
21:00:29 <int-e> > appEndo (foldMap Endo [(-4+),(*2)]) 23
21:00:30 <lambdabot> 42
21:00:50 <EvanR> t (a -> a) -> a seems to be impossible, unless bottom?
21:00:58 <int-e> :t fix
21:00:59 <lambdabot> (a -> a) -> a
21:01:07 <int-e> :t fix . foldr (.) id
21:01:08 <lambdabot> Foldable t => t (c -> c) -> c
21:01:18 <iqubic> It's that, yeah.
21:01:24 <EvanR> er
21:01:26 <iqubic> Is that just bottom?
21:01:39 × juri_ quits (~juri@implicitcad.org) (Ping timeout: 252 seconds)
21:01:48 <int-e> > fix . foldr (.) id $ [(1:), (2:)]
21:01:50 <lambdabot> [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2...
21:02:03 <iqubic> What?!?!
21:02:11 <mauke> > moeb foldMap [const "A", const "B", const "C"]
21:02:13 <lambdabot> "ABC"
21:02:22 <iqubic> How does that work?!?!
21:02:30 <int-e> iqubic: it's called laziness
21:02:31 int-e runs
21:02:45 <int-e> > fix ((1:) . (2:))
21:02:46 <lambdabot> [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2...
21:02:51 <iqubic> I'm so confused. These are some strange loops we find oureself in.
21:03:00 <int-e> > fix (\x -> 1:2:x)
21:03:01 <lambdabot> [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2...
21:03:05 <mauke> > moeb foldMap [const "A", const "B", ('C' :)]
21:03:07 <lambdabot> "ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC...
21:03:50 <iqubic> > moeb foldMap [const "A", ('B' :), ('C' :)]
21:03:51 <lambdabot> "ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA...
21:03:52 mauke understands
21:03:53 <int-e> :t moeb
21:03:54 <lambdabot> (((a -> b) -> b) -> t -> a) -> t -> a
21:04:26 <iqubic> How does foldMap have the right signature to work there?
21:04:31 <iqubic> :t foldMap
21:04:32 <lambdabot> (Foldable t, Monoid m) => (a -> m) -> t a -> m
21:05:02 <iqubic> Oh... Is this using the Monoid instance for fuctions?
21:05:15 <mauke> functions don't monoid
21:05:27 thegeekinside joins (~thegeekin@189.217.90.224)
21:06:16 <mauke> but also, the result is a list
21:06:20 <iqubic> https://hackage.haskell.org/package/base-4.19.0.0/docs/src/GHC.Base.html#line-398
21:06:26 <iqubic> I think they do.
21:06:27 <EvanR> though there is Monoid m => Monoid (a -> m)
21:06:32 <mauke> there is? dang
21:06:51 <mauke> m = [Char]
21:07:55 <probie> m ~ [Char], a ~ ([Char] -> [Char]), t ~ []
21:08:07 × juri__ quits (~juri@79.140.115.48) (Ping timeout: 255 seconds)
21:09:53 <iqubic> Can "moeb foldMap" produce anything that isn't infinite?
21:09:58 juri_ joins (~juri@79.140.115.48)
21:10:18 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 268 seconds)
21:10:46 <int-e> > moeb foldMap [const "A"]
21:10:48 <lambdabot> "A"
21:10:52 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
21:11:01 <int-e> (it has been done above already)
21:11:17 <int-e> specializing types, we have
21:11:20 <int-e> moeb :: (Foldable t, Monoid m) => (((m -> m) -> m) -> t (m -> m) -> m) -> t (m -> m) -> m
21:11:23 <int-e> foldMap :: (Foldable t, Monoid m) => ((m -> m) -> m) -> t (m -> m) -> m
21:11:30 <iqubic> Can this be used to compute interesting results?
21:11:41 <mauke> > moeb foldMap [const "A", const "B", pure . head]
21:11:42 <lambdabot> "ABA"
21:12:11 <iqubic> So, it's a spreadsheet, but it mappends the results?
21:12:50 phma_ is now known as phma
21:12:52 <mauke> yes
21:12:58 <iqubic> > moeb foldMap [const "A", const "B", pure . last]
21:13:00 <lambdabot> "AB*Exception: <<loop>>
21:13:03 <EvanR> it's a spreadsheet? Does that mean it's just FRP? xD
21:13:26 <mauke> > moeb foldMap [const "A", const "B", take 5]
21:13:28 <lambdabot> "ABABABA"
21:13:55 <iqubic> why does that work?
21:14:18 <mauke> because 5/4 is a cool time signature
21:14:27 <monochrom> Ooohhhh interesting. A spreadsheet serialized to one single string...
21:14:39 <iqubic> What... It is?!? How?!?
21:14:47 <monochrom> Haha damn you with your 5/4 time.
21:15:01 <int-e> > moeb foldMap [take 5 . ('A':), take 5 . ('B':), take 15 . ('C':)]
21:15:03 <lambdabot> "AAAAABAAAACAAAAABAAAACAAA"
21:15:03 × juri_ quits (~juri@79.140.115.48) (Read error: Connection reset by peer)
21:15:07 <int-e> no clue wtf that really does
21:15:09 <probie> > let x = mconcat $ map ($ x) [const "A", const "B", take 5] in x
21:15:10 <lambdabot> "ABABABA"
21:15:22 <monochrom> "ABABABA" = concat ["A", "B", "ABABA"]
21:15:27 juri_ joins (~juri@79.140.115.48)
21:15:51 <iqubic> > moeb foldMap [const "A", const "B", drop 5]
21:15:53 <lambdabot> "AB*Exception: <<loop>>
21:16:20 <mauke> you can't read ahead of the writer
21:16:28 <iqubic> I see that now.
21:16:48 <iqubic> oldMap [const "A", const "B", (!! 1)]
21:16:57 <EvanR> you can only read ahead of the writer in the tardis monad
21:16:59 <mauke> infinite type
21:17:13 <iqubic> > moeb foldMap [const "A", const "B", (!! 1)]
21:17:15 <lambdabot> error:
21:17:15 <lambdabot> • Couldn't match type ‘Char’ with ‘[Char]’
21:17:15 <lambdabot> Expected type: [Char] -> [Char]
21:17:31 <iqubic> Why is that an infinite type?
21:17:43 <mauke> solve Char = [Char] for Char
21:17:53 <EvanR> the infinite type message is gone?
21:17:59 <iqubic> > moeb foldMap [const "A", const "B", pure . (!! 1)]
21:18:01 <lambdabot> "ABB"
21:19:10 <mauke> :t \f -> [f, f ()]
21:19:11 <lambdabot> error:
21:19:11 <lambdabot> • Occurs check: cannot construct the infinite type: t ~ () -> t
21:19:11 <lambdabot> • In the expression: f ()
21:19:29 <mauke> :t \f -> [f, f !! 1]
21:19:30 <lambdabot> error:
21:19:30 <lambdabot> • Occurs check: cannot construct the infinite type: a ~ [a]
21:19:30 <lambdabot> • In the expression: f !! 1
21:19:31 <iqubic> This is just madness.
21:19:45 <geekosaur> I think it is gone in later ghc though?
21:19:58 <int-e> moeb foldMap [f, g, h] = [fix f, fix (g . (fix f <>)), fix (h . (fix (g . (fix f <>)) <>)] etc?
21:20:06 <geekosaur> % :t \f -> [f, f !! 1]
21:20:06 <yahb2> <interactive>:1:11: error: ; • Couldn't match expected type ‘[a]’ with actual type ‘a’ ; ‘a’ is a rigid type variable bound by ; the inferred type of it :: a -> [a] ; at <...
21:20:26 <int-e> it's weird
21:20:33 <mauke> int-e: I think there's only one fix
21:20:34 <iqubic> What is the Dual newtype wrapper do?
21:20:59 × rvalue quits (~rvalue@user/rvalue) (Ping timeout: 264 seconds)
21:21:07 rvalue- joins (~rvalue@user/rvalue)
21:21:36 <iqubic> Oh. I see it just reverses the order of arguments to mappend
21:22:14 <iqubic> (Dual x) <> (Dual y) = Dual (y <> x)
21:22:44 <iqubic> mempty (Dual x) = Dual (mempty x)
21:22:45 <int-e> Oh wait, `msum` that final list what I wrote.
21:22:53 <int-e> mauke: no, there must be several
21:23:05 <int-e> > take 10 $ moeb foldMap [('A':), ('B':)]
21:23:07 <lambdabot> "AAAAAAAAAA"
21:23:12 <int-e> > take 10 $ moeb foldMap [take 2 . ('A':), ('B':)]
21:23:14 <lambdabot> "AABAABAABA"
21:23:42 <mauke> why?
21:23:47 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.1.1)
21:23:59 <int-e> > fix (take 2 . ('A':) . ('B':))
21:24:01 <lambdabot> "AB"
21:24:25 <mauke> x = mconcat (map ($ x) fs)
21:24:27 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
21:24:30 <mauke> solve for x
21:25:02 rvalue- is now known as rvalue
21:25:08 <lambdabot> *squawk*
21:25:08 <EvanR> you would need a Group for that
21:25:16 <int-e> > let x = mconcat (map ($ x) [take 2 . ('A':), ('B':)]) in take 10 x
21:25:18 <lambdabot> "AABAABAABA"
21:25:46 <iqubic> What does the ST of runST stand for?
21:25:51 <mauke> state thread
21:25:51 <int-e> fair enough I guess
21:27:15 <iqubic> How does runST work?
21:27:16 <int-e> mauke: but I wanted to get a better understanding of how the result is constructed using the functions from fs. In particular, if `fix (head fs)` is already infinite then the remaining functions won't ever get to run
21:27:26 <int-e> magic
21:27:42 <int-e> I mean, which answer do you want? What is your real question?
21:28:19 <int-e> You can imagine a pure implementation of ST that uses stuff like Data.Array and Data.Map and some really awkward coercions.
21:28:25 <iqubic> Is there anywhere I can go to look at the API for STArrays?
21:29:09 <int-e> But the actual implementation in GHC is basically a restricted version of IO.
21:29:54 <iqubic> I don't get what the magical `s' of `forall s. ST s' means...
21:29:55 <int-e> With runST being like unsafePerformIO but safe because it only allocates memory and modifies memory created within the same action.
21:30:31 <int-e> All mutable data associated with the state thread is tagged with `s`. You can't use it in any other state thread.
21:30:32 <mauke> iqubic: that's a type system trick to make sure references allocated in one ST block cannot escape to other blocks
21:32:01 <ncf> why did the robot say *squawk*
21:32:04 <int-e> (It /can/ escape, but to do that you have to quantify `s` existentially and it won't unify with the `s` from any other `runST`)
21:32:21 <mauke> the point of ST is to allow mutable variables, but only "inside". the final ST action as a whole must have a pure interface
21:32:31 <iqubic> Oh. I see.
21:32:32 <mauke> or in other words, the mutable variables of ST are all local
21:32:59 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
21:33:02 <mauke> if you could allocate STRefs in one action, but read/write them in another, that would break purity
21:33:59 <mauke> you could enforce that with a runtime check, but the s parameter (and the weird type of runST) turn violations of this property into a type error
21:34:47 <iqubic> I see. That makes sense.
21:34:58 × waldo quits (~waldo@user/waldo) (Ping timeout: 276 seconds)
21:37:59 × juri_ quits (~juri@79.140.115.48) (Read error: Connection reset by peer)
21:38:54 juri_ joins (~juri@79.140.115.48)
21:41:37 <EvanR> if you use impure techniques within a function in a way that no one can ever find out about it, then you can still claim you wrote a pure function. ST lets you do a safe limited form of that
21:42:55 <int-e> EvanR: apparently "how does it work" was about the type, not the internal workings.
21:45:14 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds)
21:45:59 <EvanR> unsafePerformIO is less limited and less safe, standard haskell code is more limited but not more safe than ST, ST is a win win, or a win tie
21:46:13 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
21:48:18 <EvanR> see also the safe vs useless chart from SPJ "haskell is useless" xD
21:48:50 × juri_ quits (~juri@79.140.115.48) (Ping timeout: 268 seconds)
21:49:44 tri joins (~tri@ool-18bbef1a.static.optonline.net)
21:50:02 juri_ joins (~juri@implicitcad.org)
21:54:06 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 256 seconds)
21:54:49 × cimento quits (CO2@gateway/vpn/protonvpn/cimento) (Quit: WeeChat 4.1.2)
22:00:01 tri joins (~tri@ool-18bbef1a.static.optonline.net)
22:04:19 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 246 seconds)
22:04:29 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
22:05:11 × danza quits (~danza@151.47.209.192) (Ping timeout: 268 seconds)
22:08:27 × oo_miguel quits (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Quit: oo_miguel)
22:14:53 × aruns quits (~aruns@user/aruns) (Ping timeout: 240 seconds)
22:19:21 tri joins (~tri@ool-18bbef1a.static.optonline.net)
22:19:55 <monochrom> Oh yeah I learned the hard way that Americans say "how does it work?" to just mean how to be an end user.
22:23:53 tri_ joins (~tri@ool-18bbef1a.static.optonline.net)
22:26:59 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds)
22:27:59 × tri_ quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 252 seconds)
22:28:09 × fendor quits (~fendor@2a02:8388:1605:d100:267b:1353:13d7:4f0c) (Remote host closed the connection)
22:31:25 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
22:34:41 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
22:37:53 × michalz_ quits (~michalz@185.246.207.221) (Quit: ZNC 1.8.2 - https://znc.in)
22:39:02 <probie> monochrom: As a non-American, but native English speaker, I must be the bearer of bad news and inform you that that usage of "how does it work?" is not restricted to Americans
22:40:05 × acidjnk quits (~acidjnk@p200300d6e72b9302007c3ef187da4880.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
22:41:11 <monochrom> The silver lining is that it is simpler to remember "all English dialects do this" than "case dialect of American -> ... ; British -> ... ; Australian -> ..."
22:41:45 <monochrom> Have I told you: Every silver lining has tarnish. >:)
22:41:59 <monochrom> https://www.vex.net/~trebla/humour/pessimisms.html
22:42:00 <juri_> oddly, i've been using "how does it work mechanically", when i want to actuallly know how something works.
22:46:05 × dhil quits (~dhil@2001:8e0:2014:3100:2e71:f759:1c5d:e673) (Ping timeout: 240 seconds)
22:47:36 <monochrom> Why, you press the keys c a b a l <space> i n s t a l l <enter> mechanically! And be sure to use a mechanical keyboard! >:)
22:48:42 <int-e> don't forget to release the keys as well
22:48:52 <int-e> it takes a lot of practice to get this right
22:49:40 <monochrom> For semiconductor-based computers you have to say "how does it work quantum-mechanically?" >:)
22:52:42 cimento joins (CO2@gateway/vpn/protonvpn/cimento)
23:01:45 qeef joins (~qeef@138-169-143-94.cust.centrio.cz)
23:02:24 tri joins (~tri@ool-18bbef1a.static.optonline.net)
23:02:51 × tri quits (~tri@ool-18bbef1a.static.optonline.net) (Client Quit)
23:02:53 × td_ quits (~td@i53870937.versanet.de) (Ping timeout: 240 seconds)
23:03:18 pavonia joins (~user@user/siracusa)
23:05:05 td_ joins (~td@i53870935.versanet.de)
23:06:26 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
23:11:06 × xff0x quits (~xff0x@ai085147.d.east.v6connect.net) (Ping timeout: 260 seconds)
23:11:13 × cimento quits (CO2@gateway/vpn/protonvpn/cimento) (Quit: WeeChat 4.1.2)
23:13:06 xff0x joins (~xff0x@178.255.149.135)
23:17:42 peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com)
23:22:49 todi joins (~todi@p5dca55c4.dip0.t-ipconnect.de)
23:25:55 jargon joins (~jargon@32.sub-174-238-226.myvzw.com)
23:27:45 cimento joins (CO2@gateway/vpn/protonvpn/cimento)
23:27:51 son0p joins (~ff@181.136.122.143)
23:32:13 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
23:33:43 azimut joins (~azimut@gateway/tor-sasl/azimut)
23:43:23 emmanuelux joins (~emmanuelu@user/emmanuelux)
23:44:23 × xff0x quits (~xff0x@178.255.149.135) (Ping timeout: 264 seconds)
23:44:38 × cimento quits (CO2@gateway/vpn/protonvpn/cimento) (Quit: WeeChat 4.1.2)
23:45:49 xff0x joins (~xff0x@ai085147.d.east.v6connect.net)
23:47:54 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
23:55:53 × peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 256 seconds)
23:57:07 × Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Quit: Leaving.)

All times are in UTC on 2023-12-14.