2021/01/05

2021-01-05 00:01:39 +0100jcowan(sid325434@gateway/web/irccloud.com/x-xccxiqbedbcrqfvq) ()
2021-01-05 00:02:29 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com)
2021-01-05 00:02:30 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 00:03:15 +0100carthia(~carthia@gateway/tor-sasl/carthia) (Quit: carthia)
2021-01-05 00:03:55 +0100juri_(~juri@178.63.35.222) (Ping timeout: 265 seconds)
2021-01-05 00:03:57 +0100__monty__(~toonn@unaffiliated/toonn) (Quit: leaving)
2021-01-05 00:04:41 +0100Major_Biscuit(~Major_Bis@93-21-124.netrun.cytanet.com.cy)
2021-01-05 00:06:21 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce) (Remote host closed the connection)
2021-01-05 00:09:14 +0100Gurkenglas(~Gurkengla@unaffiliated/gurkenglas) (Ping timeout: 265 seconds)
2021-01-05 00:12:54 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:b151:c200:4f65:e713)
2021-01-05 00:14:18 +0100dhil(~dhil@78.156.97.38) (Ping timeout: 256 seconds)
2021-01-05 00:14:47 +0100carlomagno(~cararell@148.87.23.13) (Quit: Leaving.)
2021-01-05 00:15:41 +0100Tario(~Tario@201.192.165.173) (Read error: Connection reset by peer)
2021-01-05 00:16:11 +0100LKoen(~LKoen@174.175.9.109.rev.sfr.net) (Quit: “It’s only logical. First you learn to talk, then you learn to think. Too bad it’s not the other way round.”)
2021-01-05 00:16:22 +0100Tario(~Tario@201.192.165.173)
2021-01-05 00:16:24 +0100elliott_(~elliott@pool-108-51-101-42.washdc.fios.verizon.net) (Ping timeout: 260 seconds)
2021-01-05 00:17:27 +0100acarrico(~acarrico@dhcp-68-142-39-249.greenmountainaccess.net) (Ping timeout: 265 seconds)
2021-01-05 00:20:31 +0100juri_(~juri@178.63.35.222)
2021-01-05 00:23:11 +0100Franciman(~francesco@host-87-17-26-221.retail.telecomitalia.it) (Quit: Leaving)
2021-01-05 00:23:44 +0100pera(~pera@unaffiliated/pera) (Ping timeout: 265 seconds)
2021-01-05 00:24:12 +0100jumper149(~jumper149@ip4d1622a9.dynamic.kabel-deutschland.de)
2021-01-05 00:25:02 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com)
2021-01-05 00:25:37 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce)
2021-01-05 00:25:50 +0100ADG1089__(~aditya@122.163.234.142) (Remote host closed the connection)
2021-01-05 00:25:50 +0100mpereira(~mpereira@2a02:810d:f40:d96:60a3:298c:ae57:512d) (Ping timeout: 264 seconds)
2021-01-05 00:28:54 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 272 seconds)
2021-01-05 00:28:56 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 00:30:13 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com) (Ping timeout: 264 seconds)
2021-01-05 00:30:32 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 00:30:42 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 00:30:53 +0100matryoshka(~matryoshk@2606:6080:1002:8:3285:30e:de43:8809)
2021-01-05 00:31:09 +0100todda7(~torstein@ppp-2-84-17-53.home.otenet.gr)
2021-01-05 00:33:41 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 00:34:36 +0100DirefulSalt(DirefulSal@gateway/vpn/privateinternetaccess/direfulsalt)
2021-01-05 00:35:07 +0100shutdown_-h_now(~arjan@2001:1c06:2d0b:2312:ea:479d:de22:4e6b) (Ping timeout: 272 seconds)
2021-01-05 00:39:43 +0100Lorra(~lorenzo@2001:a61:ba6:4501:e4b0:8d5e:9fde:f2ec) (Quit: Konversation terminated!)
2021-01-05 00:40:33 +0100shutdown_-h_now(~arjan@2001:1c06:2d0b:2312:1c6c:f94b:408f:edd0)
2021-01-05 00:43:54 +0100Major_Biscuit(~Major_Bis@93-21-124.netrun.cytanet.com.cy) (Quit: WeeChat 2.9)
2021-01-05 00:44:30 +0100cmcma20(~cmcma20@l37-192-2-125.novotelecom.ru) (Quit: leaving)
2021-01-05 00:45:13 +0100cr3(~cr3@192-222-143-195.qc.cable.ebox.net) (Ping timeout: 264 seconds)
2021-01-05 00:45:38 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 00:46:52 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 00:49:17 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:b151:c200:4f65:e713) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 00:51:32 +0100CMCDragonkai1(~Thunderbi@120.17.149.179) (Read error: Connection reset by peer)
2021-01-05 00:55:06 +0100usr25(~usr25@unaffiliated/usr25) (Quit: Leaving)
2021-01-05 00:55:12 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Ping timeout: 260 seconds)
2021-01-05 00:55:28 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 00:55:44 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 00:58:02 +0100tessier(~treed@mail.copilotco.com)
2021-01-05 00:58:02 +0100tessier(~treed@mail.copilotco.com) (Changing host)
2021-01-05 00:58:02 +0100tessier(~treed@kernel-panic/copilotco)
2021-01-05 01:00:09 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Ping timeout: 260 seconds)
2021-01-05 01:01:54 +0100dirediresalt(DirefulSal@gateway/vpn/privateinternetaccess/direfulsalt)
2021-01-05 01:03:06 +0100DirefulSalt(DirefulSal@gateway/vpn/privateinternetaccess/direfulsalt) (Ping timeout: 272 seconds)
2021-01-05 01:04:32 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com)
2021-01-05 01:05:06 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 01:09:13 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com) (Ping timeout: 264 seconds)
2021-01-05 01:10:25 +0100natechan(~natechan@108-233-125-227.lightspeed.sntcca.sbcglobal.net) (Quit: WeeChat 2.9)
2021-01-05 01:10:25 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 264 seconds)
2021-01-05 01:11:44 +0100cr3(~cr3@192-222-143-195.qc.cable.ebox.net)
2021-01-05 01:13:53 +0100sfvm(~sfvm@37.228.215.77)
2021-01-05 01:15:52 +0100natechan(~natechan@108-233-125-227.lightspeed.sntcca.sbcglobal.net)
2021-01-05 01:25:47 +0100jespada(~jespada@90.254.245.49) (Ping timeout: 272 seconds)
2021-01-05 01:26:27 +0100gehmehgeh(~ircuser1@gateway/tor-sasl/gehmehgeh) (Quit: Leaving)
2021-01-05 01:27:58 +0100ph88(~ph88@ip5f5af6cd.dynamic.kabel-deutschland.de)
2021-01-05 01:29:23 +0100jespada(~jespada@90.254.245.49)
2021-01-05 01:33:03 +0100emptyflask(~jon@66.64.40.21)
2021-01-05 01:33:13 +0100ph88(~ph88@ip5f5af6cd.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds)
2021-01-05 01:33:44 +0100ensyde(~ensyde@2600:1702:2e30:1a40:9d3a:4059:c410:b901)
2021-01-05 01:39:13 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net) (Ping timeout: 264 seconds)
2021-01-05 01:42:00 +0100thunderrd(~thunderrd@183.182.111.131) (Ping timeout: 246 seconds)
2021-01-05 01:44:47 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 01:47:23 +0100Tuplanolla(~Tuplanoll@91-159-68-239.elisa-laajakaista.fi) (Quit: Leaving.)
2021-01-05 01:48:34 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Ping timeout: 260 seconds)
2021-01-05 01:48:50 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 01:49:41 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz)
2021-01-05 01:52:03 +0100acarrico(~acarrico@dhcp-68-142-39-249.greenmountainaccess.net)
2021-01-05 01:53:01 +0100ulidtko(~ulidtko@194.54.80.38) (Ping timeout: 246 seconds)
2021-01-05 01:53:28 +0100SrPx(sid108780@gateway/web/irccloud.com/x-jqknpexcrnufpwgi) (Ping timeout: 268 seconds)
2021-01-05 01:55:15 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz) (Quit: leaving)
2021-01-05 01:56:03 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr)
2021-01-05 01:56:15 +0100SrPx(sid108780@gateway/web/irccloud.com/x-ugcimtnskspafeof)
2021-01-05 01:56:17 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz)
2021-01-05 01:56:37 +0100tama(~tama@unaffiliated/tama00)
2021-01-05 01:59:25 +0100tama00(~tama@unaffiliated/tama00) (Ping timeout: 240 seconds)
2021-01-05 02:01:22 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz) (Quit: leaving)
2021-01-05 02:01:38 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz)
2021-01-05 02:01:43 +0100ohmysomu1huser(~nickednam@37.120.211.197)
2021-01-05 02:01:45 +0100ohmysomuchuser(~nickednam@037008230157.dynamic-3-poz-k-1-2-0.vectranet.pl) (Ping timeout: 256 seconds)
2021-01-05 02:03:37 +0100nictki(~nictki@b2b-78-94-64-166.unitymedia.biz) (Client Quit)
2021-01-05 02:03:57 +0100troydm(~troydm@unaffiliated/troydm) (Ping timeout: 268 seconds)
2021-01-05 02:09:21 +0100da39a3ee5e6b4b0d(~da39a3ee5@2403:6200:8876:12e2:f4f0:d2c0:3ecf:a408)
2021-01-05 02:11:08 +0100whataday(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2021-01-05 02:11:19 +0100Rudd0(~Rudd0@185.189.115.103) (Ping timeout: 260 seconds)
2021-01-05 02:11:23 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 02:12:15 +0100whataday(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2021-01-05 02:12:47 +0100ensyde(~ensyde@2600:1702:2e30:1a40:9d3a:4059:c410:b901) ()
2021-01-05 02:18:58 +0100FrostyX(~jkadlcik@78.80.183.78) (Remote host closed the connection)
2021-01-05 02:19:03 +0100Tario(~Tario@201.192.165.173) (Read error: Connection reset by peer)
2021-01-05 02:19:19 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
2021-01-05 02:21:13 +0100Tario(~Tario@201.192.165.173)
2021-01-05 02:28:12 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com)
2021-01-05 02:28:22 +0100kyali_(~kyali@APN-123-249-162-gprs.simobil.net)
2021-01-05 02:29:02 +0100dandels(~dandels@unaffiliated/dandels)
2021-01-05 02:29:34 +0100guest14guest15
2021-01-05 02:30:35 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93) (Quit: Quit 啾)
2021-01-05 02:31:10 +0100kyali(~kyali@APN-123-251-207-gprs.simobil.net) (Ping timeout: 246 seconds)
2021-01-05 02:31:12 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93)
2021-01-05 02:32:13 +0100columbarius1(~columbari@mue-88-130-54-155.dsl.tropolys.de) (Ping timeout: 246 seconds)
2021-01-05 02:34:36 +0100columbarius1(~columbari@mue-88-130-54-222.dsl.tropolys.de)
2021-01-05 02:34:39 +0100cole-h(~cole-h@c-73-48-197-220.hsd1.ca.comcast.net) (Ping timeout: 260 seconds)
2021-01-05 02:36:12 +0100spopejoy(~stuart@ool-44c5f8c9.dyn.optonline.net)
2021-01-05 02:39:03 +0100troydm(~troydm@unaffiliated/troydm)
2021-01-05 02:39:31 +0100nineonine(~nineonine@50.216.62.2) (Remote host closed the connection)
2021-01-05 02:40:03 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 02:40:20 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 02:40:39 +0100Tario(~Tario@201.192.165.173) (Read error: Connection reset by peer)
2021-01-05 02:44:52 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 260 seconds)
2021-01-05 02:51:02 +0100Tario(~Tario@201.192.165.173)
2021-01-05 02:51:13 +0100jmchael(~jmchael@81.174.205.210) (Ping timeout: 264 seconds)
2021-01-05 02:51:30 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 02:51:44 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 02:52:06 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr)
2021-01-05 02:52:44 +0100crblmr(~carbolyme@matrix.dropacid.net) (Ping timeout: 256 seconds)
2021-01-05 02:54:11 +0100crblmr(~carbolyme@137.117.174.36)
2021-01-05 02:54:32 +0100 <ezzieyguywuf> do y'all have any experience with this program? https://hackage.haskell.org/package/cabal-bounds
2021-01-05 02:54:37 +0100 <ezzieyguywuf> or do you just manage your bounds manually?
2021-01-05 02:55:57 +0100justanotheruser(~justanoth@unaffiliated/justanotheruser) (Ping timeout: 260 seconds)
2021-01-05 02:56:22 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 246 seconds)
2021-01-05 02:57:31 +0100duckonomy(~duckonomy@177.ip-144-217-84.net) (Quit: z.z)
2021-01-05 02:58:11 +0100 <Clint> manual sounds better to me
2021-01-05 02:59:22 +0100 <ezzieyguywuf> how do you choose when to not include any bounds?
2021-01-05 02:59:25 +0100duckonomy(~duckonomy@177.ip-144-217-84.net)
2021-01-05 02:59:26 +0100 <ezzieyguywuf> or should every dep have a bound?
2021-01-05 03:02:29 +0100 <Clint> i update lower bounds when i use a function that was introduced in whichever library version
2021-01-05 03:02:42 +0100 <Clint> and i try to avoid upper bounds as much as possible
2021-01-05 03:02:48 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
2021-01-05 03:05:26 +0100dfeuer(~dfeuer@pool-108-18-223-60.washdc.fios.verizon.net) (Ping timeout: 256 seconds)
2021-01-05 03:05:53 +0100 <ezzieyguywuf> Clint: is that considered a best practice?
2021-01-05 03:06:54 +0100 <Clint> not around here
2021-01-05 03:07:07 +0100 <ezzieyguywuf> lol
2021-01-05 03:07:16 +0100 <ezzieyguywuf> Clint: why? and where might it be considered as such?
2021-01-05 03:09:12 +0100 <maerwald> ezzieyguywuf: PVP relies on upper bounds to make sense, like semver, but most ppl don't distinguish between "I know this doesn't work with version later than X" and "I know this works with version equal or lesser than X"
2021-01-05 03:09:45 +0100 <maerwald> nor do they maintain their bounds in a timely manner, so you very often get upper bounds that are needlessly too tight
2021-01-05 03:10:09 +0100 <maerwald> if you're developing an app, forget about upper bounds
2021-01-05 03:10:29 +0100 <maerwald> if you're developing a library, it's a bit more delicate
2021-01-05 03:11:18 +0100wei2912(~wei2912@unaffiliated/wei2912)
2021-01-05 03:11:43 +0100 <maerwald> (I'd say ignoring upper bounds for libraries is fine, if you a) have nightly builds of your lib and b) are able to fix breakage with both a revbump and a code-fix in a very short time)
2021-01-05 03:12:02 +0100 <maerwald> otherwise you're going to piss of hackage trustees and others
2021-01-05 03:12:11 +0100 <ezzieyguywuf> maerwald: thank you for your thoughts
2021-01-05 03:12:29 +0100 <ezzieyguywuf> I have yet to upload anything to hackage, but I am working on a library that will eventually go there
2021-01-05 03:13:38 +0100ransom(~c4264035@8.47.12.52) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 03:13:43 +0100 <Clint> ezzieyguywuf: getting it added to stackage will help you
2021-01-05 03:13:59 +0100notzmv(~user@unaffiliated/zmv)
2021-01-05 03:14:53 +0100ransom(~c4264035@8.47.12.52)
2021-01-05 03:15:15 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 03:15:35 +0100 <ezzieyguywuf> Clint: "help me" how?
2021-01-05 03:16:01 +0100 <Clint> ezzieyguywuf: alert you to impending upper-bounds problems
2021-01-05 03:16:04 +0100nineonine(~nineonine@50.216.62.2) (Ping timeout: 260 seconds)
2021-01-05 03:16:21 +0100 <ezzieyguywuf> ah, I see.
2021-01-05 03:19:48 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 268 seconds)
2021-01-05 03:21:13 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 03:22:34 +0100justanotheruser(~justanoth@unaffiliated/justanotheruser)
2021-01-05 03:24:29 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 03:26:11 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce) (Remote host closed the connection)
2021-01-05 03:26:52 +0100dandels(~dandels@unaffiliated/dandels) (Ping timeout: 272 seconds)
2021-01-05 03:27:13 +0100ohmysomu1huser(~nickednam@37.120.211.197) (Ping timeout: 264 seconds)
2021-01-05 03:27:50 +0100elfets(~elfets@ip-37-201-23-96.hsi13.unitymediagroup.de) (Quit: Leaving)
2021-01-05 03:28:41 +0100 <ezzieyguywuf> so if I have `config-schema ^>= 1.2.0.0`, and the version bumps to `1.3`, do I add `&& ^>= 1.3`?
2021-01-05 03:30:46 +0100acarrico(~acarrico@dhcp-68-142-39-249.greenmountainaccess.net) (Ping timeout: 256 seconds)
2021-01-05 03:32:23 +0100 <ezzieyguywuf> what is this v3.4? of the docs? https://cabal.readthedocs.io/en/3.4/index.html
2021-01-05 03:32:29 +0100 <ezzieyguywuf> I don't see v3.4 for cabal or cabal-install
2021-01-05 03:33:40 +0100 <sclv> doc version is ahead of the released hackage version I think
2021-01-05 03:35:12 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce)
2021-01-05 03:36:12 +0100 <ezzieyguywuf> should I use the latest doc version or the version corresponding to my cabal-install version?
2021-01-05 03:36:39 +0100spopejoy(~stuart@ool-44c5f8c9.dyn.optonline.net) (Quit: spopejoy)
2021-01-05 03:36:47 +0100 <sclv> If you are using any cabal 3 use the latest
2021-01-05 03:36:55 +0100 <ezzieyguywuf> ok
2021-01-05 03:37:04 +0100spopejoy(~stuart@ool-44c5f8c9.dyn.optonline.net)
2021-01-05 03:39:44 +0100ebsen(~ebsene@64-33-113-59-dynamic.midco.net)
2021-01-05 03:40:36 +0100ebsen(~ebsene@64-33-113-59-dynamic.midco.net) (Client Quit)
2021-01-05 03:43:37 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:f5f0:2361:9049:5ed2)
2021-01-05 03:43:47 +0100xff0x(~fox@2001:1a81:5271:e800:63d8:c69:6df1:58cb) (Ping timeout: 260 seconds)
2021-01-05 03:45:40 +0100xff0x(~fox@2001:1a81:52a7:8200:12ff:8333:fcb3:6365)
2021-01-05 03:48:34 +0100bollu5(~bollu@139.59.46.74)
2021-01-05 03:48:42 +0100jedws(~jedws@121.209.189.201)
2021-01-05 03:49:06 +0100Jd007(~Jd007@d154-5-83-24.bchsia.telus.net)
2021-01-05 03:49:21 +0100bollu(~bollu@139.59.46.74) (Quit: Ping timeout (120 seconds))
2021-01-05 03:49:22 +0100bollu5bollu
2021-01-05 03:49:28 +0100chenshen(~chenshen@2620:10d:c090:400::5:418a) (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
2021-01-05 03:51:44 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr) (Read error: Connection reset by peer)
2021-01-05 03:52:06 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr)
2021-01-05 03:52:14 +0100Aleksejs(~Aleksejs@haskell.lv) (Ping timeout: 260 seconds)
2021-01-05 03:52:24 +0100Aleksejs(~Aleksejs@haskell.lv)
2021-01-05 03:52:32 +0100geowiesnot(~user@i15-les02-ix2-87-89-181-157.sfr.lns.abo.bbox.fr) (Ping timeout: 265 seconds)
2021-01-05 03:52:49 +0100luigy(~luigy@104.236.106.229) (Ping timeout: 260 seconds)
2021-01-05 03:52:56 +0100luigy(~luigy@104.236.106.229)
2021-01-05 03:53:58 +0100nshepperd25(~nshepperd@li364-218.members.linode.com)
2021-01-05 03:53:59 +0100tureba(~tureba@tureba.org) (Ping timeout: 265 seconds)
2021-01-05 03:54:28 +0100crtschin(~crtschin@104.131.9.149) (Ping timeout: 265 seconds)
2021-01-05 03:54:34 +0100nshepperd2(~nshepperd@li364-218.members.linode.com) (Ping timeout: 260 seconds)
2021-01-05 03:54:34 +0100eldritch(~eldritch@unaffiliated/eldritch) (Ping timeout: 260 seconds)
2021-01-05 03:54:34 +0100sarahzrf(~sarahzrf_@sarahzrf.com) (Ping timeout: 260 seconds)
2021-01-05 03:54:34 +0100nshepperd25nshepperd2
2021-01-05 03:54:41 +0100crtschin(~crtschin@104.131.9.149)
2021-01-05 03:54:48 +0100 <sm[m]> the tightness of upper bounds is a tradeoff between:
2021-01-05 03:54:48 +0100 <sm[m]> avoiding compilation errors for installers (tight bounds)
2021-01-05 03:54:48 +0100 <sm[m]> avoiding failures to find an install plan for installers and support/release/revision tasks for you the maintainer (loose bounds)
2021-01-05 03:56:03 +0100 <sm[m]> a pragmatic compromise is to set tight upper bounds on deps which are likely to change their api soon, and loose/no upper bounds on core libs which are very unlikely to change
2021-01-05 03:56:30 +0100sarahzrf(~sarahzrf_@sarahzrf.com)
2021-01-05 03:56:32 +0100 <ezzieyguywuf> that seems reasonable
2021-01-05 03:56:42 +0100tureba(~tureba@tureba.org)
2021-01-05 03:56:52 +0100 <ezzieyguywuf> although if things are unlikely to change...what's the harm is setting the upper bound?
2021-01-05 03:57:40 +0100 <sm[m]> ezzieyguywuf: well, a package might not change it's existing API but it might still be making regular releases (adding or changing things that don't affect you)
2021-01-05 03:57:55 +0100 <sm[m]> eg you're using a tiny stable part of text, say
2021-01-05 03:58:22 +0100 <ezzieyguywuf> if the api doesn't change, then the upper bound should allow for these small changes, right?
2021-01-05 03:58:40 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 246 seconds)
2021-01-05 03:58:56 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 03:58:59 +0100 <sm[m]> sorry, if I speak more I'll get confused but I think you got it
2021-01-05 03:59:03 +0100eldritch(~eldritch@unaffiliated/eldritch)
2021-01-05 03:59:13 +0100 <sm[m]> dinnertime! o/
2021-01-05 03:59:22 +0100 <maerwald> ezzieyguywuf: that's the problem... PVP is still not enough, you still have to know the maintainers philosophy :p
2021-01-05 04:00:01 +0100 <ephemient> base bumps its version with every major GHC release, API compatible or not
2021-01-05 04:00:07 +0100 <ezzieyguywuf> maerwald: hah, but isn't PVP supposed to "fix" the "everyone has their own philosophy" thing?
2021-01-05 04:00:21 +0100 <ezzieyguywuf> hah, nvm
2021-01-05 04:00:22 +0100 <maerwald> ezzieyguywuf: yeah, assuming everyone understands it
2021-01-05 04:00:24 +0100ezzieyguywufthrows book away
2021-01-05 04:00:38 +0100ezzieyguywufpicks up sledgehammer
2021-01-05 04:00:57 +0100 <ephemient> also API stability in Haskell is surprisingly difficult
2021-01-05 04:01:33 +0100 <maerwald> here's what I think: go got it right in the early days, when tools and versioning was insuffiecent to accomodate API breakage
2021-01-05 04:01:48 +0100 <ezzieyguywuf> ephemient: do you care to expand upon that?
2021-01-05 04:01:56 +0100 <maerwald> the result was: ppl never broke API and would create a new package instead (didn't happen as often as you might think)
2021-01-05 04:02:10 +0100 <ezzieyguywuf> maerwald: how does go do it differently than cabal?
2021-01-05 04:02:19 +0100 <ezzieyguywuf> or...I guess s/cabal/haskell/
2021-01-05 04:02:21 +0100howdoi(uid224@gateway/web/irccloud.com/x-rxnglkkhuozkyxip) (Quit: Connection closed for inactivity)
2021-01-05 04:02:50 +0100 <maerwald> I don't know what they do today, but back then maintainers would reject most PRs that aren't API-backwards compatible, because of PTSD breaking someone elses code
2021-01-05 04:03:05 +0100 <ezzieyguywuf> i see
2021-01-05 04:03:22 +0100 <maerwald> now you give ppl semver and tools, they start to think breaking API is a good thing, just because your tools support it
2021-01-05 04:03:27 +0100 <ezzieyguywuf> Pretty Traumatizing Semantic Discovery
2021-01-05 04:03:38 +0100 <maerwald> Breaking API is *never* good, even if it's necessary
2021-01-05 04:04:19 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 04:04:35 +0100 <maerwald> you introduce bugs, work, confusion... but these days ppl don't consider it a trade-off anymore, it's just a version bump
2021-01-05 04:05:11 +0100 <ephemient> your module re-exports instances from modules you import. this forms part of your API surface whether you intend for it or not
2021-01-05 04:05:52 +0100 <ezzieyguywuf> why would you re-export them then? just let the user import from the other module
2021-01-05 04:06:05 +0100 <ephemient> you can't not export them
2021-01-05 04:06:14 +0100 <ezzieyguywuf> hm
2021-01-05 04:06:20 +0100 <ezzieyguywuf> I'm pretty new, so I only kind of get it
2021-01-05 04:06:22 +0100 <ephemient> that's just how Haskell modules work
2021-01-05 04:06:24 +0100urodna(~urodna@unaffiliated/urodna) (Quit: urodna)
2021-01-05 04:06:34 +0100 <ezzieyguywuf> regarding breaking API, I tend to agree with maerwald
2021-01-05 04:06:54 +0100plutoniix(~q@184.82.195.99)
2021-01-05 04:06:57 +0100xirhtogal(~lagothrix@unaffiliated/lagothrix)
2021-01-05 04:06:57 +0100lagothrixGuest4525
2021-01-05 04:06:57 +0100Guest4525(~lagothrix@unaffiliated/lagothrix) (Killed (orwell.freenode.net (Nickname regained by services)))
2021-01-05 04:06:57 +0100xirhtogallagothrix
2021-01-05 04:07:16 +0100 <ezzieyguywuf> but also, that's sort of why 0.1.0.0 exists, right? i.e. don't go to 0.2 until you know you have a stable(ish) api
2021-01-05 04:07:25 +0100 <maerwald> imagine gtk3 was just a version bump...
2021-01-05 04:07:26 +0100 <ezzieyguywuf> and then take your time and get to 1.0 and then be good
2021-01-05 04:07:36 +0100 <maerwald> no, instead it was a new package (goo)
2021-01-05 04:08:32 +0100 <maerwald> Now, there is still API breakage inside gtk3/gtk2, but that usually follows deprecation phases of 1year +
2021-01-05 04:08:43 +0100 <maerwald> haskellers have never heard of deprecation phases
2021-01-05 04:09:37 +0100 <boxscape> ezzieyguywuf one pretty important aspect of class instances is that your program only has access to one instance with a particular instance head (modulo overlapping instances) so for example only one Ord instance for Int, otherwise IntSets could break. So to ensure, all instances are automatically imported when you type any kind of import statement
2021-01-05 04:09:38 +0100 <boxscape> and automatically re-exported by any module
2021-01-05 04:10:03 +0100 <ezzieyguywuf> maerwald: I feel like I saw a youtube vid of some prominent haskell dude that was like "we just break API and people are like 'dang, this sucks. ok i fixed my thing' and move about their business"
2021-01-05 04:10:13 +0100 <boxscape> otherwise some module you import cold use one instance and you could import a different one from somewhere else
2021-01-05 04:10:17 +0100 <ezzieyguywuf> i.e. he was saying it's part of the ethos of haskell
2021-01-05 04:10:24 +0100 <maerwald> So the absence of tools dealing with API breakage improves maintainers awareness and cross-project communication. With PVP/semver, you don't have to think about your users. They'll be alright... probably
2021-01-05 04:10:26 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 04:13:22 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 04:13:44 +0100 <maerwald> different example: cli interfaces... you can't semver them (or version them at all sanely). So when was the last time curl broke a cli switch? It seems you don't need to break stuff all the time
2021-01-05 04:14:04 +0100adamwesp_(~adamwespi@107.181.19.30) (Ping timeout: 246 seconds)
2021-01-05 04:14:46 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 246 seconds)
2021-01-05 04:17:48 +0100drbean(~drbean@TC210-63-209-140.static.apol.com.tw)
2021-01-05 04:18:01 +0100andreas303(~andreas@gateway/tor-sasl/andreas303) (Remote host closed the connection)
2021-01-05 04:18:03 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 04:18:18 +0100YangM_Special1(b786c5b2@183.134.197.178)
2021-01-05 04:18:23 +0100 <justsomeguy> What do you think of the idea of the API informing it's consumers if there has been a change to its interface, some how?
2021-01-05 04:20:48 +0100 <maerwald> deprecation warnings do that
2021-01-05 04:21:13 +0100 <maerwald> but ofc that doesn't work for types you changed...
2021-01-05 04:21:15 +0100andreas303(~andreas@gateway/tor-sasl/andreas303)
2021-01-05 04:22:07 +0100thunderrd(~thunderrd@183.182.111.131)
2021-01-05 04:26:18 +0100 <maerwald> https://github.com/haskell/pvp/issues/10 may also be of interest
2021-01-05 04:26:36 +0100 <maerwald> But it's only getting more complicated, not less
2021-01-05 04:27:56 +0100 <maerwald> "and would have to introduce new names each time we want to change or introduce new semantics for existing entities. This tradeoff is obviously undesirable."
2021-01-05 04:28:09 +0100 <maerwald> and so this is what C does since 30+ years :D
2021-01-05 04:28:19 +0100 <maerwald> it isn't pretty, but does anyone care?
2021-01-05 04:28:43 +0100bitmagie(~Thunderbi@200116b806c8a5004c48e4557064fd0d.dip.versatel-1u1.de)
2021-01-05 04:29:15 +0100bitmagie(~Thunderbi@200116b806c8a5004c48e4557064fd0d.dip.versatel-1u1.de) (Client Quit)
2021-01-05 04:30:49 +0100chenshen(~chenshen@2620:10d:c090:400::5:418a)
2021-01-05 04:32:11 +0100 <maerwald> At this point we shouldn't express API in terms of versions anymore, but maybe a Tree
2021-01-05 04:32:29 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 04:34:29 +0100 <justsomeguy> That sounds interesting. A tree of what? Content addressable hashes of package build recipes or something?
2021-01-05 04:34:55 +0100 <maerwald> code entities... I dunno
2021-01-05 04:35:06 +0100 <maerwald> I'm just fantazising now
2021-01-05 04:35:27 +0100 <justsomeguy> Well, me too. I do like to think about it.
2021-01-05 04:35:36 +0100dmwit(~dmwit@pool-108-18-106-204.washdc.fios.verizon.net) (Ping timeout: 240 seconds)
2021-01-05 04:35:40 +0100 <maerwald> compare with swagger definitions
2021-01-05 04:35:51 +0100 <maerwald> it's pretty hard to diff two of them reasonably
2021-01-05 04:36:24 +0100 <maerwald> but that's actually useful and you could statically determine whether your own API broke
2021-01-05 04:36:42 +0100 <maerwald> *consumer API
2021-01-05 04:37:19 +0100 <maerwald> but you still can't automate *generation* of that completely, because of semantic changes of e.g. functions or instances
2021-01-05 04:37:40 +0100 <maerwald> so you now require ppl to write an API tree? :o
2021-01-05 04:37:44 +0100dmwit(~dmwit@pool-108-18-106-204.washdc.fios.verizon.net)
2021-01-05 04:37:48 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 272 seconds)
2021-01-05 04:37:55 +0100 <maerwald> we can't even manage version bumps
2021-01-05 04:38:02 +0100 <maerwald> gg
2021-01-05 04:38:56 +0100tama(~tama@unaffiliated/tama00) (Ping timeout: 240 seconds)
2021-01-05 04:39:50 +0100geowiesnot(~user@87-89-181-157.abo.bbox.fr)
2021-01-05 04:42:26 +0100bitmagie(~Thunderbi@200116b806c8a5004c48e4557064fd0d.dip.versatel-1u1.de)
2021-01-05 04:50:21 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 04:52:28 +0100 <siraben> Is abrar abbradar?
2021-01-05 04:52:37 +0100djellemah(~djellemah@2601:5c2:100:96c:e008:b638:39fe:6a54) (Ping timeout: 260 seconds)
2021-01-05 04:52:51 +0100 <siraben> I managed to build Caramia using your fork but haven't been able to get the demos to work, any pointers? https://github.com/abbradar/caramia/tree/master/demos
2021-01-05 04:53:55 +0100theDon(~td@94.134.91.22) (Ping timeout: 265 seconds)
2021-01-05 04:54:13 +0100cr3(~cr3@192-222-143-195.qc.cable.ebox.net) (Quit: leaving)
2021-01-05 04:55:36 +0100theDon(~td@94.134.91.206)
2021-01-05 04:57:49 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 246 seconds)
2021-01-05 05:03:02 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 05:03:12 +0100Shiranai(beed4728@gateway/web/cgi-irc/kiwiirc.com/ip.190.237.71.40)
2021-01-05 05:03:45 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 05:03:47 +0100 <Shiranai> hello, how would you write a function `longerThan :: [a] -> Int -> Bool` that checks if a given list is longer than a given int
2021-01-05 05:04:16 +0100 <Shiranai> the obvious way of using the length function and the comparing doesn't work because of infinite lists
2021-01-05 05:04:33 +0100dandels(~dandels@unaffiliated/dandels)
2021-01-05 05:05:02 +0100 <Shiranai> I think ideally I would like something like Prolog's cut, no idea if there's something like that here or maybe some different technique
2021-01-05 05:05:31 +0100drbean(~drbean@TC210-63-209-140.static.apol.com.tw) (Ping timeout: 265 seconds)
2021-01-05 05:06:04 +0100 <dsal> longerThan 0 _ = True; longerThan n [] = False; longerThan n (x:xs) = longerThan (n - 1) xs
2021-01-05 05:06:21 +0100 <dsal> something like that would be a good start, except I put the args the other way.
2021-01-05 05:06:56 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
2021-01-05 05:07:04 +0100 <guest15> dsal: how to get isNotSpace? by isSpace ?
2021-01-05 05:07:28 +0100 <dsal> Shiranai: it's off by one and stuff, but it works.
2021-01-05 05:07:33 +0100 <dsal> guest15: `not . isSpace` ?
2021-01-05 05:07:34 +0100 <guest15> filter (not isSpace) " 3" is not what I expect
2021-01-05 05:07:41 +0100Stanley00(~stanley00@unaffiliated/stanley00)
2021-01-05 05:07:42 +0100 <dsal> filter (not . isSpace)
2021-01-05 05:07:52 +0100 <dsal> > filter (not . isSpace) " 3"
2021-01-05 05:07:53 +0100 <guest15> dsal: ok
2021-01-05 05:07:54 +0100 <lambdabot> "3"
2021-01-05 05:08:27 +0100Rudd0(~Rudd0@185.189.115.108)
2021-01-05 05:08:34 +0100 <Shiranai> dsal: Thanks, why does it not end in an infinite loop? just from reading it I'd guess there would be an infinite loop of pattern matching
2021-01-05 05:08:42 +0100 <Shiranai> oh wait
2021-01-05 05:08:44 +0100 <Shiranai> nvm
2021-01-05 05:08:46 +0100 <Shiranai> got it, thanks
2021-01-05 05:09:34 +0100 <siraben> Shiranai: you always recurse on a "smaller" argument
2021-01-05 05:09:55 +0100 <dsal> > let longerThan n = not . null . drop n in longerThan 4 "hello"
2021-01-05 05:09:57 +0100 <lambdabot> True
2021-01-05 05:09:59 +0100 <dsal> > let longerThan n = not . null . drop n in longerThan 4 "hell"
2021-01-05 05:10:03 +0100 <lambdabot> False
2021-01-05 05:10:26 +0100 <boxscape> (note that dsal's function isn't quite right, it'll evaluate to True for `longerThan 0 []`, even though the empty list isn't longer than 0)
2021-01-05 05:10:38 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 05:10:41 +0100 <Maxdamantus> I don't think the "smaller argument" reasoning works there.
2021-01-05 05:10:54 +0100 <dsal> Yeah, I was surprised it scaled. The `not . null . drop` thing works, though.
2021-01-05 05:10:59 +0100 <Maxdamantus> oh, nvm, it does.
2021-01-05 05:11:03 +0100YangM_Special1(b786c5b2@183.134.197.178) (Remote host closed the connection)
2021-01-05 05:11:18 +0100 <Maxdamantus> referring to `x` becoming smaller, not `xs`
2021-01-05 05:11:27 +0100 <siraben> Maxdamantus: yes
2021-01-05 05:11:27 +0100 <dsal> er, scaled... I meant compiled. I should go to bed.
2021-01-05 05:11:53 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 05:12:24 +0100 <Shiranai> me too, and yeah I noticed it needs some tweaking but the general idea works, thanks again! cya
2021-01-05 05:12:32 +0100Shiranai(beed4728@gateway/web/cgi-irc/kiwiirc.com/ip.190.237.71.40) (Quit: Connection closed)
2021-01-05 05:12:51 +0100christo(~chris@81.96.113.213)
2021-01-05 05:16:24 +0100jedws(~jedws@121.209.189.201) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 05:17:41 +0100drbean(~drbean@TC210-63-209-187.static.apol.com.tw)
2021-01-05 05:19:34 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce) (Remote host closed the connection)
2021-01-05 05:21:30 +0100eacameron(uid256985@gateway/web/irccloud.com/x-ibwftunwaaouzfew) (Quit: Connection closed for inactivity)
2021-01-05 05:24:52 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 05:27:47 +0100Tops2(~Tobias@dyndsl-095-033-022-235.ewe-ip-backbone.de) (Read error: Connection reset by peer)
2021-01-05 05:32:07 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 246 seconds)
2021-01-05 05:32:37 +0100drbean(~drbean@TC210-63-209-187.static.apol.com.tw) (Ping timeout: 264 seconds)
2021-01-05 05:33:39 +0100drbean(~drbean@TC210-63-209-211.static.apol.com.tw)
2021-01-05 05:37:15 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce)
2021-01-05 05:38:38 +0100dftxbs3e(~dftxbs3e@unaffiliated/dftxbs3e) (Remote host closed the connection)
2021-01-05 05:40:19 +0100dftxbs3e(~dftxbs3e@unaffiliated/dftxbs3e)
2021-01-05 05:40:41 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Quit: Connection closed)
2021-01-05 05:41:43 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 05:43:22 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Ping timeout: 256 seconds)
2021-01-05 05:46:12 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 272 seconds)
2021-01-05 05:46:56 +0100StoneToad(~StoneToad@104-192-232-50.ppp.storm.ca) (Ping timeout: 240 seconds)
2021-01-05 05:47:55 +0100bitmagie1(~Thunderbi@200116b806f816004c48e4557064fd0d.dip.versatel-1u1.de)
2021-01-05 05:48:06 +0100 <guest15> xsperry: dsal I wrote this for remove spaces in string we talked about yesterday, https://paste.ubuntu.com/p/JcyvdX8m38/ is there any easy way to do this?
2021-01-05 05:48:34 +0100StoneToad(~StoneToad@104-192-232-50.ppp.storm.ca)
2021-01-05 05:48:38 +0100 <guest15> turn "{\"a\": \"b\", \"b\":[3, 2]}" to "{\"a\":\"b\",\"b\":[3,2]}"
2021-01-05 05:50:16 +0100bitmagie(~Thunderbi@200116b806c8a5004c48e4557064fd0d.dip.versatel-1u1.de) (Ping timeout: 268 seconds)
2021-01-05 05:50:16 +0100bitmagie1bitmagie
2021-01-05 05:51:43 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 05:51:59 +0100mizlan(~michaella@c-67-169-7-31.hsd1.ca.comcast.net)
2021-01-05 05:52:15 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr)
2021-01-05 05:53:07 +0100 <mizlan> how are some packages able to extend Prelude's modules, for example split extends Data.List.Split?
2021-01-05 05:53:27 +0100 <mizlan> or rather defines that module, but its still a sub-module? of Data.List
2021-01-05 05:54:13 +0100Tario(~Tario@201.192.165.173) (Ping timeout: 264 seconds)
2021-01-05 05:55:22 +0100 <boxscape> mizlan the common prefix is mostly for the benefit of the user, it doesn't really mean anything to ghc
2021-01-05 05:56:35 +0100 <boxscape> mizlan it does mean that they both have the same folder structure (i.e. the file Split.hs is in the folder Data/List), but it doesn't clash in any way
2021-01-05 05:56:54 +0100 <boxscape> s/folder/directory/g
2021-01-05 05:58:01 +0100 <mizlan> ah haha
2021-01-05 05:58:27 +0100 <mizlan> it makes it really confusing when distinguishing what is part of the "standard library" and what is an "external package" though imo
2021-01-05 05:58:37 +0100 <boxscape> that's fair
2021-01-05 05:58:56 +0100 <mizlan> thanks for answering, this is my first time ever using irc
2021-01-05 05:59:02 +0100 <boxscape> welcome :)
2021-01-05 05:59:14 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 06:01:00 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:f5f0:2361:9049:5ed2) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 06:01:50 +0100 <boxscape> mizlan to be clear it would be a different matter if they had literally the same module name, i.e. both defined a module named "Data.List". It's not impossible, since there's an extension that allows you to specify which package you want to import from in an import statement, but I've never seen it being used in practice, since module names don't
2021-01-05 06:01:51 +0100 <boxscape> tend to clash
2021-01-05 06:02:08 +0100 <mizlan> gotcha, thanks so much
2021-01-05 06:02:21 +0100 <mizlan> also why does it say theres like 1039 people when no one is talking
2021-01-05 06:02:37 +0100 <boxscape> lot of people just have the channel open constantly in the background
2021-01-05 06:03:16 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 240 seconds)
2021-01-05 06:03:20 +0100mizlan(~michaella@c-67-169-7-31.hsd1.ca.comcast.net) (Quit: leaving)
2021-01-05 06:03:21 +0100 <boxscape> and I think some tools that interface with IRC will keep you connected even when you're not using the tool (e.g. matrix, I think)
2021-01-05 06:04:45 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Quit: Connection closed)
2021-01-05 06:05:13 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 06:07:36 +0100dandels(~dandels@unaffiliated/dandels) (Ping timeout: 240 seconds)
2021-01-05 06:07:57 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:f5f0:2361:9049:5ed2)
2021-01-05 06:13:07 +0100nineonine(~nineonine@50.216.62.2) (Ping timeout: 260 seconds)
2021-01-05 06:13:49 +0100dandels(~dandels@unaffiliated/dandels)
2021-01-05 06:13:59 +0100zebrag(~inkbottle@aaubervilliers-654-1-100-102.w86-212.abo.wanadoo.fr) (Ping timeout: 260 seconds)
2021-01-05 06:14:11 +0100 <ephemient> you have to stay connected to see history in your IRC client (yeah, there's a bot that logs this channel, but then you have to open a browser separately)
2021-01-05 06:14:14 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 06:15:53 +0100jumper149(~jumper149@ip4d1622a9.dynamic.kabel-deutschland.de) (Quit: WeeChat 3.0)
2021-01-05 06:18:03 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 06:18:57 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 260 seconds)
2021-01-05 06:19:38 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 06:20:48 +0100nbloomf(~nbloomf@2600:1700:ad14:3020:f5f0:2361:9049:5ed2) (Remote host closed the connection)
2021-01-05 06:22:44 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Ping timeout: 260 seconds)
2021-01-05 06:24:41 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
2021-01-05 06:26:12 +0100Sheilong(uid293653@gateway/web/irccloud.com/x-qwdszzkqmmrcolkn) ()
2021-01-05 06:26:12 +0100oxide(~lambda@unaffiliated/mclaren)
2021-01-05 06:26:14 +0100bitmagie(~Thunderbi@200116b806f816004c48e4557064fd0d.dip.versatel-1u1.de) (Quit: bitmagie)
2021-01-05 06:27:11 +0100chenshen(~chenshen@2620:10d:c090:400::5:418a) (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
2021-01-05 06:27:24 +0100bgamari_(~bgamari@72.65.102.219) (Ping timeout: 258 seconds)
2021-01-05 06:28:11 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 06:28:38 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 06:28:42 +0100drbean(~drbean@TC210-63-209-211.static.apol.com.tw) (Ping timeout: 256 seconds)
2021-01-05 06:29:49 +0100dansho(~dansho@ec2-52-197-253-200.ap-northeast-1.compute.amazonaws.com)
2021-01-05 06:31:41 +0100jedws(~jedws@121.209.189.201)
2021-01-05 06:37:18 +0100erickLan(~quassel@201.108.251.199)
2021-01-05 06:38:25 +0100bitmagie(~Thunderbi@200116b806f816004c48e4557064fd0d.dip.versatel-1u1.de)
2021-01-05 06:39:51 +0100jitwit(~user@bras-base-mtrlpq4381w-grc-34-174-93-238-71.dsl.bell.ca) (Remote host closed the connection)
2021-01-05 06:40:13 +0100jitwit(~user@bras-base-mtrlpq4381w-grc-34-174-93-238-71.dsl.bell.ca)
2021-01-05 06:43:14 +0100 <ezzieyguywuf> how do you all use ghcid with a project that has different components, and each one has its own test suite?
2021-01-05 06:44:00 +0100chenshen(~chenshen@2620:10d:c090:400::5:418a)
2021-01-05 06:45:20 +0100 <ezzieyguywuf> hah, hey look at that, sm[m] is famous (to me): https://www.reddit.com/r/haskell/comments/djbo40/ghcid_for_multi_project_builds/f4nei9m/
2021-01-05 06:45:28 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com)
2021-01-05 06:45:56 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299) (Remote host closed the connection)
2021-01-05 06:46:21 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com) (Client Quit)
2021-01-05 06:46:45 +0100drbean(~drbean@TC210-63-209-35.static.apol.com.tw)
2021-01-05 06:59:00 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 06:59:25 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 06:59:41 +0100Jd007(~Jd007@d154-5-83-24.bchsia.telus.net) (Quit: Jd007)
2021-01-05 07:00:03 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 07:01:21 +0100Wuzzy(~Wuzzy@p5790e09a.dip0.t-ipconnect.de) (Quit: Wuzzy)
2021-01-05 07:01:33 +0100Varis(~Tadas@unaffiliated/varis)
2021-01-05 07:04:01 +0100erickLan(~quassel@201.108.251.199) (Remote host closed the connection)
2021-01-05 07:09:25 +0100geowiesnot(~user@87-89-181-157.abo.bbox.fr) (Ping timeout: 240 seconds)
2021-01-05 07:12:32 +0100knupfer(~Thunderbi@i59F7FF49.versanet.de)
2021-01-05 07:21:58 +0100geowiesnot(~user@87-89-181-157.abo.bbox.fr)
2021-01-05 07:22:44 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce) (Remote host closed the connection)
2021-01-05 07:25:04 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce)
2021-01-05 07:25:24 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2021-01-05 07:25:51 +0100orhan89(~orhan89@151.91.188.35.bc.googleusercontent.com)
2021-01-05 07:33:13 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 264 seconds)
2021-01-05 07:35:52 +0100abhixec_(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 07:38:02 +0100noecho(~noecho@2a01:4f8:1c0c:80ee::4223) (Quit: ZNC - http://znc.in)
2021-01-05 07:38:32 +0100noecho(~noecho@2a01:4f8:1c0c:80ee::4223)
2021-01-05 07:39:23 +0100jedws(~jedws@121.209.189.201) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 07:39:53 +0100abhixec_(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 07:50:12 +0100texasmynsted(~texasmyns@99.96.221.112)
2021-01-05 07:52:25 +0100machinedgod(~machinedg@135-23-192-217.cpe.pppoe.ca) (Ping timeout: 264 seconds)
2021-01-05 07:55:45 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Quit: Connection closed)
2021-01-05 07:56:18 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 07:57:24 +0100 <dsal> guest15: it'd probably be easier not to do that as a parser.
2021-01-05 07:57:34 +0100 <dsal> I don't understand the full scope, though.
2021-01-05 07:59:19 +0100phasespace(~sar@89-162-33-21.fiber.signal.no) (Ping timeout: 256 seconds)
2021-01-05 07:59:23 +0100olligobber(olligobber@gateway/vpn/privateinternetaccess/olligobber)
2021-01-05 08:00:25 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 08:02:57 +0100bitmagie(~Thunderbi@200116b806f816004c48e4557064fd0d.dip.versatel-1u1.de) (Quit: bitmagie)
2021-01-05 08:04:32 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2021-01-05 08:05:36 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 08:05:45 +0100 <dansho> how can i measure the run time? at the bottom it says 'absolute running time: 2.18 sec', but the timer only counts 0.0001221s https://rextester.com/NBI81550
2021-01-05 08:05:56 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 268 seconds)
2021-01-05 08:06:02 +0100spopejoy(~stuart@ool-44c5f8c9.dyn.optonline.net) (Quit: spopejoy)
2021-01-05 08:07:25 +0100emptyflask(~jon@66.64.40.21) (Ping timeout: 264 seconds)
2021-01-05 08:08:24 +0100mozzarella(~sam@unaffiliated/sam113101) (Read error: Connection reset by peer)
2021-01-05 08:13:20 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 08:14:27 +0100 <siraben> How do I send an email programmatically using Haskell?
2021-01-05 08:15:25 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 08:16:44 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 08:19:43 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 258 seconds)
2021-01-05 08:20:28 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 08:20:51 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 08:24:37 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2021-01-05 08:25:58 +0100cole-h(~cole-h@c-73-48-197-220.hsd1.ca.comcast.net)
2021-01-05 08:28:03 +0100_ht(~quassel@82-169-194-8.biz.kpn.net)
2021-01-05 08:29:23 +0100sfvm(~sfvm@37.228.215.77) (Remote host closed the connection)
2021-01-05 08:32:03 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Ping timeout: 240 seconds)
2021-01-05 08:32:18 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 08:33:07 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 08:34:34 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2021-01-05 08:38:37 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 08:39:20 +0100phasespace(~sar@80-89-47-117.inet.signal.no)
2021-01-05 08:39:24 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Quit: Connection closed)
2021-01-05 08:40:02 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 08:40:11 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 256 seconds)
2021-01-05 08:40:20 +0100berberman_(~berberman@unaffiliated/berberman)
2021-01-05 08:40:54 +0100mozzarella(~sam@unaffiliated/sam113101)
2021-01-05 08:41:05 +0100berberman(~berberman@unaffiliated/berberman) (Ping timeout: 268 seconds)
2021-01-05 08:41:36 +0100berberman_(~berberman@unaffiliated/berberman) (Max SendQ exceeded)
2021-01-05 08:42:04 +0100berberman(~berberman@unaffiliated/berberman)
2021-01-05 08:43:15 +0100berberman(~berberman@unaffiliated/berberman) (Max SendQ exceeded)
2021-01-05 08:43:40 +0100berberman(~berberman@unaffiliated/berberman)
2021-01-05 08:45:08 +0100berberman(~berberman@unaffiliated/berberman) (Max SendQ exceeded)
2021-01-05 08:45:42 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 08:46:04 +0100berberman(~berberman@unaffiliated/berberman)
2021-01-05 08:46:59 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 08:47:19 +0100berberman(~berberman@unaffiliated/berberman) (Max SendQ exceeded)
2021-01-05 08:47:20 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Ping timeout: 272 seconds)
2021-01-05 08:47:45 +0100berberman(~berberman@unaffiliated/berberman)
2021-01-05 08:50:18 +0100 <[exa]> siraben: there is a sendmail wrapper that's pretty easy to use
2021-01-05 08:50:41 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 08:51:02 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Remote host closed the connection)
2021-01-05 08:51:15 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 08:51:44 +0100 <[exa]> siraben: e.g. you can use Network.Mail.Mime to "assemble" the e-mail message and Network.Mail.SMTP to submit it to a MTA
2021-01-05 08:52:50 +0100 <[exa]> (btw, highly recommend using just the `sendmail` interface, and letting the MTA do as much of the networking part as possible)
2021-01-05 08:57:25 +0100Entertainment(~entertain@104.246.132.210) (Ping timeout: 240 seconds)
2021-01-05 08:59:22 +0100 <siraben> [exa]: I see, thanks
2021-01-05 09:00:45 +0100rmk236(~lcampos@ip-37-201-210-153.hsi13.unitymediagroup.de)
2021-01-05 09:01:23 +0100drbean(~drbean@TC210-63-209-35.static.apol.com.tw) (Ping timeout: 265 seconds)
2021-01-05 09:04:19 +0100 <[exa]> btw there are minor "fun" parts in sending the mail properly, like sorting out the Reply-To:, envelope MAIL FROM and From fields, and the same for the recipient list that may be completely different than RCPT TO :]
2021-01-05 09:05:16 +0100rmk236(~lcampos@ip-37-201-210-153.hsi13.unitymediagroup.de) (Ping timeout: 246 seconds)
2021-01-05 09:09:45 +0100rmk236(~lcampos@2a02:908:3616:b100:ad41:f5e6:8b3a:bfc3)
2021-01-05 09:11:21 +0100dave_uy(~david@108.61.193.26) (Ping timeout: 256 seconds)
2021-01-05 09:12:32 +0100dequbed_dequbed
2021-01-05 09:12:59 +0100byorgey(~byorgey@155.138.238.211) (Ping timeout: 265 seconds)
2021-01-05 09:13:05 +0100bcmiller(~bm3719@66.42.95.185) (Ping timeout: 240 seconds)
2021-01-05 09:18:02 +0100Sgeo(~Sgeo@ool-18b98aa4.dyn.optonline.net) (Read error: Connection reset by peer)
2021-01-05 09:18:37 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Quit: Ping timeout (120 seconds))
2021-01-05 09:18:56 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:20:20 +0100jedws(~jedws@121.209.189.201)
2021-01-05 09:21:59 +0100bitmagie(~Thunderbi@200116b806f816000808b81f8138d763.dip.versatel-1u1.de)
2021-01-05 09:22:24 +0100dave_uy(~david@108.61.193.26)
2021-01-05 09:24:30 +0100byorgey(~byorgey@155.138.238.211)
2021-01-05 09:26:26 +0100michalz(~user@185.246.204.86)
2021-01-05 09:27:47 +0100 <maerwald> mail sending is one of those things you don't want to actually understand :) ...I'd just shell out to something
2021-01-05 09:28:41 +0100 <maerwald> [exa]: https://hub.darcs.net/simon/darcsden/browse/src/DarcsDen/Mail.hs here's an example
2021-01-05 09:29:06 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Quit: Ping timeout (120 seconds))
2021-01-05 09:29:08 +0100 <c_wraith> If you want to deliver mail to anything other than your own mail server, I'd give up on running your own MTA anyway.
2021-01-05 09:29:52 +0100 <c_wraith> the whole ecosystem is far too complex, and all the large providers are aggressive about blackholing unknown senders.
2021-01-05 09:29:58 +0100bcmiller(~bm3719@66.42.95.185)
2021-01-05 09:30:09 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:30:20 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 09:30:39 +0100 <koz_> I'd agree with c_wraith, as someone whose email is with a minor provider.
2021-01-05 09:30:59 +0100 <koz_> The number of times I've had people have to excavate my emails out of their spam because, you know, exactly this?
2021-01-05 09:31:43 +0100 <dequbed> It *is* possible but then you're looking at setting up SPF records, DKIM signing, tarpit handling, basically re-implementing a MTA.
2021-01-05 09:32:49 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 09:33:13 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:33:30 +0100bitmagie(~Thunderbi@200116b806f816000808b81f8138d763.dip.versatel-1u1.de) (Quit: bitmagie)
2021-01-05 09:34:34 +0100 <[exa]> maerwald: "you don't actually want to understand" -- I admined MTAs for like 8 years, that's why I recommend just piping to sendmail. :D
2021-01-05 09:34:34 +0100Gurkenglas(~Gurkengla@unaffiliated/gurkenglas)
2021-01-05 09:36:09 +0100 <[exa]> c_wraith: anyway you don't need to run a whole MTA, but you usually want some simple thing to at least retry sending the mail to the actual "smarthost" MTA when there's a network error or something
2021-01-05 09:36:57 +0100 <[exa]> I usually have a tiny exim that reliably sends all mail using a google SMTP or so
2021-01-05 09:37:17 +0100 <maerwald> I wrote my BA about extending SMTP with anonymizing techniques. Not really something serious, more like a pre-pre-pre draft and implemented in some javascript MTA.
2021-01-05 09:37:26 +0100 <maerwald> glad I never have to look at any of that stuff again
2021-01-05 09:37:28 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 09:37:47 +0100 <dequbed> maerwald: What do you mean? UTF-7 is *fun* :P
2021-01-05 09:37:54 +0100 <[exa]> yeah mail processing is a problem
2021-01-05 09:38:24 +0100 <maerwald> the only reasonable way forward at that time was DarkMail afair, but you can't just replace email
2021-01-05 09:38:26 +0100 <[exa]> also it's usually much easier to configure the outgoing SMTP stuff in the actual MTA than in haskell :]
2021-01-05 09:39:00 +0100 <maerwald> software is like plastique in the ocean... the more trash you throw in, the more ppl will get it (or something)
2021-01-05 09:39:34 +0100 <[exa]> lol
2021-01-05 09:39:47 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Quit: mputz)
2021-01-05 09:39:51 +0100 <koz_> maerwald: Please don't throw high-grade explosives in the ocean.
2021-01-05 09:39:55 +0100 <koz_> Think of the fish.
2021-01-05 09:40:35 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:42:05 +0100gehmehgeh(~ircuser1@gateway/tor-sasl/gehmehgeh)
2021-01-05 09:42:43 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 09:44:18 +0100 <idnar> plastic is probably more harmful than plastique as far as oceans go
2021-01-05 09:44:53 +0100jmchael(~jmchael@81.174.205.210)
2021-01-05 09:45:07 +0100 <koz_> idnar: Probably.
2021-01-05 09:45:20 +0100 <koz_> But I still wouldn't recommend chucking high-grade explosives... anywhere?
2021-01-05 09:45:42 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:47:43 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 09:48:16 +0100kyali_(~kyali@APN-123-249-162-gprs.simobil.net) (Ping timeout: 265 seconds)
2021-01-05 09:48:16 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
2021-01-05 09:48:31 +0100kyali(~kyali@APN-123-249-162-gprs.simobil.net)
2021-01-05 09:48:45 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:50:07 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 09:50:50 +0100christo(~chris@81.96.113.213)
2021-01-05 09:51:28 +0100dave_uy(~david@108.61.193.26) (Ping timeout: 246 seconds)
2021-01-05 09:51:47 +0100kritzefitz(~kritzefit@p548c9398.dip0.t-ipconnect.de)
2021-01-05 09:53:26 +0100bcmiller(~bm3719@66.42.95.185) (Ping timeout: 264 seconds)
2021-01-05 09:53:37 +0100byorgey(~byorgey@155.138.238.211) (Ping timeout: 264 seconds)
2021-01-05 09:53:37 +0100knupfer(~Thunderbi@i59F7FF49.versanet.de) (Ping timeout: 264 seconds)
2021-01-05 09:54:11 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Quit: Ping timeout (120 seconds))
2021-01-05 09:54:29 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net)
2021-01-05 09:54:34 +0100graf_blutwurst(~user@2001:171b:226e:adc0:fdb7:5f6d:f86b:a30e)
2021-01-05 09:55:39 +0100christo(~chris@81.96.113.213) (Ping timeout: 260 seconds)
2021-01-05 09:56:30 +0100lordyod(~lordyod@c-67-169-144-132.hsd1.ca.comcast.net) (Client Quit)
2021-01-05 09:58:53 +0100dave_uy(~david@108.61.193.26)
2021-01-05 10:00:02 +0100byorgey(~byorgey@155.138.238.211)
2021-01-05 10:01:24 +0100Forlorn(~Forlorn@unaffiliated/forlorn) (Remote host closed the connection)
2021-01-05 10:02:13 +0100heatsink_(~heatsink@2600:1700:bef1:5e10:90f:3153:5839:80c4)
2021-01-05 10:05:28 +0100kritzefitz(~kritzefit@p548c9398.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2021-01-05 10:05:48 +0100kritzefitz(~kritzefit@2003:5b:203b:200::10:49)
2021-01-05 10:06:02 +0100heatsink(~heatsink@2600:1700:bef1:5e10:f187:6a02:e58f:90ce) (Ping timeout: 264 seconds)
2021-01-05 10:07:19 +0100nineonine(~nineonine@50.216.62.2) (Ping timeout: 260 seconds)
2021-01-05 10:10:25 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 10:10:57 +0100bcmiller(~bm3719@66.42.95.185)
2021-01-05 10:11:06 +0100christo(~chris@81.96.113.213)
2021-01-05 10:14:37 +0100dandels(~dandels@unaffiliated/dandels) (Ping timeout: 264 seconds)
2021-01-05 10:14:38 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 10:15:15 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 10:15:37 +0100nineonine(~nineonine@50.216.62.2) (Ping timeout: 246 seconds)
2021-01-05 10:15:51 +0100ph88(~ph88@2a02:8109:9e00:7e5c:3831:a625:e216:5736)
2021-01-05 10:19:24 +0100pera(~pera@unaffiliated/pera)
2021-01-05 10:20:08 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 10:20:27 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 10:21:21 +0100kuribas(~user@ptr-25vy0i92z2b7cinncha.18120a2.ip6.access.telenet.be)
2021-01-05 10:24:48 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Ping timeout: 260 seconds)
2021-01-05 10:25:45 +0100dhouthoo(~dhouthoo@ptr-eitgbj2w0uu6delkbrh.18120a2.ip6.access.telenet.be)
2021-01-05 10:26:01 +0100geowiesnot(~user@87-89-181-157.abo.bbox.fr) (Ping timeout: 264 seconds)
2021-01-05 10:26:41 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Remote host closed the connection)
2021-01-05 10:27:16 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 10:31:48 +0100wei2912(~wei2912@unaffiliated/wei2912) (Remote host closed the connection)
2021-01-05 10:32:01 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 264 seconds)
2021-01-05 10:32:19 +0100hnOsmium0001(uid453710@gateway/web/irccloud.com/x-flibwgaldygamqxl) (Quit: Connection closed for inactivity)
2021-01-05 10:34:40 +0100LKoen(~LKoen@174.175.9.109.rev.sfr.net)
2021-01-05 10:35:40 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net)
2021-01-05 10:36:09 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 10:38:53 +0100Tuplanolla(~Tuplanoll@91-159-68-239.elisa-laajakaista.fi)
2021-01-05 10:38:57 +0100chele(~chele@ip5b40237d.dynamic.kabel-deutschland.de)
2021-01-05 10:41:01 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 264 seconds)
2021-01-05 10:42:30 +0100 <merijn> maerwald: The more I understand mail sending, the more I'm happy to pay someone to host my email for me ;)
2021-01-05 10:43:30 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 10:45:49 +0100cole-h(~cole-h@c-73-48-197-220.hsd1.ca.comcast.net) (Ping timeout: 264 seconds)
2021-01-05 10:46:38 +0100xelxebar_(~xelxebar@gateway/tor-sasl/xelxebar)
2021-01-05 10:46:43 +0100xelxebar(~xelxebar@gateway/tor-sasl/xelxebar) (Ping timeout: 240 seconds)
2021-01-05 10:48:36 +0100nineonine(~nineonine@50.216.62.2) (Ping timeout: 240 seconds)
2021-01-05 10:49:18 +0100delinka(~delinka@217.146.82.202) (Ping timeout: 256 seconds)
2021-01-05 10:56:17 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 10:57:08 +0100ggVGcreju_ice
2021-01-05 10:58:23 +0100coot(~coot@37.30.55.141.nat.umts.dynamic.t-mobile.pl)
2021-01-05 10:58:32 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 11:00:15 +0100tomboy64(~tomboy64@gateway/tor-sasl/tomboy64) (Remote host closed the connection)
2021-01-05 11:00:47 +0100tomboy64(~tomboy64@gateway/tor-sasl/tomboy64)
2021-01-05 11:01:21 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 11:02:54 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 256 seconds)
2021-01-05 11:06:23 +0100philopsos(~caecilius@gateway/tor-sasl/caecilius) (Ping timeout: 240 seconds)
2021-01-05 11:06:26 +0100dansho(~dansho@ec2-52-197-253-200.ap-northeast-1.compute.amazonaws.com) (Remote host closed the connection)
2021-01-05 11:06:27 +0100dhil(~dhil@78.156.97.38)
2021-01-05 11:07:01 +0100 <kritzefitz> merijn, I never quite understood why so many people find email so complicated to host themselves, but I work with email at my dayjob, so I might be a bit biased.
2021-01-05 11:07:57 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 11:08:16 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 11:09:52 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 11:10:42 +0100EricFisher(~EricFishe@185.163.110.125)
2021-01-05 11:12:20 +0100heatsink_(~heatsink@2600:1700:bef1:5e10:90f:3153:5839:80c4) (Remote host closed the connection)
2021-01-05 11:12:38 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Ping timeout: 260 seconds)
2021-01-05 11:14:37 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Ping timeout: 264 seconds)
2021-01-05 11:18:37 +0100oxide(~lambda@unaffiliated/mclaren) (Ping timeout: 246 seconds)
2021-01-05 11:19:24 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 11:20:36 +0100oxide(~lambda@unaffiliated/mclaren)
2021-01-05 11:20:36 +0100guest15(~user@49.5.6.87) (Read error: Connection reset by peer)
2021-01-05 11:20:48 +0100guest15(~user@49.5.6.87)
2021-01-05 11:21:14 +0100fendor(~fendor@178.115.131.182.wireless.dyn.drei.com)
2021-01-05 11:22:52 +0100tasuki(~tasuki@198.211.120.27) (Ping timeout: 260 seconds)
2021-01-05 11:26:07 +0100qwerty(~tema@217.118.92.215)
2021-01-05 11:27:43 +0100thc202(~thc202@unaffiliated/thc202)
2021-01-05 11:29:13 +0100qwerty(~tema@217.118.92.215) (Client Quit)
2021-01-05 11:29:36 +0100crblmr(~carbolyme@137.117.174.36) (Ping timeout: 240 seconds)
2021-01-05 11:31:01 +0100crblmr(~carbolyme@matrix.dropacid.net)
2021-01-05 11:31:12 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003) (Read error: Connection reset by peer)
2021-01-05 11:32:18 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 11:32:33 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 11:32:39 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003)
2021-01-05 11:33:16 +0100theorbtwo(~theorb@cpc81822-swin19-2-0-cust3.3-1.cable.virginm.net) (Ping timeout: 272 seconds)
2021-01-05 11:34:47 +0100 <kuribas> Every time I think about how you would implement something in clojure or java, I find that I can do the same thing in haskell.
2021-01-05 11:35:17 +0100 <kuribas> The reason for making things type safe, purely functional, etc... seems to be not the language, but the programmers choice.
2021-01-05 11:35:44 +0100 <kuribas> Java style, you could just use a MVar or IORef, then mutate some structure everytime.
2021-01-05 11:35:56 +0100 <kuribas> Clojure style is to leave a lot of functions partial.
2021-01-05 11:36:14 +0100__monty__(~toonn@unaffiliated/toonn)
2021-01-05 11:36:52 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Ping timeout: 260 seconds)
2021-01-05 11:37:47 +0100tomsmeding(~tomsmedin@tomsmeding.com) (Quit: ZNC 1.8.2 - https://znc.in)
2021-01-05 11:37:55 +0100 <kuribas> I just think "static types force you to program in one style" is positively false.
2021-01-05 11:39:26 +0100 <boxscape> is that something that proponents or opponents of static types say?
2021-01-05 11:40:09 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 11:40:47 +0100 <kuribas> it's what I hear my colleage say...
2021-01-05 11:41:00 +0100 <kuribas> and what usually proponents say.
2021-01-05 11:41:29 +0100 <kuribas> erm I mean opponents
2021-01-05 11:43:25 +0100 <boxscape> I suppose the "dynamically typed languages are just statically typed languages with one type" thing also suggests that static types don't prevent you from being able to do anything you could do without them
2021-01-05 11:43:33 +0100 <boxscape> (though there are edge cases)
2021-01-05 11:44:56 +0100st8less(~st8less@inet-167-224-197-181.isp.ozarksgo.net) (Quit: WeeChat 2.9)
2021-01-05 11:45:50 +0100 <lortabac> the thing is, each language "pushes" you toward a certain style
2021-01-05 11:46:08 +0100graf_blutwurst(~user@2001:171b:226e:adc0:fdb7:5f6d:f86b:a30e) (Read error: Connection reset by peer)
2021-01-05 11:46:18 +0100 <lortabac> if you go against a language's paradigm you may end up suffering a lot
2021-01-05 11:46:19 +0100 <kritzefitz> But dynamic languages usually have more comfortable syntax than other language constructs for dealing with dynamic types.
2021-01-05 11:46:34 +0100graf_blutwurst(~user@2001:171b:226e:adc0:fdb7:5f6d:f86b:a30e)
2021-01-05 11:47:05 +0100 <kuribas> lortabac: true, but sometimes you can learn from other approaches.
2021-01-05 11:47:08 +0100reju_iceggVGc
2021-01-05 11:47:40 +0100Melanie(~Melanie@192-0-134-138.cpe.teksavvy.com) (Ping timeout: 256 seconds)
2021-01-05 11:47:55 +0100 <kuribas> I'd say clojure programmers should be more concerned about validation, modeling types, and haskell programmers about making things simple and expressive, rather than 100% type safe.
2021-01-05 11:48:49 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 11:52:51 +0100chenshen(~chenshen@2620:10d:c090:400::5:418a) (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
2021-01-05 11:53:00 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 11:53:29 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 260 seconds)
2021-01-05 11:53:57 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003) (Read error: Connection reset by peer)
2021-01-05 11:55:24 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003)
2021-01-05 11:57:51 +0100 <lortabac> I think the fact that Haskell does so many things at library level makes some simple tasks more difficult compared to other languages with more built-in functionalities
2021-01-05 11:58:46 +0100 <lortabac> at the same time, this is probably one of the reasons why Haskell is still relevant >30 years after its conception
2021-01-05 11:59:58 +0100 <lortabac> not relying too much on built-in functionality makes it more flexible than other languages
2021-01-05 12:00:10 +0100adamwespiser(~adamwespi@209.6.43.158)
2021-01-05 12:00:26 +0100 <kuribas> still, haskell is bigger than say scheme...
2021-01-05 12:00:46 +0100adamwesp_(~adamwespi@107.181.19.30)
2021-01-05 12:01:40 +0100 <kuribas> With extensions haskell is probably even bigger than java.
2021-01-05 12:01:57 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 12:02:23 +0100 <lortabac> yes, but most of its extensions are about advanced stuff, it doesn't have for ex. a built-in unit test framework or JSON parser
2021-01-05 12:03:04 +0100 <kuribas> which languages have those?
2021-01-05 12:03:18 +0100 <kritzefitz> e.g. python
2021-01-05 12:03:26 +0100 <lortabac> JSON is built-in in PHP and JavaScript
2021-01-05 12:03:37 +0100 <kuribas> python just has a huge standard library
2021-01-05 12:03:38 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 12:04:12 +0100 <kuribas> well JSON is basically javascript, so that's an unfair comparison :-)
2021-01-05 12:04:28 +0100adamwespiser(~adamwespi@209.6.43.158) (Ping timeout: 246 seconds)
2021-01-05 12:04:35 +0100 <kritzefitz> I don't think I understand what you mean by “bigger”.
2021-01-05 12:04:36 +0100 <kuribas> that's like saying, LISP has builtin SEXP parsing.
2021-01-05 12:05:10 +0100 <kuribas> kritzefitz: I mean stuff that needs to be implemented in the compiler, instead of a (standard) library.
2021-01-05 12:05:29 +0100 <lortabac> SWI Prolog has a command in the REPL that saves your queries in a file as unit tests, that would be a great thing to have
2021-01-05 12:05:45 +0100 <lortabac> writing tests involves so much boilerplate
2021-01-05 12:06:03 +0100 <lortabac> that's the kind of things I was thinking of
2021-01-05 12:07:04 +0100 <lortabac> node.js has a built-in HTTP server, that's another example
2021-01-05 12:07:57 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Read error: Connection reset by peer)
2021-01-05 12:08:01 +0100so(~so@unaffiliated/so) (Ping timeout: 264 seconds)
2021-01-05 12:08:26 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 12:09:23 +0100 <__monty__> kuribas: Hmm, surely some of GHC's extensions could be implemented by libraries using TH?
2021-01-05 12:09:25 +0100 <kritzefitz> This doesn't seem like a useful measurement of usefulness to the programmer to me. Why should I care if some feature is implemented in the compiler or as a library? In the end I probably just care if and how I can use it.
2021-01-05 12:09:31 +0100 <kuribas> I find writing tests in haskell is OK.
2021-01-05 12:10:01 +0100 <kuribas> kritzefitz: because the more custom syntax, the harder it's to learn.
2021-01-05 12:12:35 +0100 <kuribas> While for library you can just look at the types and documentation.
2021-01-05 12:12:38 +0100 <kritzefitz> I'm not sure that's necessarily true. Sure, if the syntax is just necessary to appease some language-specific paradigm, its not useful that I have to learn it. But if the custom syntax helps me to more efficiently solve some problem I already had independently of syntax, then learning the syntax and solving the problem might be easier in combination than just learning standard syntax and learning a library that solves my problem.
2021-01-05 12:13:10 +0100 <kuribas> also syntax tends to compose badly.
2021-01-05 12:13:24 +0100heatsink(~heatsink@107-136-5-69.lightspeed.sntcca.sbcglobal.net)
2021-01-05 12:13:27 +0100 <kuribas> Which is why lenses are so much supperior to record syntax in other languages.
2021-01-05 12:13:47 +0100rayyyy(~nanoz@gateway/tor-sasl/nanoz)
2021-01-05 12:13:50 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003) (Read error: Connection reset by peer)
2021-01-05 12:13:51 +0100 <kuribas> lenses solve the problem of bad record syntax, but bring in so many more goodies.
2021-01-05 12:13:56 +0100shf(~sheaf@2a01:cb19:80cc:7e00:d481:af4c:bf9f:f9c) (Read error: Connection reset by peer)
2021-01-05 12:14:40 +0100 <kritzefitz> Sure, but I found them harder to learn than record syntax in other languages and I have forgotten the specifics every time I use them.
2021-01-05 12:16:20 +0100 <kuribas> For example bash does a lot of functionality using syntax, but I find it hard to remember and parse.
2021-01-05 12:16:25 +0100jedws(~jedws@121.209.189.201) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 12:16:28 +0100beaky(~beaky@2a03:b0c0:0:1010::17cf:7003)
2021-01-05 12:16:33 +0100 <kuribas> In comparison to a well named function for example.
2021-01-05 12:17:08 +0100 <maerwald> bash is such unix: uncomprehensible army swiss knife mess
2021-01-05 12:17:36 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 12:17:36 +0100heatsink(~heatsink@107-136-5-69.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds)
2021-01-05 12:17:41 +0100 <gentauro> hmmm, so I'm generating F# code (based on a `domain`) with Haskell. It seems that 12.000 lines of code (mostly sum/records) is to much for Visual Studio to digest. Is there something that makes this "not performant" in FP languages or is it just that F# and it's ecosystem is "that good"?
2021-01-05 12:17:55 +0100 <kuribas> in the same way I prefer lens functions over lens operators
2021-01-05 12:17:56 +0100so(~so@unaffiliated/so)
2021-01-05 12:18:09 +0100 <gentauro> what if I generated Haskell code instead of F#, would that be a problem for example `emacs + LSP`?
2021-01-05 12:18:12 +0100tasuki(~tasuki@198.211.120.27)
2021-01-05 12:18:34 +0100 <kuribas> gentauro: emacs has a problem with long lines
2021-01-05 12:18:45 +0100 <kuribas> and LSP sucks in emacs
2021-01-05 12:18:50 +0100gentauroI think I understand why the F# peeps went with Type Providers …
2021-01-05 12:19:04 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 12:19:14 +0100 <kuribas> yeah, I don't see why type providers are so great.
2021-01-05 12:19:14 +0100drbean(~drbean@TC210-63-209-199.static.apol.com.tw)
2021-01-05 12:19:17 +0100 <gentauro> kuribas: that's true (mostly for the terminal version)
2021-01-05 12:19:39 +0100 <gentauro> kuribas: they aren't. They generate F# classes (not records)
2021-01-05 12:20:00 +0100 <gentauro> so they introduce OO to your code-base which is far from what you want
2021-01-05 12:20:20 +0100 <kritzefitz> kuribas, sure, I also find many of bash's features confusing just as I find obscure syntax in syntax-heavy languages like perl confusing. But for features I use often enough to always remember their semantics, I find custom syntax really useful.
2021-01-05 12:21:30 +0100 <kritzefitz> And I think this is not a problem specific to syntax. For example, if I didn't know what a `foldr` is, because they come up so darn often, I probably struggle to remember what it is.
2021-01-05 12:21:43 +0100gxt(~gxt@gateway/tor-sasl/gxt) (Ping timeout: 240 seconds)
2021-01-05 12:21:47 +0100 <kuribas> kritzefitz: yeah, I'll use (<$>) and ($) because they are ubiqutous, but I would never use (<%@=)
2021-01-05 12:22:17 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 12:22:18 +0100 <kuribas> also, haskell operators are more regular than custom syntax, though they have some of the same problems.
2021-01-05 12:22:57 +0100 <kuribas> kritzefitz: if foldr were named reduceRight, it would be more clear, no?
2021-01-05 12:23:18 +0100 <kuribas> which is why descriptive names are important.
2021-01-05 12:24:28 +0100 <kritzefitz> I guess it would be a bit more descriptive, but it also assumes that I know what “reduce” means in that context. If I didn't know that already, I'd probably guess that `reduce` has the type `(Num n) => n -> n` or similar.
2021-01-05 12:24:36 +0100 <maerwald> kuribas: sometimes that's really hard :]
2021-01-05 12:24:50 +0100 <maerwald> consider: `deleteFile` ...what does it do :>
2021-01-05 12:25:29 +0100 <kuribas> kritzefitz: why would you want to guess the type?
2021-01-05 12:26:04 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 12:26:11 +0100 <kuribas> maerwald: delete a file?
2021-01-05 12:26:22 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 12:26:36 +0100 <kritzefitz> Because the alternative would be to look it up. But I think at that point your argument becomes a lot weaker, because I can also look up most of the syntax I encounter.
2021-01-05 12:26:55 +0100 <maerwald> kuribas: hehehe, what file? directory too? follows symlinks or not?
2021-01-05 12:27:32 +0100gxt(~gxt@gateway/tor-sasl/gxt)
2021-01-05 12:27:33 +0100 <kuribas> kritzefitz: ? I get the type directly in the IDE or in emacs. Or in ghci. Looking up syntax requires already knowing what the syntax is meant to do.
2021-01-05 12:27:50 +0100 <maerwald> deleteRegularFileNoFollowSymbolicLinks
2021-01-05 12:27:56 +0100dirediresalt(DirefulSal@gateway/vpn/privateinternetaccess/direfulsalt) (Remote host closed the connection)
2021-01-05 12:27:58 +0100 <maerwald> is a bit better
2021-01-05 12:28:16 +0100dirediresalt(DirefulSal@gateway/vpn/privateinternetaccess/direfulsalt)
2021-01-05 12:29:19 +0100 <kuribas> kritzefitz: how would you lookup ${foo%*abc}?
2021-01-05 12:31:03 +0100 <kritzefitz> Yes, I agree, searching syntax is harder than searching identifiers. But for syntax you use so often that you always remember its semantics (because you relied on them just yesterday) having to look it up is basically irrelevant.
2021-01-05 12:31:18 +0100tomsmeding(~tomsmedin@tomsmeding.com)
2021-01-05 12:33:33 +0100Deide(~Deide@217.155.19.23)
2021-01-05 12:33:42 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 12:33:57 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 12:34:14 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 264 seconds)
2021-01-05 12:35:20 +0100 <__monty__> I don't see how reduceRight is clearer than foldr, I think it's a terrible example of good naming. Spelling out right/left, ok, but that doesn't really help unless you're already familiar with both left and right folds. And I'm not convinced reduce is any clearer than fold. Maybe for people coming from languages that use "reduce" but it doesn't have a clear singular possible implementation.
2021-01-05 12:36:06 +0100cfricke(~cfricke@unaffiliated/cfricke)
2021-01-05 12:36:19 +0100 <__monty__> kritzefitz: Otoh for syntax/library functions you use so often you always remember their semantics is there even a difference except for syntax often being terser?
2021-01-05 12:36:23 +0100rayyyy(~nanoz@gateway/tor-sasl/nanoz) (Ping timeout: 240 seconds)
2021-01-05 12:36:51 +0100 <__monty__> And libraries still have the advantage that they can be replaced when someone comes up with a better implementation or a different paradigm.
2021-01-05 12:37:10 +0100jedws(~jedws@121.209.189.201)
2021-01-05 12:37:15 +0100 <kuribas> __monty__: most languages call it reduce, not fold...
2021-01-05 12:37:18 +0100Melanie_(~Melanie@192-0-134-138.cpe.teksavvy.com)
2021-01-05 12:37:46 +0100jedws(~jedws@121.209.189.201) (Client Quit)
2021-01-05 12:37:59 +0100 <kuribas> __monty__: the difference is composability. Syntax doesn't compose.
2021-01-05 12:38:26 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Ping timeout: 264 seconds)
2021-01-05 12:38:39 +0100 <dequbed> When I was learning haskell I did it by reading code; and spend some three days trying to figure out what `e@(Data a _)` does. However I learned about Hoogle and how to use it on the first or second day.
2021-01-05 12:39:02 +0100 <kritzefitz> __monty__, not really. The syntax being terser is actually my main point. I agree that this might often not be such a big advantage over the disadvantage of having to remember additional syntax, that's why I'm hanging around in #haskell and not #perl (don't know if that channel actually exists). But I can understand why proponents of syntax-heavy language might consider this an advantage.
2021-01-05 12:39:03 +0100rayyyy(~nanoz@gateway/tor-sasl/nanoz)
2021-01-05 12:40:06 +0100ulidtko(~ulidtko@193.111.48.79)
2021-01-05 12:40:31 +0100 <__monty__> Operators give you most of the benefits of syntax without all of the disadvantages then?
2021-01-05 12:41:29 +0100 <kritzefitz> At least operators in Haskell combined with hoogle solve the problem of searchability, so I guess?
2021-01-05 12:42:13 +0100ulidtko|k(~ulidtko@194.54.80.38)
2021-01-05 12:43:39 +0100 <kuribas> __monty__: operators can be less readable. But if you use them often that doesn't matter so much.
2021-01-05 12:44:00 +0100 <kritzefitz> But OTOH operators in Haskell are usually restricted to two (maybe three) arguments. So syntax requirements that don't easily map into some form of binary tree aren't that easy to fulfill.
2021-01-05 12:45:24 +0100Melanie_(~Melanie@192-0-134-138.cpe.teksavvy.com) (Ping timeout: 260 seconds)
2021-01-05 12:45:28 +0100ulidtko(~ulidtko@193.111.48.79) (Ping timeout: 272 seconds)
2021-01-05 12:46:10 +0100 <__monty__> Now we're getting into agda's mixfix territory : )
2021-01-05 12:47:12 +0100 <kuribas> is "getLine >>= \name -> putStrLn ("hello" <> name)" really better than "getLine `bind` \name -> putStrLn ("hello" <> name)" ?
2021-01-05 12:47:43 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it)
2021-01-05 12:48:25 +0100 <kuribas> personally I find the latter more readable.
2021-01-05 12:48:33 +0100 <boxscape> I don't
2021-01-05 12:49:36 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 12:52:29 +0100 <__monty__> Me either.
2021-01-05 12:53:19 +0100 <__monty__> It's the same reason (1 + 2 * 3) is easier to understand than (1 `plus` (2 `times` 3)).
2021-01-05 12:53:29 +0100 <__monty__> Probably has to do with things like subitting.
2021-01-05 12:55:20 +0100 <boxscape> if "bind" were the actual name of that function I think I might prefer `bindTo` so that "getLine `bindTo` \name -> ...` reads more naturally
2021-01-05 12:55:48 +0100 <dminuoso> The human brain is quite good at pattern recognition, but for that to work right you need to train it a lot.
2021-01-05 12:56:14 +0100 <dminuoso> >>= is only readable because an experienced haskeller has been exposed to that operator a lot to instantly recognize it
2021-01-05 12:56:57 +0100 <kritzefitz> I don't find the name `bind` for the monadic operator not useful at all. I think I see why the name is fitting, but only because I already know what it does. But by that point I can remember >>= just as well as bind.
2021-01-05 12:58:14 +0100 <dminuoso> kritzefitz: Having a alphanumeric name helps if you have a hard time remembering the meaning its corresponding operator. Say if we had `>=>` and `>>=` these look darn similar
2021-01-05 12:58:37 +0100 <dminuoso> But if we used `bind` and (say) `kCompose` instead, it might be easier to recognize which is which
2021-01-05 12:59:22 +0100 <dminuoso> On that note, the names `some` and `many` are really terrible...
2021-01-05 12:59:45 +0100 <dminuoso> Because you can't differentiate them on account of the meaning of the word.
2021-01-05 13:01:43 +0100 <dminuoso> At the same time, to someone who has no previous experience with regular languages or automata theory, a theoretical postfix + or * would be no better.
2021-01-05 13:02:01 +0100 <kritzefitz> True. I think its a trade-off between the benefits of pattern recognition and descriptiveness. But I think that's not something that can be judged objectively. For me, personally, both >>= and >=> pass the threshold of familiarity, so I can recognize them as operators. But I can understand, why people might be confused by them.
2021-01-05 13:09:46 +0100 <idnar> IDE-like features help me a lot with that; if I use >>= when I meant >=>, the types/type errors from HLS immediately tip me off
2021-01-05 13:10:38 +0100 <boxscape> I think firacode ligatures help with that, >>= just looks very distinctive
2021-01-05 13:11:14 +0100 <boxscape> https://i.imgur.com/K4e38DZ.png >>= vs >=>
2021-01-05 13:12:01 +0100 <merijn> I mean, >>= and >=> already look very distinctive, tbh...
2021-01-05 13:12:25 +0100 <merijn> If they don't I highly recommend curing yourself from "programmer's disease" and stop using a tiny 10pt font >.>
2021-01-05 13:14:03 +0100 <idnar> it's not that they're indistinct, it's that I forget which is which
2021-01-05 13:14:09 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 13:16:01 +0100 <idnar> same with `some` and `many`
2021-01-05 13:16:30 +0100 <Ferdirand> >=> looks more like something that can compose, the ends are fitting together
2021-01-05 13:18:18 +0100 <dminuoso> Ferdirand: And I use the word "someone" to remember that some is one or more.
2021-01-05 13:18:53 +0100 <dminuoso> The fact that we can come up with memory aids doesnt mean there's an obvious instant intuition here
2021-01-05 13:18:57 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Ping timeout: 260 seconds)
2021-01-05 13:19:01 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 13:20:54 +0100Stanley00(~stanley00@unaffiliated/stanley00) (Remote host closed the connection)
2021-01-05 13:21:24 +0100 <kuribas> >=> = fish operator, >>= = aligator operator?
2021-01-05 13:21:33 +0100Stanley00(~stanley00@unaffiliated/stanley00)
2021-01-05 13:22:24 +0100 <__monty__> >>= = bind, no need to come up with a non-descriptive name imo.
2021-01-05 13:22:41 +0100 <dminuoso> Hold on, how is "bind" descriptive? :>
2021-01-05 13:22:48 +0100 <Ferdirand> dminuoso: i'm not claiming there is, i'm just sharing my own aid
2021-01-05 13:22:56 +0100Gurkenglas(~Gurkengla@unaffiliated/gurkenglas) (Ping timeout: 240 seconds)
2021-01-05 13:22:58 +0100 <merijn> "intuition" is verrated
2021-01-05 13:23:09 +0100 <merijn> Memorability and consistency are better
2021-01-05 13:23:14 +0100 <__monty__> It's only descriptive in so far as >>= and bind are the same thing. Neither actually tells me what they do.
2021-01-05 13:23:15 +0100 <dminuoso> Ferdirand: To me, I dont have any intuition. It's just trained pattern recognition for them
2021-01-05 13:23:28 +0100 <dminuoso> But then again I use =<< a lot
2021-01-05 13:23:59 +0100 <dminuoso> __monty__: Sure, but when we have `fish` and `bind` you're back at the same spot.
2021-01-05 13:24:05 +0100 <dminuoso> Which does what?
2021-01-05 13:24:06 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 272 seconds)
2021-01-05 13:24:33 +0100 <dminuoso> At the very least kCompose, or perhapse composeM is somewhat suggestive
2021-01-05 13:24:35 +0100 <__monty__> I only meant that there's no need to introduce "alligator", three names for the same thing is more confusing than two names.
2021-01-05 13:25:11 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 13:25:19 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 13:25:27 +0100EricFisher(~EricFishe@185.163.110.125) (Remote host closed the connection)
2021-01-05 13:25:44 +0100 <dminuoso> Ferdirand: But yeah, sometimes these visual memory aids help. In lens, I remember the parameter order by thinking of ^. where the left hand side is an eye, and the other side is where the monocole (the optic) goes.
2021-01-05 13:26:01 +0100Stanley00(~stanley00@unaffiliated/stanley00) (Ping timeout: 246 seconds)
2021-01-05 13:26:09 +0100 <dminuoso> Which of course doesnt help if you're tempted to write .^, but my muscle memory here helps
2021-01-05 13:26:10 +0100 <__monty__> Operators are always a balancing act. I don't subscribe to either of Java's everyNameShouldBeASentence or APL's symbol-vomit approaches.
2021-01-05 13:27:32 +0100Entertainment(~entertain@104.246.132.210)
2021-01-05 13:28:25 +0100oxide(~lambda@unaffiliated/mclaren) (Ping timeout: 264 seconds)
2021-01-05 13:29:05 +0100 <boxscape> at least in Java you can use $ in names and use function.$(argument) to pretend you have an apply operator :)
2021-01-05 13:30:04 +0100rmk236(~lcampos@2a02:908:3616:b100:ad41:f5e6:8b3a:bfc3) (Quit: Leaving.)
2021-01-05 13:34:38 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Quit: Connection closed)
2021-01-05 13:34:58 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 13:35:44 +0100 <kuribas> __monty__: >=> is already established as the "fish operator", then why not "aligator" :)
2021-01-05 13:35:58 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89)
2021-01-05 13:36:02 +0100 <kuribas> __monty__: but ok, tha alligator is going in the wrong direction
2021-01-05 13:38:08 +0100geekosaur(ac3a3bce@172.58.59.206)
2021-01-05 13:39:49 +0100 <dminuoso> To me, an alligator would ratber be =>=>-
2021-01-05 13:40:07 +0100 <dminuoso> Or maybe =<=<-? Not sure.
2021-01-05 13:40:10 +0100 <Clint> :-O
2021-01-05 13:40:28 +0100 <boxscape> in elementary school I learned that > and < are alligators eating the bigger number
2021-01-05 13:40:37 +0100 <tomsmeding> % _ =>=>- _ = "alligator"
2021-01-05 13:40:38 +0100 <yahb> tomsmeding:
2021-01-05 13:41:25 +0100 <boxscape> % "cya" =>=>- "later"
2021-01-05 13:41:25 +0100 <yahb> boxscape: "alligator"
2021-01-05 13:43:40 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 13:44:08 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 13:46:22 +0100Saukk(~Saukk@83-148-239-3.dynamic.lounea.fi)
2021-01-05 13:46:44 +0100 <boxscape> % f 🐊 g = f >=> g
2021-01-05 13:46:44 +0100 <yahb> boxscape:
2021-01-05 13:47:10 +0100 <dminuoso> Wow, my font has a glyph for that.
2021-01-05 13:47:16 +0100 <dminuoso> Was really worth every penny I paid. :D
2021-01-05 13:47:21 +0100 <boxscape> nice!
2021-01-05 13:47:55 +0100 <kuribas> http://kuribas.hcoop.net/alligator.png
2021-01-05 13:48:18 +0100 <boxscape> hmm 404
2021-01-05 13:48:54 +0100 <dminuoso> Oh, I see now
2021-01-05 13:51:04 +0100 <hpc> dminuoso: all 0 of them? dejavu has it too :P
2021-01-05 13:52:44 +0100 <dminuoso> hpc: No I actually paid quite a bunch of pennies for this font. :)
2021-01-05 13:53:16 +0100 <boxscape> which font are you using?
2021-01-05 13:53:40 +0100 <dminuoso> https://fsd.it/shop/fonts/pragmatapro/
2021-01-05 13:53:46 +0100 <boxscape> I see
2021-01-05 13:55:45 +0100LKoen(~LKoen@174.175.9.109.rev.sfr.net) (Remote host closed the connection)
2021-01-05 13:55:47 +0100Saukk(~Saukk@83-148-239-3.dynamic.lounea.fi) (Remote host closed the connection)
2021-01-05 13:56:06 +0100 <tomsmeding> kuribas++
2021-01-05 13:57:31 +0100darjeeling_(~darjeelin@122.245.218.97) (Ping timeout: 246 seconds)
2021-01-05 14:00:13 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299)
2021-01-05 14:00:14 +0100Melanie_(~Melanie@192-0-134-138.cpe.teksavvy.com)
2021-01-05 14:04:50 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299) (Ping timeout: 264 seconds)
2021-01-05 14:04:55 +0100ClaudiusMaximus(~claude@196.67.6.51.dyn.plus.net)
2021-01-05 14:04:55 +0100ClaudiusMaximus(~claude@196.67.6.51.dyn.plus.net) (Changing host)
2021-01-05 14:04:55 +0100ClaudiusMaximus(~claude@unaffiliated/claudiusmaximus)
2021-01-05 14:05:58 +0100 <merijn> If I ever ditch macOS, first thing I'm gonna do is buy Monaco :p
2021-01-05 14:06:19 +0100 <merijn> <3 Monaco
2021-01-05 14:07:22 +0100crblmr(~carbolyme@matrix.dropacid.net) (Ping timeout: 260 seconds)
2021-01-05 14:10:24 +0100solirc(~solirc@185.163.110.125)
2021-01-05 14:11:33 +0100dycan(~dycan@2404:0:8229:2ab9:dc14:be76:1dfd:8878)
2021-01-05 14:11:56 +0100crblmr(~carbolyme@matrix.dropacid.net)
2021-01-05 14:14:53 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 14:15:47 +0100graf_blutwurst(~user@2001:171b:226e:adc0:fdb7:5f6d:f86b:a30e) (Remote host closed the connection)
2021-01-05 14:17:52 +0100vnz(~vnz@unaffiliated/vnz) (Quit: ZNC - http://znc.in)
2021-01-05 14:18:38 +0100cfricke(~cfricke@unaffiliated/cfricke) (Ping timeout: 264 seconds)
2021-01-05 14:19:37 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Ping timeout: 260 seconds)
2021-01-05 14:19:49 +0100vnz(~vnz@2001:bc8:604:94f::1)
2021-01-05 14:19:49 +0100vnz(~vnz@2001:bc8:604:94f::1) (Changing host)
2021-01-05 14:19:49 +0100vnz(~vnz@unaffiliated/vnz)
2021-01-05 14:20:25 +0100 <__monty__> Working with agda for a bit has made me give up on anything that isn't DejaVu.
2021-01-05 14:20:49 +0100 <dminuoso> __monty__: Why is that?
2021-01-05 14:21:05 +0100 <boxscape> Phil Wadler reccomends mononoki with Agda
2021-01-05 14:21:22 +0100 <boxscape> FiraCode has worked okay for me although some symbols it uses aren't in it
2021-01-05 14:21:33 +0100 <merijn> dminuoso: Agda has unicode sickness
2021-01-05 14:21:52 +0100 <[exa]> merijn: what's Monaco?
2021-01-05 14:21:56 +0100pera(~pera@unaffiliated/pera) (Ping timeout: 240 seconds)
2021-01-05 14:22:04 +0100 <[exa]> apart from the obvious state down there near mediterranean sea
2021-01-05 14:22:15 +0100 <merijn> I still remember that moment where Ulf (I think?) was giving a lecture on Agda at OPLSS and none of the students could get his example to work
2021-01-05 14:22:20 +0100 <geekosaur> apple's monospaced font
2021-01-05 14:22:39 +0100 <dminuoso> merijn: Sure, but I was wondering why DejaVu in particular.
2021-01-05 14:22:40 +0100 <merijn> Queue the cursed sentence "oh, yes, that's not an ascii pipe, but a unicode vertical bar..."
2021-01-05 14:22:46 +0100 <merijn> geekosaur: Technically not Apple's
2021-01-05 14:22:48 +0100 <[exa]> oh this
2021-01-05 14:23:09 +0100 <merijn> Oh, wait, I guess it is
2021-01-05 14:23:12 +0100 <merijn> heh
2021-01-05 14:23:26 +0100 <[exa]> I hate that one for overslanted a/d/g :]
2021-01-05 14:23:38 +0100 <merijn> [exa]: Slightly blurry due to magnification, but looks like: http://files.inconsistent.nl/irc-quotes.png
2021-01-05 14:24:19 +0100 <merijn> I think Menlo is now the default monospace font for Apple, but I refuse to join the future!
2021-01-05 14:24:28 +0100 <boxscape> | ⃒ ❘|¦ there are quite a few to choose from
2021-01-05 14:24:48 +0100olban(~olban@213.152.161.133)
2021-01-05 14:25:01 +0100 <[exa]> merijn: that's the bold variant?
2021-01-05 14:25:50 +0100pera(~pera@unaffiliated/pera)
2021-01-05 14:25:57 +0100 <merijn> No, that's regular
2021-01-05 14:26:10 +0100 <__monty__> dminuoso: DejaVu has very good unicode coverage and is open.
2021-01-05 14:26:28 +0100 <__monty__> And it doesn't harm my sensibilities.
2021-01-05 14:26:32 +0100 <merijn> [exa]: The fact that it's kinda chunky is one of the reasons I like it :p
2021-01-05 14:26:52 +0100 <merijn> __monty__: Adobe's Source Code Pro? :)
2021-01-05 14:27:12 +0100jespada(~jespada@90.254.245.49) (Ping timeout: 260 seconds)
2021-01-05 14:27:17 +0100 <merijn> __monty__: That's free as in speech and as in beer!
2021-01-05 14:27:20 +0100andi-(~andi-@NixOS/user/andi-) (Ping timeout: 258 seconds)
2021-01-05 14:27:25 +0100 <__monty__> Don't like it as much. And Adobe triggers my paranoia, as do the Noto fonts.
2021-01-05 14:27:29 +0100 <dminuoso> __monty__: Is there general support for writing agda code with say a wacom or apple pencil?
2021-01-05 14:27:45 +0100 <merijn> [exa]: But I also use 14-15 pt font size for my terminal, none of this 9-10pt courier new bollocks :p
2021-01-05 14:27:52 +0100 <__monty__> Can't say I've seen that, no.
2021-01-05 14:27:55 +0100 <dminuoso> It seems to me, that given a language in which you have to go _really_ crazy with weird looking characters, it's just easier to draw what you're having visually in mind.
2021-01-05 14:28:00 +0100 <[exa]> merijn: did you try IBM plex?
2021-01-05 14:28:23 +0100kyali_(~kyali@APN-123-251-234-gprs.simobil.net)
2021-01-05 14:28:23 +0100 <boxscape> surely *someone* must have implemented graphics tablet support for emacs, doesn't everything exist for emacs? :)
2021-01-05 14:28:28 +0100 <__monty__> merijn: My DejaVu looks superficially similar to that monaco sample, imo.
2021-01-05 14:28:43 +0100 <dycan> hi, I nix-shell -p "haskell.packages.ghcjs.ghcWithPackages (p:[])". But error: https://justpaste.it/4zie8. In an issue it redirects me to, it says "cabal-version: >= ..." should be "cabal-version: ..." in the first line. How could I do that?
2021-01-05 14:29:42 +0100Tario(~Tario@201.192.165.173)
2021-01-05 14:29:58 +0100 <__monty__> dminuoso: The "latex input mode" has pretty good mnemonics ime.
2021-01-05 14:30:03 +0100jespada(~jespada@90.254.245.49)
2021-01-05 14:30:45 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 14:30:52 +0100 <merijn> I hijacked the pidgin input of macos to enable latex input for me, yeah :p
2021-01-05 14:30:57 +0100 <dminuoso> __monty__: Does it come with an interactive search/visualization to find the right mnemonic (or straight select the character you want, say via your favourite narrower)?
2021-01-05 14:31:05 +0100 <merijn> dminuoso: Yes ;)
2021-01-05 14:31:14 +0100 <boxscape> someone should make a coding UI that just operates on handwritten text, without ever displaying ASCII/unicode to the user
2021-01-05 14:31:15 +0100urodna(~urodna@unaffiliated/urodna)
2021-01-05 14:31:17 +0100 <merijn> https://detexify.kirelabs.org/classify.html
2021-01-05 14:31:23 +0100 <boxscape> (not me though)
2021-01-05 14:31:28 +0100kyali(~kyali@APN-123-249-162-gprs.simobil.net) (Ping timeout: 246 seconds)
2021-01-05 14:31:48 +0100 <dminuoso> boxscape: Have you worked with Notability + math conversion?
2021-01-05 14:31:54 +0100 <boxscape> I haven't
2021-01-05 14:32:00 +0100 <merijn> Detexify = <3
2021-01-05 14:32:04 +0100huskyhaskell(~david@h-191-51.A785.priv.bahnhof.se)
2021-01-05 14:32:10 +0100Gurkenglas(~Gurkengla@unaffiliated/gurkenglas)
2021-01-05 14:32:53 +0100cfricke(~cfricke@unaffiliated/cfricke)
2021-01-05 14:33:23 +0100 <__monty__> merijn: Tell me more about this pidgin input hack? I've thorougly enjoyed my compose key hack so far.
2021-01-05 14:33:32 +0100 <__monty__> Maybe in -offtopic.
2021-01-05 14:34:08 +0100cfricke(~cfricke@unaffiliated/cfricke) (Client Quit)
2021-01-05 14:35:04 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 256 seconds)
2021-01-05 14:35:28 +0100 <merijn> __monty__: I noticed my chinese colleagues had this keyboard mode switch where they'd type pidgin and select corresponding characters. I thought "heh, wonder if I can abuse that for LaTeX and unicode..." google around and someone had already figured out how to do that ;)
2021-01-05 14:36:48 +0100 <merijn> __monty__: Basically, consists of registering a new input method (i.e. "copy a file") that shows up as a new keyboard/language in the input selection and using the regular "keyboard language switch" to toggle between them
2021-01-05 14:38:52 +0100huskyhaskell(~david@h-191-51.A785.priv.bahnhof.se) (Quit: leaving)
2021-01-05 14:40:24 +0100darjeeling_(~darjeelin@122.245.218.97)
2021-01-05 14:40:29 +0100 <merijn> hmm
2021-01-05 14:41:19 +0100plutoniix(~q@184.82.195.99) (Quit: Leaving)
2021-01-05 14:41:28 +0100jduhamel(~textual@bras-base-toroon4664w-grc-16-184-145-103-248.dsl.bell.ca)
2021-01-05 14:41:44 +0100 <__monty__> Found this, https://github.com/clarkgrubb/latex-input I'll give it a shot.
2021-01-05 14:42:11 +0100 <merijn> So, suppose I have an existentially quantified type where I don't know if it's an instance can I get access to the Eq instance if it exists
2021-01-05 14:42:26 +0100 <merijn> __monty__: Looks overcomplicated, here's what I use: https://github.com/merijn/dotfiles/tree/master/install-osx/latex-input
2021-01-05 14:42:47 +0100andi-(~andi-@NixOS/user/andi-)
2021-01-05 14:42:48 +0100jamm(~jamm@unaffiliated/jamm)
2021-01-05 14:43:03 +0100 <merijn> Ah, looks like the complicated mess is windows/linux
2021-01-05 14:43:27 +0100da39a3ee5e6b4b0d(~da39a3ee5@2403:6200:8876:12e2:f4f0:d2c0:3ecf:a408) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 14:43:41 +0100whataday(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2021-01-05 14:44:21 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 14:45:31 +0100drbean(~drbean@TC210-63-209-199.static.apol.com.tw) (Ping timeout: 265 seconds)
2021-01-05 14:46:01 +0100dycan(~dycan@2404:0:8229:2ab9:dc14:be76:1dfd:8878) (Remote host closed the connection)
2021-01-05 14:48:42 +0100 <tomsmeding> merijn: that sounds like a thing that only TH can do, but at the point where you have an existentially qualified type TH's time is over
2021-01-05 14:48:59 +0100 <tomsmeding> also I love and use mononoki
2021-01-05 14:49:15 +0100cfricke(~cfricke@unaffiliated/cfricke)
2021-01-05 14:49:37 +0100 <merijn> tomsmeding: Basically, what I'm trying to do is "get a list of all EntityFields for a persistent entity"
2021-01-05 14:50:07 +0100chenshen(~chenshen@2620:10d:c090:400::5:8e09)
2021-01-05 14:50:12 +0100 <merijn> I figured toPersistFields did that, but I actually think probably not, by the looks of it >.>
2021-01-05 14:50:13 +0100 <tomsmeding> make a GADT like data MaybeEQ where YesEQ :: Eq a => a -> MaybeEQ ; NoEQ :: a -> MaybeEQ
2021-01-05 14:50:26 +0100 <tomsmeding> and choose the right one upon construction?
2021-01-05 14:51:11 +0100chenshen(~chenshen@2620:10d:c090:400::5:8e09) (Client Quit)
2021-01-05 14:51:17 +0100 <merijn> tomsmeding: That involves modifying the upstream persist code
2021-01-05 14:51:24 +0100 <tomsmeding> ah
2021-01-05 14:51:34 +0100 <merijn> Else I can just add an Eq constraint anyway
2021-01-05 14:51:45 +0100 <tomsmeding> typeable?
2021-01-05 14:52:43 +0100 <merijn> That also requires rewriting the current existential with a new constraint
2021-01-05 14:53:03 +0100whataday(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2021-01-05 14:53:05 +0100 <merijn> Anyway, looks like this existential doesn't even have the right data anyway, so I need to go back to the drawing board
2021-01-05 14:53:24 +0100 <lortabac> merijn: if you are crazy enough you can try https://hackage.haskell.org/package/constraints-emerge
2021-01-05 14:53:40 +0100dycan(~dycan@2404:0:8229:2ab9:dc14:be76:1dfd:8878)
2021-01-05 14:54:38 +0100drewolson(~drewolson@64.227.24.16) (Quit: The Lounge - https://thelounge.chat)
2021-01-05 14:54:59 +0100drewolson(~drewolson@64.227.24.16)
2021-01-05 14:55:01 +0100 <tomsmeding> how can that even work without Typeable
2021-01-05 14:55:06 +0100acarrico(~acarrico@dhcp-68-142-39-249.greenmountainaccess.net)
2021-01-05 14:56:06 +0100bgamari(~bgamari@72.65.105.91)
2021-01-05 14:56:41 +0100Lorra(~lorenzo@2001:a61:ba6:4501:a9e0:bf53:18b7:5b1f)
2021-01-05 14:59:55 +0100 <tomsmeding> reading the plugin I am still severely confused
2021-01-05 15:01:06 +0100cfricke(~cfricke@unaffiliated/cfricke) (Quit: WeeChat 3.0)
2021-01-05 15:04:10 +0100Katsa(b230f459@catv-178-48-244-89.catv.broadband.hu)
2021-01-05 15:04:34 +0100jedws(~jedws@121.209.189.201)
2021-01-05 15:06:00 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com)
2021-01-05 15:06:14 +0100chang(~textual@host-173-230-65-85.njjcmar.clients.pavlovmedia.com) (Client Quit)
2021-01-05 15:06:53 +0100justsomeguy(~justsomeg@unaffiliated/--/x-3805311) ()
2021-01-05 15:07:23 +0100hyperisco(~hyperisco@d192-186-117-226.static.comm.cgocable.net)
2021-01-05 15:07:51 +0100 <Katsa> Hey, can someone help me create a type that either holds an Int, a Bool or a Pair of these (pairs can be nested). type Val = Three Int Bool (Val, Val) throws error for having a cycle in the definition. Thanks ^^
2021-01-05 15:08:22 +0100 <ski> Katsa : i think you want `data', not `type' ?
2021-01-05 15:08:32 +0100 <merijn> s/think/know ;)
2021-01-05 15:08:35 +0100 <geekosaur> also you described an and, not an or
2021-01-05 15:08:47 +0100 <geekosaur> in your attempt at a type
2021-01-05 15:08:55 +0100 <ski> Katsa : what is `Three' ?
2021-01-05 15:09:04 +0100 <Katsa> data Three a b c = A a | B b | C c deriving (Eq, Show)
2021-01-05 15:09:09 +0100michalz`(~user@185.246.204.79)
2021-01-05 15:09:09 +0100 <ski> ok
2021-01-05 15:09:42 +0100 <ski> you could also use `newtype' in place of `data', then. but you'll need a data constructor for your type `Val'
2021-01-05 15:09:47 +0100djellemah(~djellemah@2601:5c2:100:96c:e008:b638:39fe:6a54)
2021-01-05 15:09:54 +0100 <ski> (in either case)
2021-01-05 15:10:06 +0100 <Katsa> thanks, i'll look into it
2021-01-05 15:10:39 +0100kyali_(~kyali@APN-123-251-234-gprs.simobil.net) (Ping timeout: 260 seconds)
2021-01-05 15:10:50 +0100michalz(~user@185.246.204.86) (Ping timeout: 264 seconds)
2021-01-05 15:10:55 +0100 <ski> (also, it might be easier/nicer to skip `Three' altogether, and just use `data' directly, with three individual data constructors)
2021-01-05 15:11:14 +0100 <siraben> How do I make GHC de-literate a literate haskell file?
2021-01-05 15:11:54 +0100 <geekosaur> there's an executable `unlit` in the ghc lib directory that you can run. I don't think there's a way to get ghc to only run that without also parsing
2021-01-05 15:12:03 +0100 <carbolymer> can I explicitly copy value in haskell?
2021-01-05 15:12:17 +0100 <kuribas> Katsa: data Three = ThreeInt Int | ThreeBool Bool | ThreePair (Three, Three)
2021-01-05 15:12:25 +0100 <ski> carbolymer : copy what kind of value ?
2021-01-05 15:12:37 +0100 <merijn> Also, isn't this type just "these"? :p
2021-01-05 15:12:45 +0100 <ski> s/Three/Val/
2021-01-05 15:12:55 +0100 <merijn> carbolymer: Why would you want/need that?
2021-01-05 15:13:05 +0100 <kuribas> data Val = ValInt Int | ValBool Bool | ValPair Val Val
2021-01-05 15:13:22 +0100 <carbolymer> ski, I have a type let's say, `data Foo = Foo Int` so I want to have a second, but different `Foo 1`
2021-01-05 15:13:35 +0100 <merijn> carbolymer: Define "different"
2021-01-05 15:13:41 +0100 <ski> a different type ? or a different value ?
2021-01-05 15:13:47 +0100 <merijn> carbolymer: How would you tell them apart?
2021-01-05 15:13:58 +0100 <carbolymer> hmm, bad example
2021-01-05 15:14:55 +0100 <__monty__> carbolymer: Are you worried if you alter a list all your "references" to that list will be altered or something?
2021-01-05 15:15:35 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 15:17:13 +0100 <carbolymer> monty, merijn, ski, In my case I have a type: `data Foo (s :: Type) = Foo { foo :: Int} `, and I want to have `Foo String` from `Foo 1 :: Foo Bool`
2021-01-05 15:17:17 +0100 <carbolymer> rn I'm using following trick: `convertFoo myfoo {foo'} = myfoo { foo = foo' }`, and it works, and I'm looking for a more generic solution without necessity to declare every field
2021-01-05 15:18:13 +0100kritzefitz(~kritzefit@2003:5b:203b:200::10:49) (Ping timeout: 260 seconds)
2021-01-05 15:18:42 +0100 <carbolymer> point is: same type, same constructor, different phantom type
2021-01-05 15:18:45 +0100 <ski> i don't think you can use `myfoo {...}' like that in a pattern
2021-01-05 15:18:51 +0100 <carbolymer> well as I wrote it it sounds like Generics
2021-01-05 15:19:05 +0100 <kuribas> carbolymer: make it a Functor?
2021-01-05 15:19:23 +0100jamm(~jamm@unaffiliated/jamm) (Remote host closed the connection)
2021-01-05 15:19:26 +0100 <carbolymer> kuribas, there are multiple constructors with variable number of parameters
2021-01-05 15:19:42 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 260 seconds)
2021-01-05 15:19:48 +0100 <ski> what is the kind of your actual `Foo' ?
2021-01-05 15:20:17 +0100 <carbolymer> so for Functor instance I'd have to explicitly pattern match every constructor.... so no benefit here ;)
2021-01-05 15:20:17 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Ping timeout: 260 seconds)
2021-01-05 15:20:26 +0100 <carbolymer> ski, Foo :: * -> *
2021-01-05 15:20:29 +0100 <ski> not if you'd derive `Functor'
2021-01-05 15:20:36 +0100 <kuribas> carbolymer: so "coerce" then?
2021-01-05 15:20:48 +0100 <carbolymer> hmm
2021-01-05 15:20:50 +0100jedws(~jedws@121.209.189.201) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2021-01-05 15:20:53 +0100 <lortabac> carbolymer: if the only thing that changes is the phantom type, you can wrap it in a newtype and convert it with 'coerce'
2021-01-05 15:21:19 +0100 <carbolymer> that might work, thanks
2021-01-05 15:21:21 +0100 <lortabac> otherwise you can try RecordWildcards
2021-01-05 15:21:38 +0100dhil(~dhil@78.156.97.38) (Ping timeout: 264 seconds)
2021-01-05 15:22:03 +0100 <boxscape> you don't need a newtype to use coerce here do you?
2021-01-05 15:22:05 +0100 <carbolymer> lortabac, well, doesn't record wildcards requires to use specific constructor?
2021-01-05 15:22:12 +0100 <boxscape> % (coerce (Foo 1:: Foo String)) :: Foo Int
2021-01-05 15:22:13 +0100 <yahb> boxscape: Foo {foo = 1}
2021-01-05 15:22:19 +0100jlamothe(~jlamothe@198.251.55.207) (Quit: rebooting)
2021-01-05 15:22:22 +0100 <kuribas> lortabac, carbolymer: you don't need a newtype to coerce a phantom type.
2021-01-05 15:22:31 +0100 <carbolymer> right
2021-01-05 15:23:21 +0100 <lortabac> oh somehow I thought it only worked with newtypes
2021-01-05 15:23:23 +0100 <Katsa> ski got it to work, thanks again
2021-01-05 15:23:32 +0100 <kuribas> lortabac: nope :)
2021-01-05 15:23:38 +0100 <lortabac> good to know :)
2021-01-05 15:24:41 +0100 <ski> Katsa : cheers :)
2021-01-05 15:25:03 +0100 <boxscape> you can coerce any two typed that are representationally equal
2021-01-05 15:25:07 +0100 <boxscape> s/typed/types
2021-01-05 15:25:13 +0100 <ski> Katsa : ooc, what did you do ?
2021-01-05 15:25:32 +0100 <boxscape> s/coerce/coerce between
2021-01-05 15:26:03 +0100jamm(~jamm@unaffiliated/jamm)
2021-01-05 15:26:57 +0100dhil(~dhil@78.156.97.38)
2021-01-05 15:27:42 +0100 <siraben> How do I specify an out directory for GHC?
2021-01-05 15:27:42 +0100 <Katsa> three individual data constructors
2021-01-05 15:27:49 +0100christo(~chris@81.96.113.213)
2021-01-05 15:27:51 +0100 <siraben> `-o .` ?
2021-01-05 15:28:30 +0100 <siraben> Ah, `-outputdir .`
2021-01-05 15:28:43 +0100 <siraben> Hm, didn't work
2021-01-05 15:28:58 +0100carlomagno(~cararell@148.87.23.12)
2021-01-05 15:29:10 +0100 <dminuoso> glguy: Hiya, thank you for the tip with config-schema/config-value. It looks like a fairly good fit, albeit with some rough edges.
2021-01-05 15:29:42 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 15:29:44 +0100 <ski> Katsa : so, something like what kuribas suggested, above ?
2021-01-05 15:30:35 +0100jamm(~jamm@unaffiliated/jamm) (Ping timeout: 258 seconds)
2021-01-05 15:30:38 +0100dycan(~dycan@2404:0:8229:2ab9:dc14:be76:1dfd:8878) (Ping timeout: 264 seconds)
2021-01-05 15:30:41 +0100 <Katsa> yeah pretty much
2021-01-05 15:33:05 +0100 <ski> ok
2021-01-05 15:33:48 +0100jsomedon(~jsomedon@114.252.54.192)
2021-01-05 15:36:29 +0100madjest16(~Android@89-200-4-148.mobile.kpn.net)
2021-01-05 15:37:25 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net) (Ping timeout: 264 seconds)
2021-01-05 15:39:37 +0100hake(6e088244@110.8.130.68)
2021-01-05 15:40:00 +0100 <hake> hi
2021-01-05 15:40:05 +0100 <ski> lo
2021-01-05 15:41:33 +0100robotmay(~beepboop@2001:8b0:7af0:2580:695c:2c43:c9f4:f004) (Ping timeout: 260 seconds)
2021-01-05 15:44:12 +0100robotmay(~beepboop@2001:8b0:7af0:2580:e163:8dc0:987:5b1e)
2021-01-05 15:44:20 +0100u0_a298(~user@47.206.148.226)
2021-01-05 15:44:27 +0100christo(~chris@81.96.113.213)
2021-01-05 15:45:20 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 15:46:01 +0100argento(~argent0@168.227.97.29)
2021-01-05 15:46:21 +0100Sgeo(~Sgeo@ool-18b98aa4.dyn.optonline.net)
2021-01-05 15:46:51 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 15:48:19 +0100cr3(~cr3@192-222-143-195.qc.cable.ebox.net)
2021-01-05 15:48:22 +0100rmk236(~lcampos@2a02:908:3616:b100:ad41:f5e6:8b3a:bfc3)
2021-01-05 15:50:13 +0100p-core(~Thunderbi@koleje-wifi-0045.koleje.cuni.cz) (Read error: Connection reset by peer)
2021-01-05 15:50:25 +0100geekosaur(ac3a3bce@172.58.59.206) (Remote host closed the connection)
2021-01-05 15:50:27 +0100p-core(~Thunderbi@2001:718:1e03:5128:3697:eeda:19aa:8e56)
2021-01-05 15:51:18 +0100jlamothe(~jlamothe@198.251.55.207)
2021-01-05 15:51:20 +0100s00pcan(~chris@075-133-056-178.res.spectrum.com) (Ping timeout: 256 seconds)
2021-01-05 15:52:52 +0100s00pcan(~chris@107.181.165.217)
2021-01-05 15:53:11 +0100u0_a298(~user@47.206.148.226) (Read error: Connection reset by peer)
2021-01-05 15:53:47 +0100howdoi(uid224@gateway/web/irccloud.com/x-tiblbupceujnheos)
2021-01-05 15:54:10 +0100Jd007(~Jd007@d154-5-83-24.bchsia.telus.net)
2021-01-05 16:00:53 +0100jsomedon(~jsomedon@114.252.54.192) (Quit: jsomedon)
2021-01-05 16:01:17 +0100stree_(~stree@50-108-97-132.adr01.mskg.mi.frontiernet.net)
2021-01-05 16:01:23 +0100stree(~stree@50-108-115-238.adr01.mskg.mi.frontiernet.net) (Ping timeout: 268 seconds)
2021-01-05 16:03:00 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 16:03:40 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 16:03:52 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Ping timeout: 246 seconds)
2021-01-05 16:07:26 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299)
2021-01-05 16:08:39 +0100elfets(~elfets@ip-37-201-23-96.hsi13.unitymediagroup.de)
2021-01-05 16:10:56 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:11:13 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299) (Remote host closed the connection)
2021-01-05 16:11:21 +0100Vulfe(~vulfe@75-28-176-196.lightspeed.evtnil.sbcglobal.net)
2021-01-05 16:11:40 +0100noop_noob(31e4c3d3@49.228.195.211)
2021-01-05 16:12:42 +0100 <noop_noob> Hi there. I'm kind of a haskell noob and I'm trying to code up something that does inputs and outputs, and I'm trying to put it into a monad. I suspect I'm making it harder than it needs to be. Can anybody help? Here's what I have right now:
2021-01-05 16:12:48 +0100 <noop_noob> newtype InOutT i o m a = InOutT m (InOutTHelper i o m a)
2021-01-05 16:12:52 +0100 <noop_noob> data InOutTHelper i o m a = In (i -> InOut i o m a) | Out o (InOut i o a) | InOutDone a
2021-01-05 16:13:03 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 16:14:14 +0100 <noop_noob> InOutT should represent a computation that's done in a monad `m`, and on each step it might either consume `i` as input, produce `o` as output, or terminate, resulting in an `a`.
2021-01-05 16:14:19 +0100 <noop_noob> Am I on the right path?
2021-01-05 16:14:24 +0100 <ski> did you mean `.. = InOutT (m (InOutTHelper i o m a))' and `.. | Out o (InOut i o m a) | ..' ?
2021-01-05 16:14:25 +0100 <dminuoso> noop_noob: Congratulations, you're reinventing pipes/conduits! :)
2021-01-05 16:14:37 +0100 <noop_noob> Oh wait, I missed a parenthesis
2021-01-05 16:14:52 +0100 <noop_noob> newtype InOutT i o m a = InOutT (m (InOutTHelper i o m a))
2021-01-05 16:15:05 +0100 <noop_noob> Oh. pipes/conduits... what are those?
2021-01-05 16:15:07 +0100 <ski> (i guess you probably also meant `InOutT', rather than `InOut' ?)
2021-01-05 16:15:14 +0100 <noop_noob> Oh yup
2021-01-05 16:15:15 +0100 <dminuoso> noop_noob: Note, you probably dont want to wrap everything inside m
2021-01-05 16:15:41 +0100 <noop_noob> I feel like I don't understand something in haskell until I try to reinvent it in a completely different context lol
2021-01-05 16:16:07 +0100 <noop_noob> IO being a monad didn't make sense to me until I tried to think of an alternative way to represent it and got to the exact same point...
2021-01-05 16:16:20 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 16:16:28 +0100 <noop_noob> dminuoso, what do you mean by that?
2021-01-05 16:16:41 +0100 <noop_noob> ski, thx lol
2021-01-05 16:17:16 +0100 <dminuoso> noop_noob: So you could refactor this into:
2021-01-05 16:17:17 +0100Lorra(~lorenzo@2001:a61:ba6:4501:a9e0:bf53:18b7:5b1f) (Quit: Konversation terminated!)
2021-01-05 16:17:27 +0100 <noop_noob> something something Fix?
2021-01-05 16:17:36 +0100phasespace(~sar@80-89-47-117.inet.signal.no) (Ping timeout: 240 seconds)
2021-01-05 16:17:49 +0100cfricke(~cfricke@unaffiliated/cfricke)
2021-01-05 16:18:34 +0100 <dminuoso> data InOutT i o m a = In (i -> InOutT i o m a) | Out o (InOutT i o m a) | Done a | ActionM m (InOutT i o m a)
2021-01-05 16:18:48 +0100 <noop_noob> ActionM?
2021-01-05 16:18:49 +0100 <noop_noob> oh
2021-01-05 16:18:51 +0100 <dminuoso> Sure
2021-01-05 16:18:53 +0100 <noop_noob> Ohhhhh
2021-01-05 16:18:59 +0100 <dminuoso> This lets you have purely monadic pieces, and non-monadic components
2021-01-05 16:19:11 +0100 <dminuoso> Ah wait
2021-01-05 16:19:14 +0100 <dminuoso> I missed some parens there
2021-01-05 16:19:20 +0100 <dminuoso> data InOutT i o m a = In (i -> InOutT i o m a) | Out o (InOutT i o m a) | Done a | ActionM (m (InOutT i o m a))
2021-01-05 16:19:21 +0100 <noop_noob> lol
2021-01-05 16:19:22 +0100 <dminuoso> There
2021-01-05 16:19:49 +0100 <noop_noob> Thx
2021-01-05 16:20:50 +0100noop_noob(31e4c3d3@49.228.195.211) (Remote host closed the connection)
2021-01-05 16:21:02 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Ping timeout: 264 seconds)
2021-01-05 16:21:43 +0100tomboy64(~tomboy64@gateway/tor-sasl/tomboy64) (Ping timeout: 240 seconds)
2021-01-05 16:23:22 +0100tomboy64(~tomboy64@gateway/tor-sasl/tomboy64)
2021-01-05 16:23:29 +0100fendor_(~fendor@91.141.3.164.wireless.dyn.drei.com)
2021-01-05 16:23:46 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:23:47 +0100hake(6e088244@110.8.130.68) (Remote host closed the connection)
2021-01-05 16:25:33 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 16:25:54 +0100fendor(~fendor@178.115.131.182.wireless.dyn.drei.com) (Ping timeout: 260 seconds)
2021-01-05 16:26:35 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:27:21 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 16:28:11 +0100 <Katsa> If u guys have time, I could use some help with the unpack function. data List a b
2021-01-05 16:28:22 +0100 <Katsa> unpack :: List a b -> ([a], [b])
2021-01-05 16:28:32 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:28:36 +0100phasespace(~sar@89-162-33-21.fiber.signal.no)
2021-01-05 16:28:46 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 16:29:26 +0100 <kuribas> Katsa: what's List?
2021-01-05 16:29:27 +0100 <ski> where is this `List' from, how's it defined ?
2021-01-05 16:29:29 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 16:29:56 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:30:41 +0100 <Katsa> List a b = Nil | Cons a b (List a b)
2021-01-05 16:31:03 +0100 <Katsa> (data in the front)
2021-01-05 16:31:10 +0100 <ski> ok, so a `List a b' contain the same number of `a's as `b's
2021-01-05 16:31:17 +0100 <Katsa> yes
2021-01-05 16:31:40 +0100 <ski> how far have you got, with `unpack' ?
2021-01-05 16:32:47 +0100erickLan(~quassel@201.138.29.177) (Read error: Connection reset by peer)
2021-01-05 16:33:28 +0100 <Katsa> getting weird errors, in my mind it was like: "if Nil, then return ([], []), else get recursive result and append a and b to each list"
2021-01-05 16:33:28 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 16:33:59 +0100 <ski> you should be able to do a straight-forward recursion, but you'll probably need to use `where' or `let'-`in' for the recursive call
2021-01-05 16:34:11 +0100 <ski> sounds like a plan
2021-01-05 16:34:12 +0100 <Katsa> wait
2021-01-05 16:35:05 +0100 <Katsa> It works without the "unpack :: List a b -> ([a], [b])"
2021-01-05 16:35:36 +0100 <ski> ask in the interactor what it thinks the type of `unpack' is ?
2021-01-05 16:36:31 +0100 <ski> (type in `:t unpack')
2021-01-05 16:36:33 +0100 <Katsa> kinda ugly "Monad f => List a1 a2 -> f ([a1], [a2])"
2021-01-05 16:36:43 +0100 <ski> oh
2021-01-05 16:36:52 +0100 <ski> you typed in `return' in your code ?
2021-01-05 16:37:18 +0100 <Katsa> uhh yeah
2021-01-05 16:37:19 +0100 <ski> (and possibly used `do' in the recursive case ?)
2021-01-05 16:37:24 +0100 <ski> it ought to be just
2021-01-05 16:37:30 +0100 <ski> unpack Nil = ([],[])
2021-01-05 16:37:53 +0100 <Katsa> oh got it
2021-01-05 16:37:55 +0100 <Katsa> ty
2021-01-05 16:37:56 +0100 <ski> (and then something slightly more involved in the recursive case)
2021-01-05 16:38:44 +0100 <ski> there's no reason to use monadic things here, like `return', or `do'-notation
2021-01-05 16:39:27 +0100 <ski> Katsa : btw, an alternative version that you could play with would be `data SwapList a b = Nil | Cons a (SwapList b a)'
2021-01-05 16:39:44 +0100sqrt2(~ben@unaffiliated/sqrt2) (Ping timeout: 256 seconds)
2021-01-05 16:39:52 +0100sqrt2_(~ben@unaffiliated/sqrt2)
2021-01-05 16:40:02 +0100 <ski> (how does that differ from your `List a b' .. can you still define a version of `unpack' for it ?)
2021-01-05 16:41:00 +0100 <Katsa> uhh no idea, this was in last weeks exam, the data structure was given
2021-01-05 16:41:09 +0100 <ski> ok
2021-01-05 16:41:30 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 16:41:31 +0100 <Katsa> gotta go, thanks for the help again
2021-01-05 16:41:32 +0100zfnmxt(~zfnmxt@unaffiliated/zfnmxt) (Quit: Bye!)
2021-01-05 16:41:36 +0100 <Katsa> have a nice day
2021-01-05 16:41:39 +0100 <ski> no worry. have fun !
2021-01-05 16:41:40 +0100Katsa(b230f459@catv-178-48-244-89.catv.broadband.hu) (Remote host closed the connection)
2021-01-05 16:42:17 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 16:42:23 +0100 <[exa]> "an educative reason to remove `return`"
2021-01-05 16:42:55 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 16:43:26 +0100jonathanx(~jonathan@dyn-8-sc.cdg.chalmers.se)
2021-01-05 16:44:03 +0100nrdmn9(~nrdmn@95.129.53.118) (Quit: Ping timeout (120 seconds))
2021-01-05 16:44:05 +0100 <[exa]> (also kinda wondering who could have scheduled an exam to the "last week" from now)
2021-01-05 16:44:25 +0100nrdmn9(~nrdmn@95.129.53.118)
2021-01-05 16:44:33 +0100 <johnnyboy[m]> how does an expression of the form `[(v1 : v2, xs2) | (v1, xs1) <- p xs, (v2, xs2) <- q xs1]` evaluate?
2021-01-05 16:44:33 +0100madjest16(~Android@89-200-4-148.mobile.kpn.net) (Read error: Connection reset by peer)
2021-01-05 16:44:40 +0100xwvvvvwx(xwvvvvwx@gateway/vpn/mullvad/xwvvvvwx) (Quit: ZNC 1.8.2 - https://znc.in)
2021-01-05 16:44:44 +0100 <dminuoso> @undo [(v1 : v2, xs2) | (v1, xs1) <- p xs, (v2, xs2) <- q xs1]
2021-01-05 16:44:44 +0100 <lambdabot> concatMap (\ (v1, xs1) -> concatMap (\ (v2, xs2) -> [(v1 : v2, xs2)]) (q xs1)) (p xs)
2021-01-05 16:44:47 +0100 <dminuoso> johnnyboy[m]: ^-
2021-01-05 16:44:47 +0100zfnmxt(~zfnmxt@unaffiliated/zfnmxt)
2021-01-05 16:44:51 +0100xwvvvvwx(xwvvvvwx@gateway/vpn/mullvad/xwvvvvwx)
2021-01-05 16:45:21 +0100 <johnnyboy[m]> ah, thanks!
2021-01-05 16:45:41 +0100 <ski> johnnyboy[m] : select each possible combination of a pair `(v1, xs1)' from `p xs', and a pair `(v2, xs2)' from `q xs1', and collect a list of all `(v1 : v2, xs2)', one for each combination
2021-01-05 16:45:42 +0100coot(~coot@37.30.55.141.nat.umts.dynamic.t-mobile.pl) (Quit: coot)
2021-01-05 16:45:56 +0100darjeeling_(~darjeelin@122.245.218.97) (Ping timeout: 240 seconds)
2021-01-05 16:45:56 +0100seliopou(seliopou@entropy.tmok.com) (Ping timeout: 240 seconds)
2021-01-05 16:46:10 +0100 <dminuoso> If Im inside a MonadReader context, is there a sneaky way to gain non-monadic access to the environment in a where binding?
2021-01-05 16:46:39 +0100 <dminuoso> i.e. `f :: ReaderT Env IO (); f = ... where env :: Env; env = ???`
2021-01-05 16:46:59 +0100 <[exa]> dminuoso: eta-expand the whole definition to bind the `r` ?
2021-01-05 16:47:05 +0100ADG1089__(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 16:47:12 +0100seliopou(seliopou@entropy.tmok.com)
2021-01-05 16:47:15 +0100 <[exa]> or `env` in your case
2021-01-05 16:47:32 +0100 <dminuoso> [exa]: What do you mean by eta-expand here?
2021-01-05 16:47:56 +0100Saukk(~Saukk@83-148-239-3.dynamic.lounea.fi)
2021-01-05 16:48:11 +0100 <dminuoso> Ah hold on! What I ask for cant exist
2021-01-05 16:48:13 +0100 <dminuoso> because of
2021-01-05 16:48:16 +0100 <dminuoso> % :t local
2021-01-05 16:48:16 +0100 <yahb> dminuoso: MonadReader r m => (r -> r) -> m a -> m a
2021-01-05 16:48:44 +0100 <[exa]> oh it's readerT, not sure if it will work. I meant something roughly like `f env = (..original..) env` no where needed
2021-01-05 16:49:15 +0100 <dminuoso> Im beginning to wonder whether implicit params are just better than ReaderT..
2021-01-05 16:49:57 +0100 <[exa]> grabbing it "purely" in a where clause sounds completely against the whole idea
2021-01-05 16:50:09 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
2021-01-05 16:50:43 +0100 <[exa]> ...depends on how often you need the params
2021-01-05 16:51:10 +0100 <dminuoso> Well Im in a function where I need this in a lot of where bindings
2021-01-05 16:51:23 +0100 <ski> @type askFor
2021-01-05 16:51:25 +0100 <lambdabot> MonadReader r m => ((?ask::r) => a) -> m a
2021-01-05 16:51:33 +0100emptyflask(~jon@136.49.71.178)
2021-01-05 16:51:50 +0100 <dminuoso> What magic is this? Hoogle knows not of it.
2021-01-05 16:51:58 +0100skijust defined it
2021-01-05 16:52:20 +0100 <ski> askFor :: MonadReader r m => ((?ask :: r) => a) -> m a; askFor a = do r <- ask; let ?ask = r in return a
2021-01-05 16:52:52 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 16:53:27 +0100 <ski> perhaps having `((?ask :: r) => m a) -> m a' would be more useful, maybe ?
2021-01-05 16:53:32 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 16:55:01 +0100Vulfe(~vulfe@75-28-176-196.lightspeed.evtnil.sbcglobal.net) (Remote host closed the connection)
2021-01-05 16:55:23 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Ping timeout: 240 seconds)
2021-01-05 16:55:33 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299)
2021-01-05 16:55:44 +0100machinedgod(~machinedg@135-23-192-217.cpe.pppoe.ca)
2021-01-05 16:56:32 +0100argento(~argent0@168.227.97.29) (Ping timeout: 260 seconds)
2021-01-05 16:56:40 +0100kyali(~kyali@APN-123-251-234-gprs.simobil.net)
2021-01-05 16:57:10 +0100Vulfe(~vulfe@2600:1702:31b0:34e0:54f0:e9d4:232a:a299) (Remote host closed the connection)
2021-01-05 16:57:11 +0100 <ski> f :: ReaderT Env IO (); f = askFor (...) where env :: (?ask :: Env) => Env; env = ?ask -- ought to be possible, with the suggested change above (removing `return' from the definition)
2021-01-05 16:57:16 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Ping timeout: 240 seconds)
2021-01-05 16:57:24 +0100Vulfe(~vulfe@75-28-176-196.lightspeed.evtnil.sbcglobal.net)
2021-01-05 16:57:31 +0100 <kuribas> how do you parse a GADT expression? Do you have to have write a separate parser for each type?
2021-01-05 16:57:48 +0100 <kuribas> for example Parser (Expr Int) , Parser (Expr Bool)
2021-01-05 16:58:44 +0100 <ski> iirc, last time i did it, i did that, and also parsed into an existential
2021-01-05 16:59:12 +0100 <kuribas> ski: or would it be easier to parse into a Dynamic, and let the Dynamic take care of the types?
2021-01-05 16:59:14 +0100darjeeling_(~darjeelin@122.245.218.97)
2021-01-05 16:59:23 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2021-01-05 16:59:44 +0100 <ski> maybe ?
2021-01-05 17:00:25 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 17:00:37 +0100 <glguy> A Dynamic would loose more information than defining: data AnExpr where AnExpr :: Expr a -> AnExpr
2021-01-05 17:02:21 +0100 <kuribas> ah, so you parse into an existential, then you recover the types from the constructors?
2021-01-05 17:02:33 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:02:48 +0100erickLan(~quassel@201.138.29.177)
2021-01-05 17:02:50 +0100 <ski> you could add a `Typeable a' constraint, or perhaps some other constraint(s), in the existential
2021-01-05 17:02:58 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 17:03:12 +0100argento(~argent0@168.227.96.26)
2021-01-05 17:03:15 +0100cfricke(~cfricke@unaffiliated/cfricke) (Quit: WeeChat 3.0)
2021-01-05 17:03:19 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 17:03:28 +0100 <ski> (or perhaps a singleton GADT that directly describes the types that you allow)
2021-01-05 17:03:30 +0100 <glguy> I think it's often easier to parse an typecheck separately, but that would depend on your grammar
2021-01-05 17:03:55 +0100 <glguy> If pattern matching on the constructors of your GADT fully determines the type then that will be enough
2021-01-05 17:04:08 +0100 <kuribas> glguy: so you have a separate untyped structure?
2021-01-05 17:04:37 +0100 <kuribas> parsing into a GADT sounds like type-checking
2021-01-05 17:04:40 +0100 <glguy> well a "less typed" structure, at least
2021-01-05 17:05:22 +0100 <merijn> parsing into a GADT is an exercise in pain and frustration
2021-01-05 17:05:24 +0100 <glguy> Depends on how complicated your typing is
2021-01-05 17:05:44 +0100 <merijn> kuribas: My recommended anaswer to "how do you parse a GADT?" is "don't"
2021-01-05 17:06:05 +0100 <merijn> kuribas: Unless you like singletons hell and/or CPS encoding your entire parser somehow
2021-01-05 17:07:04 +0100 <kuribas> merijn: what if you want to store an expression?
2021-01-05 17:07:10 +0100 <kuribas> and retrieve it...
2021-01-05 17:07:28 +0100 <merijn> kuribas: I've pretty much given up on the idea of using GADTs for stuff like ASTs
2021-01-05 17:07:47 +0100 <merijn> kuribas: It's a nice toy example and works well if your input is "haskell source"
2021-01-05 17:07:49 +0100Vulfe(~vulfe@75-28-176-196.lightspeed.evtnil.sbcglobal.net) (Remote host closed the connection)
2021-01-05 17:08:05 +0100 <merijn> Parsing it from unstructured input (i.e. Text/ByteString) is a fool's errand
2021-01-05 17:09:20 +0100ADG1089_(~aditya@223.236.177.109)
2021-01-05 17:09:42 +0100ADG1089__(~aditya@223.236.177.109) (Read error: Connection reset by peer)
2021-01-05 17:11:10 +0100 <jonathanx> I am writing an event sourced web app, where I want to create an in-memory cache as a naive performance optimization (that will be replaced with something bigger once needed).
2021-01-05 17:11:10 +0100 <jonathanx> The cache is meant to contain the relevant event stream.
2021-01-05 17:11:10 +0100 <jonathanx> The idea is that I want each query request to start by updating the in-memory cache, and then compute/return the query answer.
2021-01-05 17:11:10 +0100 <jonathanx> To avoid duplicate db calls, I want to make it possible for requests to "piggy-back" on requests that has been done recently:
2021-01-05 17:11:11 +0100 <jonathanx> Let's say we have 5 requests that occur almost immediately.
2021-01-05 17:11:15 +0100 <jonathanx> The first request would then start a cache synchronization, fetching any new events and appending them to the in-memory event stream, returning once the cache is updated.
2021-01-05 17:11:18 +0100 <jonathanx> I would like the 4 other requests to wait for the first request's cache synchronization, and then use the recently refreshed value as the basis for their operation.
2021-01-05 17:11:20 +0100Vulfe(~vulfe@75-28-176-196.lightspeed.evtnil.sbcglobal.net)
2021-01-05 17:11:24 +0100 <jonathanx> if there's a request after the cache is synchronized and the 5 preceding ones have returned, the cache should be re-synchronized (i.e. the cache goes stale immediately after "activating" all "registered callbacks")
2021-01-05 17:11:34 +0100 <jonathanx> Any ideas as to what to look into? I've been looking into forkIO/MVar, but feel a bit lost.
2021-01-05 17:12:48 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it) (Quit: Leaving)
2021-01-05 17:13:03 +0100 <merijn> kuribas: To get a sensible parser you'd like the parser's return type to...depend on the input data. So to do it nicely/properly you need dependent types and that's always where the sadness begins ;)
2021-01-05 17:13:35 +0100 <kuribas> merijn: and if I write: parseExprDyn :: Parser Dynamic
2021-01-05 17:14:08 +0100 <merijn> kuribas: How is that different from having an untyped "Expr" type?
2021-01-05 17:14:14 +0100michalz`(~user@185.246.204.79) (Remote host closed the connection)
2021-01-05 17:14:26 +0100 <kuribas> merijn: well, less boilerplate?
2021-01-05 17:14:29 +0100 <merijn> And then just writing typechecking as "Expr -> GADTExpr a"
2021-01-05 17:14:40 +0100 <merijn> eh
2021-01-05 17:14:53 +0100 <merijn> "Expr -> Maybe (GADTExpr a)", of course
2021-01-05 17:15:04 +0100 <merijn> Less boilerplate how?
2021-01-05 17:15:08 +0100 <merijn> What boilerplate?
2021-01-05 17:15:34 +0100 <kuribas> merijn: I don't need to write an existential wrapper.
2021-01-05 17:15:47 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 17:15:53 +0100 <kuribas> and I can use this trick for subexpressions.
2021-01-05 17:16:10 +0100 <merijn> Dynamic *is* an existential wrapper
2021-01-05 17:16:18 +0100 <kuribas> jonathanx: put the cache in the MVar?
2021-01-05 17:16:28 +0100pavonia(~user@unaffiliated/siracusa) (Quit: Bye!)
2021-01-05 17:17:16 +0100 <kuribas> merijn: then it should work no?
2021-01-05 17:17:17 +0100 <merijn> kuribas: Anyway, you'll always need an existential wrapper OR rank2 eliminator when (trying to) work with GADTs parsed from runtime data
2021-01-05 17:17:23 +0100 <glguy> kuribas, using Dynamic will just make extra work. It's much better than the existential wrapper
2021-01-05 17:17:41 +0100 <glguy> so you'll have more cases to check and will get no check that you've checked them all
2021-01-05 17:17:58 +0100 <glguy> delete "It's much better than the existential wrapper"
2021-01-05 17:18:03 +0100 <merijn> kuribas: Well, suppose you've parsed a Dynamic, what are you gonna do with it then?
2021-01-05 17:18:26 +0100 <merijn> How are you gonna put it into your AST?
2021-01-05 17:19:18 +0100 <kuribas> merijn: maybe (Left TypeError) (Right) (fromDynamic parsedDynamic) :: Either TypeError (Expr Int)
2021-01-05 17:19:22 +0100 <kuribas> for example
2021-01-05 17:19:45 +0100 <kuribas> I suppose the existential does the same though...
2021-01-05 17:19:47 +0100 <merijn> kuribas: How's that different from just parsing "Expr Int" directly?
2021-01-05 17:20:06 +0100 <kuribas> merijn: then I don't have to have different parsers for each type.
2021-01-05 17:20:13 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 258 seconds)
2021-01-05 17:20:27 +0100 <merijn> kuribas: Eh, how so?
2021-01-05 17:20:27 +0100 <glguy> The best way to learn that this is a bad idea might just be to do it
2021-01-05 17:20:40 +0100 <kuribas> glguy: yeah, I should try a small toy example.
2021-01-05 17:20:50 +0100ADG1089_(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 17:21:11 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 17:21:29 +0100petersen(~petersen@redhat/juhp)
2021-01-05 17:21:31 +0100 <kuribas> jonathanx: the MVar will block others from reading/writing.
2021-01-05 17:21:49 +0100 <jonathanx> kuribas: I guess I could make each request use readMVar to wait for the cache to appear, and use "takeMVar ... synchronize ... putMVar" to do the synmchronization. But is there a good way to know if someone else is currently synchronizing?
2021-01-05 17:22:21 +0100Stanley00(~stanley00@unaffiliated/stanley00)
2021-01-05 17:22:33 +0100 <kuribas> jonathanx: what do you need to synchronise? The MVar will be accessed sequentially.
2021-01-05 17:24:26 +0100 <kuribas> glguy: I wonder how aeson-gadt-th does this...
2021-01-05 17:25:04 +0100 <jonathanx> kuribas: sorry, I think we have a case of name shadowing here. I mean synchronize as in "update the in-memory event stream so it's up to date with the db"
2021-01-05 17:25:25 +0100boxscape(4ff0ba59@gateway/web/cgi-irc/kiwiirc.com/ip.79.240.186.89) (Ping timeout: 246 seconds)
2021-01-05 17:25:38 +0100 <merijn> jonathanx: tryTakeMVar? :p
2021-01-05 17:25:43 +0100 <merijn> But that's racy
2021-01-05 17:26:25 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 17:26:26 +0100 <jonathanx> if we have 5 close-to-simultaneous queries, I only want to do this once, forcing the first query to do the legwork, while the remaining 4 get to piggy back
2021-01-05 17:26:37 +0100Neo---(~neo@BSN-143-24-54.dynamic.siol.net) (Ping timeout: 264 seconds)
2021-01-05 17:26:52 +0100Stanley00(~stanley00@unaffiliated/stanley00) (Ping timeout: 260 seconds)
2021-01-05 17:27:11 +0100 <jonathanx> if I do it fully sequentially, then each request would need to go check the db for updates, even if there's already a "cache-synchronization" in progress
2021-01-05 17:27:28 +0100 <merijn> oh, wait, I think I have something like this somewhere
2021-01-05 17:28:58 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:29:48 +0100 <kuribas> jonathanx: you want to check if a similar cache request is in progress?
2021-01-05 17:29:51 +0100 <merijn> ah, not quite
2021-01-05 17:30:04 +0100 <kuribas> jonathanx: you could store for each query an MVar where you put the result.
2021-01-05 17:30:20 +0100ADG1089__(~aditya@223.236.177.109) (Client Quit)
2021-01-05 17:30:24 +0100 <kuribas> then if the query is similar, you wait on that MVar.
2021-01-05 17:30:32 +0100 <jonathanx> kuribas: yep, and if there is, I want them to wait for it to finish and then use it's value
2021-01-05 17:30:34 +0100 <merijn> jonathanx: https://github.com/merijn/broadcast-chan/blob/master/broadcast-chan-tests/BroadcastChan/Test.hs#L1…
2021-01-05 17:30:36 +0100Neo---(~neo@BSN-143-26-67.dynamic.siol.net)
2021-01-05 17:30:53 +0100 <shinobi> Haskell does not seem to need tail recursive functions like Scala. Is overflow usually an issue?
2021-01-05 17:31:03 +0100 <merijn> shinobi: The question is flawed
2021-01-05 17:31:18 +0100 <merijn> shinobi: GHC doesn't have a function call stack, therefore you cannot overflow the call stack
2021-01-05 17:33:01 +0100 <MrMuffles[m]> What do you mean it doesn't have a call stack?
2021-01-05 17:33:02 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net)
2021-01-05 17:33:20 +0100 <merijn> MrMuffles[m]: Eh...literally "it doesn't have a call stack"?
2021-01-05 17:33:24 +0100plutoniix(~q@ppp-49-237-20-247.revip6.asianet.co.th)
2021-01-05 17:33:50 +0100 <MrMuffles[m]> Can you link me to something more useful
2021-01-05 17:34:03 +0100 <merijn> @where stg
2021-01-05 17:34:03 +0100 <lambdabot> http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.3729
2021-01-05 17:34:09 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:34:20 +0100 <merijn> MrMuffles[m]: It's a bit long, but that's about as explicit as you can get ;)
2021-01-05 17:35:11 +0100 <merijn> MrMuffles[m]: It basically explains how you can compile a lazy functional language (a super simplified one in their example) to something you can actually run on your CPU
2021-01-05 17:36:04 +0100 <merijn> MrMuffles[m]: It's pretty readable, you don't really need much more knowledge than pattern matching, function application and lambdas to follow it. (Some familiarity with C and/or assembly helps)
2021-01-05 17:36:33 +0100 <MrMuffles[m]> Oh interesting, sounds good
2021-01-05 17:36:52 +0100 <merijn> MrMuffles[m]: The short ELI5 is "call stacks are for losers that care about "returning" to earlier calls"
2021-01-05 17:37:47 +0100erickLan(~quassel@201.138.29.177) (Remote host closed the connection)
2021-01-05 17:38:06 +0100madjest67(~Android@89-200-2-185.mobile.kpn.net)
2021-01-05 17:38:17 +0100spopejoy(~stuart@ool-44c5f8c9.dyn.optonline.net)
2021-01-05 17:38:27 +0100 <dolio> Another angle is that every call in a Haskell program is a tail call, so naturally you don't use stack for those.
2021-01-05 17:38:27 +0100madjest67(~Android@89-200-2-185.mobile.kpn.net) (Read error: Connection reset by peer)
2021-01-05 17:38:35 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net) (Read error: Connection reset by peer)
2021-01-05 17:39:21 +0100 <dolio> Like `E1 : E2` is a tail call to the (:) constuctor with two closures that have just been built.
2021-01-05 17:40:08 +0100 <merijn> MrMuffles[m]: Basically, since there's no statements the only thing you do with functions is "use their result as argument to other functions". So, rather than bothering to return, just pass "the next function" along the code
2021-01-05 17:41:32 +0100 <MrMuffles[m]> Interesting. I feel like I've seen stack traces in haskell though
2021-01-05 17:41:59 +0100 <merijn> MrMuffles[m]: "f x = 2 + x*x" instead of "callling *, returning, then calling +" you can also do "call * and tell it to call '(2+)' with its result"
2021-01-05 17:42:35 +0100 <merijn> (this is also called "continuation passing style" (CPS), because you're, well, passing where to continue.
2021-01-05 17:42:56 +0100 <merijn> Which means you assembly "call" instructions just become jumps
2021-01-05 17:42:59 +0100codedmart_codedmart
2021-01-05 17:43:00 +0100jonathanx(~jonathan@dyn-8-sc.cdg.chalmers.se) (Remote host closed the connection)
2021-01-05 17:43:19 +0100 <glguy> MrMuffles[m]: maybe you saw http://hackage.haskell.org/package/base-4.14.1.0/docs/GHC-Stack.html "Access to GHC's call-stack simulation"
2021-01-05 17:43:20 +0100Saukk(~Saukk@83-148-239-3.dynamic.lounea.fi) (Remote host closed the connection)
2021-01-05 17:43:22 +0100kritzefitz(~kritzefit@212.86.56.80)
2021-01-05 17:43:24 +0100 <merijn> MrMuffles[m]: Yeah, you can get stack traces, but those are more like "logical stack traces", rather than something existing in the implementation
2021-01-05 17:43:49 +0100 <dolio> Building bigger continuations in CPS is equivalent to using stack, though.
2021-01-05 17:43:51 +0100Melanie_Melanie
2021-01-05 17:44:08 +0100 <idnar> > last (scanl (+) 0 [1..1000000])
2021-01-05 17:44:11 +0100 <lambdabot> 500000500000
2021-01-05 17:44:37 +0100 <merijn> idnar: Thoroughly beaten by GHC's optimiser ;)
2021-01-05 17:44:44 +0100 <MrMuffles[m]> Ok this makes sense I think, trippy
2021-01-05 17:45:04 +0100 <MrMuffles[m]> Do other functional languages do this? Clojure?
2021-01-05 17:45:05 +0100 <merijn> MrMuffles[m]: There is still a stack, but it's not for function calls. It's for patterns!
2021-01-05 17:45:27 +0100 <idnar> merijn: yup :(
2021-01-05 17:45:40 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
2021-01-05 17:46:11 +0100 <merijn> MrMuffles[m]: Consider this: "case f x of Nothing -> foo; Just v -> bar v' you need to remember that branch for when 'f x' is done computing, but while computing 'f x' you can (and probably will!) encounter other pattern matches
2021-01-05 17:46:45 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net)
2021-01-05 17:47:08 +0100sshine's BSc project was a compiler for a reversible functional language where, every time you pattern match, you have to un-pattern match, too.
2021-01-05 17:47:11 +0100 <merijn> Although I think the pattern stack is allowed to grow arbitrarily big these days?
2021-01-05 17:47:39 +0100 <dolio> I think it's not arbitrarily big, but might as well be.
2021-01-05 17:47:43 +0100 <glguy> Use all the RAM o/
2021-01-05 17:47:52 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 17:47:52 +0100 <dolio> Like 80% of total RAM or something.
2021-01-05 17:47:59 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net) (Remote host closed the connection)
2021-01-05 17:48:27 +0100ADG1089__(~aditya@223.236.177.109) (Quit: Konversation terminated!)
2021-01-05 17:48:33 +0100 <sshine> dolio, isn't actual memory use while pattern matching a function of code size rather than recursion depth?
2021-01-05 17:48:34 +0100 <merijn> MrMuffles[m]: Anyways, the paper I linked earlier goes into this stuff in far more detail and I highly recommend it for anyone remotely interested in things like "how does Haskell get compiled?"
2021-01-05 17:48:42 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net)
2021-01-05 17:48:43 +0100tanuki_(~quassel@173.168.154.189) (Ping timeout: 256 seconds)
2021-01-05 17:49:30 +0100 <MrMuffles[m]> Thanks it looks worth the read, never realized this about haskell
2021-01-05 17:50:33 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:50:57 +0100ADG1089__(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 17:51:30 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:51:45 +0100 <merijn> MrMuffles[m]: Well, technically this "just" a GHC thing as it's a detail of how GHC implements/compiles Haskell and not fundamentally part of the language spec. The language spec allows all sorts of dumb implementations :p
2021-01-05 17:51:47 +0100tanuki(~quassel@173.168.154.189)
2021-01-05 17:51:58 +0100 <merijn> Hell, the spec doesn't even require laziness
2021-01-05 17:52:31 +0100 <tomsmeding> it doesn't?
2021-01-05 17:52:31 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 17:53:16 +0100 <merijn> tomsmeding: No. It requires "non-strictness" i.e. "if it works lazily, it should work".
2021-01-05 17:53:24 +0100geekosaur(42d52137@66.213.33.55)
2021-01-05 17:53:36 +0100 <tomsmeding> I see
2021-01-05 17:53:40 +0100dfeuer(~dfeuer@pool-108-18-223-60.washdc.fios.verizon.net)
2021-01-05 17:53:47 +0100 <merijn> tomsmeding: If it required laziness then something like the strictness analyzer making things like "tight sums" strict would violate the report
2021-01-05 17:54:10 +0100 <tomsmeding> though I'd imagine it's kind of hard to design an implementation that doesn't do full laziness, but does fulfill that requirement
2021-01-05 17:54:17 +0100hekkaidekapus](~tchouri@gateway/tor-sasl/hekkaidekapus)
2021-01-05 17:54:23 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net) (Ping timeout: 256 seconds)
2021-01-05 17:54:26 +0100 <merijn> tomsmeding: GHC makes things selectively strict
2021-01-05 17:54:43 +0100hekkaidekapus[(~tchouri@gateway/tor-sasl/hekkaidekapus) (Ping timeout: 240 seconds)
2021-01-05 17:55:13 +0100 <tomsmeding> also, isn't this a definitional issue? doesn't the report then effectively say "semantically, the implementation is indistinguishable from lazy"
2021-01-05 17:55:46 +0100Guest62909melkornms
2021-01-05 17:56:01 +0100 <tomsmeding> because if so, I would definitely say the spec requires laziness: that you can do optimisations is immaterial, the spec defines the semantics
2021-01-05 17:56:23 +0100 <tomsmeding> but arguing over terminology is not a great use of everyone's time :)
2021-01-05 17:56:30 +0100 <merijn> tomsmeding: Right, but my point was that that admits many dumb implementations including "try everything strict first with a timeout"
2021-01-05 17:56:38 +0100 <dolio> sshine: No, I don't think so.
2021-01-05 17:56:38 +0100 <tomsmeding> lol
2021-01-05 17:56:51 +0100 <merijn> tomsmeding: So a Haskell implementation is perfectly *allowed* to have a call stack
2021-01-05 17:57:02 +0100 <merijn> tomsmeding: Not having one is an artifact of GHC, not Haskell
2021-01-05 17:57:30 +0100 <tomsmeding> that timeout implementation would be absolutely amazing
2021-01-05 17:57:31 +0100ADG1089__(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 17:57:50 +0100 <dolio> There was a research thing that did a smarter version of that.
2021-01-05 17:57:55 +0100 <tomsmeding> but yes I agree about the distinction about call stacks
2021-01-05 17:58:15 +0100 <merijn> Ha! Yet another one of my stupid ideas vindicated!
2021-01-05 17:58:36 +0100 <tomsmeding> dolio: execute strict and lazy concurrently, throwing away strict in case of an exception?
2021-01-05 17:58:42 +0100 <merijn> tomsmeding: I just brought that up because it's a natural Haskell version of my favourite thought experiment
2021-01-05 17:58:46 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 17:58:57 +0100 <merijn> tomsmeding: The "maximally malicious compiler"
2021-01-05 17:59:04 +0100kyali(~kyali@APN-123-251-234-gprs.simobil.net) (Ping timeout: 256 seconds)
2021-01-05 17:59:16 +0100hnOsmium0001(uid453710@gateway/web/irccloud.com/x-flblofqkdcnkmtsc)
2021-01-05 17:59:34 +0100 <dolio> No. On every function call you try reducing the arguments, in case they're like an accumulator parameter where that's a good thing to do. But you provide a way to bail out if it takes too long.
2021-01-05 17:59:38 +0100danza(~francesco@151.53.94.29)
2021-01-05 17:59:54 +0100 <tomsmeding> dolio: funny
2021-01-05 18:00:00 +0100 <melkornms> hey guys, I'm pretty new to Haskell, can you help me understand this piece of code? I put the question at the end of the code import Data.Char
2021-01-05 18:00:02 +0100 <melkornms> import Data.Monoid
2021-01-05 18:00:04 +0100 <melkornms> isForbidden = getAny . foldMap (Any .) [isLower, isDigit]
2021-01-05 18:00:06 +0100 <melkornms> main :: IO ()
2021-01-05 18:00:06 +0100 <merijn> Which someone proposed as thought experiment for crypto-code written in C. The maximally malicious compiler being a compiler that complies to the letter of the spec, while being actively malicious in its interpretation
2021-01-05 18:00:08 +0100 <dolio> And you also keep track of which things you've already done that to, to avoid wasting asymptotic amounts of time.
2021-01-05 18:00:08 +0100 <melkornms> main = do
2021-01-05 18:00:10 +0100 <melkornms> print $ isForbidden 'A'
2021-01-05 18:00:12 +0100 <melkornms> print $ isForbidden 'a'
2021-01-05 18:00:14 +0100 <melkornms> print $ isForbidden '1'
2021-01-05 18:00:16 +0100kritzefitz_(~kritzefit@212.86.56.80)
2021-01-05 18:00:16 +0100 <melkornms> -- Given that:
2021-01-05 18:00:17 +0100 <tomsmeding> melkornms: please use a pastebin, IRC does not support multiline messages
2021-01-05 18:00:18 +0100 <melkornms> -- foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
2021-01-05 18:00:20 +0100 <melkornms> -- How is it that the isForbidden works? I would assume the [isLower, isDigit] are wrapped in Any, but actually it receives 'A' / 'a' / '1', calls isLower / isDigit and then wraps in Any. I just don't see how that is?
2021-01-05 18:00:22 +0100 <melkornms> SORRY, I meant to post a link :(
2021-01-05 18:00:24 +0100 <tomsmeding> @where paste
2021-01-05 18:00:24 +0100 <lambdabot> Help us help you: please paste full code, input and/or output at eg https://paste.tomsmeding.com
2021-01-05 18:00:24 +0100 <melkornms> https://repl.it/@MelkorNemesis/Monoids#main.hs
2021-01-05 18:00:29 +0100chenshen(~chenshen@2620:10d:c090:400::5:7d59)
2021-01-05 18:00:30 +0100 <tomsmeding> ah
2021-01-05 18:00:41 +0100 <melkornms> my bad, had something different in the clipboard
2021-01-05 18:00:59 +0100 <dolio> It has some advantages. Like foldl and similar just do the thing people want.
2021-01-05 18:01:03 +0100 <merijn> melkornms: The missing piece you should look at is: What is the Monoid instance of Any?
2021-01-05 18:01:04 +0100 <tomsmeding> merijn: like gcc?
2021-01-05 18:01:14 +0100 <merijn> :t foldMap
2021-01-05 18:01:15 +0100 <lambdabot> (Foldable t, Monoid m) => (a -> m) -> t a -> m
2021-01-05 18:01:33 +0100chenshen(~chenshen@2620:10d:c090:400::5:7d59) (Client Quit)
2021-01-05 18:01:41 +0100 <dsal> > let isForbidden = getAny . foldMap (Any .) [isLower, isDigit] in map isForbidden "Aa1"
2021-01-05 18:01:43 +0100 <lambdabot> [False,True,True]
2021-01-05 18:01:45 +0100 <merijn> melkornms: 'foldMap f' is just "mconcat . map f"
2021-01-05 18:02:07 +0100kritzefitz_(~kritzefit@212.86.56.80) (Remote host closed the connection)
2021-01-05 18:02:09 +0100s00pcan(~chris@107.181.165.217) (Ping timeout: 260 seconds)
2021-01-05 18:02:29 +0100 <ezzieyguywuf> is it possible to do something in, say, ~/.cabal/config such that cabal-install never installs missing packages, but rather just complains about it?
2021-01-05 18:02:32 +0100 <merijn> oh, I guess it's actually two monoids
2021-01-05 18:02:39 +0100 <tomsmeding> also ((->) r)
2021-01-05 18:02:51 +0100 <tomsmeding> tricky code
2021-01-05 18:02:57 +0100 <merijn> melkornms: You need to look at "instance Monoid Any" and "instance Monoid r => Monoid (a -> r)" :)
2021-01-05 18:02:58 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 18:02:59 +0100 <dolio> I think it's a lot more complicated, though.
2021-01-05 18:03:18 +0100 <melkornms> merijn: thanks mate
2021-01-05 18:03:20 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 18:03:44 +0100s00pcan(~chris@075-133-056-178.res.spectrum.com)
2021-01-05 18:03:45 +0100 <tomsmeding> @type \x -> any ($ x) [isLower, isDigit]
2021-01-05 18:03:45 +0100 <merijn> "Monoid r => Monoid (a -> r)" is the best monoid instance ever
2021-01-05 18:03:46 +0100 <lambdabot> Char -> Bool
2021-01-05 18:03:49 +0100livvy(~livvy@gateway/tor-sasl/livvy)
2021-01-05 18:03:51 +0100 <tomsmeding> whats wrong with a bit of pointedness
2021-01-05 18:03:53 +0100Cale(~cale@cpef48e38ee8583-cm0c473de9d680.cpe.net.cable.rogers.com) (Read error: Connection reset by peer)
2021-01-05 18:03:55 +0100crblmr(~carbolyme@matrix.dropacid.net) (Ping timeout: 246 seconds)
2021-01-05 18:04:06 +0100 <merijn> tomsmeding: That doesn't generalise to multiple arguments :p
2021-01-05 18:04:09 +0100 <tomsmeding> it's shorter too!
2021-01-05 18:04:11 +0100 <dsal> :t (Any . isDigit) <> (Any . isLower)
2021-01-05 18:04:12 +0100 <lambdabot> Char -> Any
2021-01-05 18:04:35 +0100 <dsal> :> ((Any . isDigit) <> (Any . isLower)) 'a'
2021-01-05 18:04:40 +0100 <dsal> > ((Any . isDigit) <> (Any . isLower)) 'a'
2021-01-05 18:04:42 +0100 <lambdabot> Any {getAny = True}
2021-01-05 18:04:44 +0100crblmr(~carbolyme@matrix.dropacid.net)
2021-01-05 18:04:48 +0100 <dolio> Oh, by the way, the other thing that uses stack in GHC's evaluation model is updates for lazily evaluated thunks. So ironically, tail recursion can use a lot of stack by producing an accumulated value with a bunch of updates.
2021-01-05 18:05:11 +0100 <dolio> If you aren't careful enough.
2021-01-05 18:05:52 +0100 <tomsmeding> ezzieyguywuf: make ~/.cabal non-writable?
2021-01-05 18:06:10 +0100 <tomsmeding> or probably a particular subdirectory
2021-01-05 18:07:36 +0100 <melkornms> thanks guys, it'll take me some time to digest
2021-01-05 18:08:07 +0100argento(~argent0@168.227.96.26) (Ping timeout: 246 seconds)
2021-01-05 18:08:20 +0100 <tomsmeding> melkornms: the Monoid instance of (a -> r) takes quite a bit of Haskell experience to fully appreciate
2021-01-05 18:08:23 +0100 <ezzieyguywuf> tomsmeding: yea, that was my thought too, just wasn't sure if there was a config for it.
2021-01-05 18:08:33 +0100 <tomsmeding> whether then at some point you _stop_ appreciating it again, depends on the person
2021-01-05 18:09:25 +0100 <melkornms> tomsmeding: how can I check the implementation for "instance Monoid Any"?
2021-01-05 18:09:43 +0100 <merijn> melkornms: Hackage has a link to the source
2021-01-05 18:10:08 +0100 <merijn> melkornms: https://hackage.haskell.org/package/base-4.14.1.0/docs/Data-Monoid.html#t:Any
2021-01-05 18:10:23 +0100 <merijn> See the "source" link next to "Monoid Any"
2021-01-05 18:10:55 +0100 <melkornms> merijn: beautiful, thanks
2021-01-05 18:11:27 +0100 <merijn> melkornms: I guess you'll also want the Semigroup instance now that "mappend = (Semigroup.<>)
2021-01-05 18:11:30 +0100 <merijn> "
2021-01-05 18:13:18 +0100ADG1089__(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 18:14:33 +0100YR9PdkmvPz(~Thunderbi@p200300ef9713f485f93cae4d2b099a66.dip0.t-ipconnect.de)
2021-01-05 18:15:37 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 18:15:51 +0100chele(~chele@ip5b40237d.dynamic.kabel-deutschland.de) (Remote host closed the connection)
2021-01-05 18:15:58 +0100 <tomsmeding> ezzieyguywuf: potentially relevant: https://github.com/haskell/cabal/issues/6515
2021-01-05 18:16:21 +0100 <tomsmeding> hm, not really
2021-01-05 18:16:47 +0100 <kuribas> is there a idiom for (if test then someFun else id) $ ...
2021-01-05 18:16:48 +0100 <kuribas> ?
2021-01-05 18:17:12 +0100ADG1089__(~aditya@223.236.177.109) (Client Quit)
2021-01-05 18:17:53 +0100 <merijn> kuribas: How often do you need/use it?
2021-01-05 18:18:19 +0100 <kuribas> merijn: it occurs sometimes... With my new database library it would be common way to modify a query.
2021-01-05 18:18:21 +0100lidenbrock(bd21e75d@189.33.231.93)
2021-01-05 18:18:31 +0100 <jared-w> The bool function? It's vaguely controversial because its order is bool else then test
2021-01-05 18:19:43 +0100 <kuribas> :t bool
2021-01-05 18:19:45 +0100 <lambdabot> a -> a -> Bool -> a
2021-01-05 18:19:52 +0100 <jared-w> http://hackage.haskell.org/package/overhang-1.0.0/docs/Overhang.html maybe this concept?
2021-01-05 18:19:53 +0100 <ezzieyguywuf> tomsmeding: it does seem relevant, thanks.
2021-01-05 18:20:33 +0100YR9PdkmvPz(~Thunderbi@p200300ef9713f485f93cae4d2b099a66.dip0.t-ipconnect.de) (Quit: YR9PdkmvPz)
2021-01-05 18:20:38 +0100 <merijn> kuribas: You could use Endo and my personal favourite unnamed "mif" (i.e. "Monoid a => Bool -> a -> a") but might not be worth the effort
2021-01-05 18:20:54 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net)
2021-01-05 18:21:17 +0100 <kuribas> I have that one, but called whenMono :-)
2021-01-05 18:21:20 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 18:22:59 +0100Forlorn(~Forlorn@unaffiliated/forlorn)
2021-01-05 18:25:02 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 18:25:32 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 18:26:24 +0100 <jared-w> merijn: read that as milf at first and had to do a second take
2021-01-05 18:26:46 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net)
2021-01-05 18:27:38 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Remote host closed the connection)
2021-01-05 18:27:54 +0100lidenbrock(bd21e75d@189.33.231.93) (Remote host closed the connection)
2021-01-05 18:27:59 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5)
2021-01-05 18:28:31 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net) (Remote host closed the connection)
2021-01-05 18:29:22 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net)
2021-01-05 18:30:35 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Ping timeout: 256 seconds)
2021-01-05 18:32:28 +0100v_m_v(~vm_v@2a02:aa12:3200:6480:14d3:e041:99da:4fe5) (Ping timeout: 260 seconds)
2021-01-05 18:32:55 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 18:33:13 +0100 <tomsmeding> merijn: that function is only to be used in the event that one is miffed
2021-01-05 18:33:36 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net) (Ping timeout: 240 seconds)
2021-01-05 18:39:45 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 18:39:53 +0100ADG1089__(~aditya@223.236.177.109)
2021-01-05 18:39:56 +0100argento(~argent0@168.227.96.26)
2021-01-05 18:40:04 +0100crblmr(~carbolyme@matrix.dropacid.net) (Remote host closed the connection)
2021-01-05 18:42:10 +0100christo(~chris@81.96.113.213)
2021-01-05 18:42:16 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 18:42:57 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 18:43:45 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 240 seconds)
2021-01-05 18:47:04 +0100 <kuribas> Couldn't match expected type ‘Scientific’ with actual type ‘scientific-0.3.6.2:Data.Scientific.Scientific’
2021-01-05 18:47:05 +0100 <kuribas> what?
2021-01-05 18:47:24 +0100 <kuribas> I did :set -package scientific-0.3.6.2
2021-01-05 18:47:34 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Remote host closed the connection)
2021-01-05 18:47:39 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de) (Ping timeout: 260 seconds)
2021-01-05 18:47:42 +0100 <geekosaur> wrong version of the package, usually, or same version but different abi hash
2021-01-05 18:48:25 +0100 <kuribas> so if I want to experiment I need to make a .cabal file?
2021-01-05 18:48:48 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 18:49:02 +0100 <geekosaur> probably
2021-01-05 18:49:04 +0100 <c_wraith> well, it's a very easy solution.
2021-01-05 18:49:11 +0100 <geekosaur> at least, that's the safe way\
2021-01-05 18:49:41 +0100 <c_wraith> you could fix it other ways, but they take a lot more work. (cabal is really good now)
2021-01-05 18:49:44 +0100 <merijn> ugh
2021-01-05 18:49:59 +0100 <merijn> Persistent stopped generating show instances for Unique? >.>
2021-01-05 18:50:30 +0100LKoen(~LKoen@174.175.9.109.rev.sfr.net)
2021-01-05 18:50:52 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 18:50:59 +0100 <c_wraith> sounds like a victim of the "Show should generate valid code" brigade
2021-01-05 18:51:44 +0100 <merijn> Rats
2021-01-05 18:51:53 +0100 <merijn> I used that to pretty print errors in places
2021-01-05 18:51:54 +0100ADG1089__(~aditya@223.236.177.109) (Remote host closed the connection)
2021-01-05 18:52:16 +0100 <merijn> Now I have to figure out how to make it derive those instances again
2021-01-05 18:52:36 +0100 <merijn> c_wraith: But it had derived Show instances anyway...
2021-01-05 18:52:52 +0100 <monochrom> kuribas: https://cabal.readthedocs.io/en/3.4/cabal-commands.html#cabal-v2-run then look for "also supports running script files", this is the least-scaffolding way to use cabal-install
2021-01-05 18:55:52 +0100kyali(~kyali@37.166.193.18)
2021-01-05 18:57:07 +0100 <kuribas> monochrom: but then how do I use it with flycheck on emacs?
2021-01-05 18:57:24 +0100 <monochrom> I don't know.
2021-01-05 18:59:17 +0100 <kuribas> I don't think there is another way to tell flycheck to use a package than using cabal...
2021-01-05 18:59:26 +0100 <kuribas> with v1 it would just pick up a global package
2021-01-05 19:00:16 +0100danso(~dan@23-233-111-39.cpe.pppoe.ca) (Quit: WeeChat 3.0)
2021-01-05 19:00:18 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 19:02:42 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net)
2021-01-05 19:04:10 +0100L29Ah(~L29Ah@unaffiliated/l29ah) (Read error: Connection reset by peer)
2021-01-05 19:07:47 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 260 seconds)
2021-01-05 19:11:20 +0100geekosaur(42d52137@66.213.33.55) (Ping timeout: 245 seconds)
2021-01-05 19:11:29 +0100 <merijn> Thank god for standalone deriving...
2021-01-05 19:12:01 +0100 <koz_> Friends don't let friends drink and derive.
2021-01-05 19:13:39 +0100Ariakenom(~Ariakenom@2001:9b1:efb:fc00:e95c:b04f:cb75:a96)
2021-01-05 19:14:09 +0100gehmehgeh(~ircuser1@gateway/tor-sasl/gehmehgeh) (Quit: Leaving)
2021-01-05 19:14:19 +0100 <Uniaika> thank fuck for deriving strategies
2021-01-05 19:14:20 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
2021-01-05 19:14:57 +0100 <koz_> Uniaika: The only correct way to mix alcohol and derivation.
2021-01-05 19:16:15 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 19:16:34 +0100Sheilong(uid293653@gateway/web/irccloud.com/x-sukkcsrudpgtylmw)
2021-01-05 19:16:56 +0100 <kuribas> glguy: getExpr :: SomeExpr -> Expr a; getExpr (SomeExpr exp) = exp => couldn't match type a1 with a
2021-01-05 19:17:16 +0100 <merijn> kuribas: Yes, you can't do that
2021-01-05 19:17:26 +0100 <koz_> kuribas: You can't leak out of a GADT like that.
2021-01-05 19:17:28 +0100 <merijn> kuribas: You can never "unpack" an existential like that
2021-01-05 19:17:41 +0100 <koz_> The 'internal' type of the expression can't be used outside of the GADT's 'scope'.
2021-01-05 19:17:48 +0100 <merijn> kuribas: You need "SomeExpr -> (forall a . Expr a -> c) -> c"
2021-01-05 19:17:50 +0100 <koz_> You have to either repack it, or turn it into something that isn't that.
2021-01-05 19:17:59 +0100 <koz_> Or do that.
2021-01-05 19:18:13 +0100 <kuribas> so parsing a GADT amounts to CPS styling everything?
2021-01-05 19:18:18 +0100 <merijn> kuribas: Yes
2021-01-05 19:18:25 +0100 <merijn> kuribas: That's what I was saying earlier
2021-01-05 19:18:27 +0100 <glguy> kuribas: or asking for a specific type
2021-01-05 19:18:39 +0100 <glguy> it doesn't make sense to unpack the expression to a type the *caller* gets to pick
2021-01-05 19:19:12 +0100 <Uniaika> koz_: haha
2021-01-05 19:19:53 +0100 <glguy> kuribas: your getExpr means I can do: getExpr :: SomeExpr -> Expr GlguysType
2021-01-05 19:20:00 +0100 <glguy> does your GADT support GlguysType?
2021-01-05 19:21:22 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it)
2021-01-05 19:21:29 +0100 <kuribas> it doesn't :)
2021-01-05 19:22:45 +0100 <dminuoso> falsifian: Looks like quantified constraints to me
2021-01-05 19:23:26 +0100 <dminuoso> https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/quantified_constraints.html
2021-01-05 19:25:10 +0100stree(~stree@50-108-70-224.adr01.mskg.mi.frontiernet.net)
2021-01-05 19:25:26 +0100L29Ah_(~L29Ah@46.138.243.239)
2021-01-05 19:26:07 +0100stree_(~stree@50-108-97-132.adr01.mskg.mi.frontiernet.net) (Ping timeout: 268 seconds)
2021-01-05 19:26:37 +0100geekosaur(42d52137@66.213.33.55)
2021-01-05 19:30:03 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 19:32:53 +0100dhil(~dhil@78.156.97.38) (Quit: Leaving)
2021-01-05 19:34:28 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Remote host closed the connection)
2021-01-05 19:36:05 +0100eacameron(uid256985@gateway/web/irccloud.com/x-sggmrofinlhiriab)
2021-01-05 19:36:57 +0100kyali(~kyali@37.166.193.18) (Ping timeout: 260 seconds)
2021-01-05 19:37:57 +0100Ko60(d4ee8a9a@212-238-138-154.ip.xs4all.nl)
2021-01-05 19:38:01 +0100mirrorbird(~psutcliff@2a00:801:42b:8314:3772:eb7f:91f1:698c)
2021-01-05 19:40:27 +0100Tops2(~Tobias@dyndsl-095-033-094-030.ewe-ip-backbone.de)
2021-01-05 19:41:00 +0100Lord_of_Life(~Lord@unaffiliated/lord-of-life/x-0885362) (Read error: Connection reset by peer)
2021-01-05 19:41:57 +0100Lord_of_Life(~Lord@unaffiliated/lord-of-life/x-0885362)
2021-01-05 19:43:39 +0100L29Ah_(~L29Ah@46.138.243.239) (Quit: Gateway shutdown)
2021-01-05 19:45:00 +0100L29Ah(~L29Ah@unaffiliated/l29ah)
2021-01-05 19:45:22 +0100jfe(~user@pool-71-184-149-134.bstnma.fios.verizon.net)
2021-01-05 19:46:05 +0100nineonine(~nineonine@S01061cabc0b095f3.vf.shawcable.net) (Remote host closed the connection)
2021-01-05 19:46:43 +0100nineonine(~nineonine@50.216.62.2)
2021-01-05 19:47:26 +0100jamm(~jamm@unaffiliated/jamm)
2021-01-05 19:48:49 +0100bitmagie(~Thunderbi@i59F53551.versanet.de)
2021-01-05 19:51:48 +0100jamm(~jamm@unaffiliated/jamm) (Ping timeout: 260 seconds)
2021-01-05 19:52:38 +0100 <falsifian> Thanks dminuoso. I figured it out a few minutes after asking.
2021-01-05 19:54:59 +0100Lord_of_Life_(~Lord@unaffiliated/lord-of-life/x-0885362)
2021-01-05 19:56:27 +0100u0_a298(~user@47.206.148.226)
2021-01-05 19:56:37 +0100Lord_of_Life(~Lord@unaffiliated/lord-of-life/x-0885362) (Ping timeout: 246 seconds)
2021-01-05 19:56:37 +0100Lord_of_Life_Lord_of_Life
2021-01-05 19:57:59 +0100dhouthoo(~dhouthoo@ptr-eitgbj2w0uu6delkbrh.18120a2.ip6.access.telenet.be) (Quit: WeeChat 2.9)
2021-01-05 20:01:24 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 20:02:42 +0100jpds(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2021-01-05 20:02:46 +0100 <kuribas> merijn: so you end up not using GADTs at all?
2021-01-05 20:02:53 +0100nhs_(~nhs@c-67-180-177-103.hsd1.ca.comcast.net) (Remote host closed the connection)
2021-01-05 20:02:56 +0100andreas303(~andreas@gateway/tor-sasl/andreas303) (Remote host closed the connection)
2021-01-05 20:02:58 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 20:03:14 +0100 <kuribas> funny because I would say an AST is the best example for GADTs
2021-01-05 20:03:20 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 20:03:21 +0100jpds(~jpds@gateway/tor-sasl/jpds)
2021-01-05 20:03:34 +0100berberman_(~berberman@unaffiliated/berberman)
2021-01-05 20:03:43 +0100kyali(~kyali@37.166.130.114)
2021-01-05 20:04:13 +0100Ko60(d4ee8a9a@212-238-138-154.ip.xs4all.nl) (Remote host closed the connection)
2021-01-05 20:04:22 +0100berberman(~berberman@unaffiliated/berberman) (Ping timeout: 260 seconds)
2021-01-05 20:06:09 +0100andreas303(~andreas@gateway/tor-sasl/andreas303)
2021-01-05 20:08:45 +0100bitmagie(~Thunderbi@i59F53551.versanet.de) (Ping timeout: 240 seconds)
2021-01-05 20:08:51 +0100 <kuribas> I wonder how aeson-gadt-th solves this...
2021-01-05 20:09:02 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 264 seconds)
2021-01-05 20:09:34 +0100argento(~argent0@168.227.96.26) (Ping timeout: 246 seconds)
2021-01-05 20:09:56 +0100kyali(~kyali@37.166.130.114) (Ping timeout: 240 seconds)
2021-01-05 20:10:37 +0100 <tomsmeding> kuribas: you can work with existentials in two ways: CPS-ing everything, or using datatypes that wrap the existential
2021-01-05 20:10:48 +0100 <tomsmeding> consider: data Some f = forall a. Some (f a)
2021-01-05 20:11:11 +0100 <tomsmeding> then your parser might be: parse :: String -> Maybe (Some Expr)
2021-01-05 20:11:27 +0100 <tomsmeding> or, in CPS style, it might be: parse :: String -> (forall a. Maybe (Expr a) -> r) -> r
2021-01-05 20:11:44 +0100 <kuribas> tomsmeding: that doesn't solve subexpressions
2021-01-05 20:11:52 +0100 <kuribas> say ID :: Expr a -> Expr a
2021-01-05 20:12:02 +0100 <kuribas> how do you parse that?
2021-01-05 20:12:31 +0100 <tomsmeding> is the type of the subexpression unambiguous without looking at the rest?
2021-01-05 20:12:38 +0100 <tomsmeding> if so, dynamic type checking
2021-01-05 20:12:53 +0100 <kuribas> no, I could have Bottom :: Expr a
2021-01-05 20:12:56 +0100 <tomsmeding> if not, no idea, I think you have to make an untyped copy of the Expr type, or do Dynamic hackery
2021-01-05 20:13:06 +0100 <tomsmeding> oh but that particular one works fine
2021-01-05 20:13:28 +0100bitmagie(~Thunderbi@200116b80605280078abfa9c48cb4ecd.dip.versatel-1u1.de)
2021-01-05 20:13:29 +0100 <tomsmeding> okay, refinement: is the polytype of the subexpression unambiguous without looking at the rest?
2021-01-05 20:13:47 +0100 <kuribas> I don't know what you mean
2021-01-05 20:14:14 +0100 <tomsmeding> your Bottom has type ∀a. a, which is completely valid, unambiguous polymorphic type (polytype)
2021-01-05 20:14:45 +0100coot(~coot@37.30.55.141.nat.umts.dynamic.t-mobile.pl)
2021-01-05 20:15:03 +0100 <tomsmeding> so your parser that parses Bottom really has type Parser (Expr a), since the 'a' can really be chosen by the caller
2021-01-05 20:15:21 +0100 <tomsmeding> even GlguysType
2021-01-05 20:15:25 +0100notzmv(~user@unaffiliated/zmv) (Remote host closed the connection)
2021-01-05 20:16:09 +0100 <tomsmeding> hm, though that wouldn't work well with your ID
2021-01-05 20:16:27 +0100 <tomsmeding> personally I would do runtime type checking I think
2021-01-05 20:17:00 +0100 <tomsmeding> add singleton representations of the type to the constructors of your GADT, and return 'Some Expr' from your parsers
2021-01-05 20:17:12 +0100argento(~argent0@168.227.96.26)
2021-01-05 20:18:33 +0100 <tomsmeding> then if you want to parse something like Greater :: Expr Int -> Expr Int -> Expr Bool, you'd parse two expressions, check using pattern matching that the singletons in those parsed expressions are really the singleton for Int (thereby getting GADT evidence that the existential type of them is Int), and then put them in Greater
2021-01-05 20:18:53 +0100 <tomsmeding> but this is parsing and type-checking in one
2021-01-05 20:19:12 +0100 <tomsmeding> if you want to separate the stages completely, I think you'll have to go with some untyped intermediate expresssion type
2021-01-05 20:20:32 +0100 <tomsmeding> do I make sense? :')
2021-01-05 20:23:09 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 20:24:39 +0100 <kuribas> yeah, but it sounds complicated
2021-01-05 20:25:08 +0100 <jfe> hi all
2021-01-05 20:25:36 +0100 <jfe> i'm working through a haskell tutorial and was just wondering what you all like about haskell (not that it will change my mind about learning it)
2021-01-05 20:27:10 +0100 <jfe> so far i really like the functor concept. i'm not sure if it comes from category theory (never studied it) but it's nice to have a name for something that i've seen or done in other languages but never had a name for.
2021-01-05 20:27:38 +0100 <tomsmeding> kuribas: how are you envisioning doing type checking now then, assuming parsing is somehow magically done? :p
2021-01-05 20:27:45 +0100 <tomsmeding> type checking is complicated
2021-01-05 20:28:19 +0100 <__monty__> jfe: It challenged me to think of problems in a different way than I used to and I liked it : )
2021-01-05 20:29:04 +0100 <tomsmeding> jfe: same as __monty__, it invites a different way of thinking about problems that is sometimes closer to my mental model of the problem
2021-01-05 20:29:48 +0100 <aplainzetakind> jfe: I like the expressiveness of the type system. Also laziness.
2021-01-05 20:29:50 +0100 <tomsmeding> also jfe: haskell's Functor is different from, and AFAIK unrelated to, category theory's functor concept; and both are unrelated to what C++ calls a functor :)
2021-01-05 20:31:08 +0100 <kuribas> tomsmeding: by singleton, do you mean a dependent type?
2021-01-05 20:31:12 +0100 <hyperisco> f maps objects and fmap maps morphisms, together you have a functor
2021-01-05 20:31:28 +0100 <jfe> i like the laziness too. it's cool how it enables the definition of control flow structures using plain functions. in other languages, you need lambda everywhere to do the late-binding
2021-01-05 20:31:45 +0100 <jfe> to delay evaluation, i mean.
2021-01-05 20:31:45 +0100 <tomsmeding> kuribas: data MyType a where TInt :: MyType Int ; TBool :: MyType Bool ; TPair :: MyType a -> MyType b -> MyType (a, b)
2021-01-05 20:31:51 +0100chenshen(~chenshen@2620:10d:c090:400::5:507b)
2021-01-05 20:31:51 +0100 <__monty__> I learned haskell right after prolog so my initial reaction was "What's so different about this?" But then someone wanted to use it for a course project and I was like "Why not?" And then I just ran with it.
2021-01-05 20:32:03 +0100 <kuribas> tomsmeding: indeed
2021-01-05 20:32:22 +0100 <tomsmeding> kuribas: not sure I'd call that a "dependent type", but as long as we both know what we're talking about :)
2021-01-05 20:32:52 +0100 <hyperisco> Haskell's Functor (in base) just isn't as general as it could be
2021-01-05 20:32:57 +0100 <monochrom> I like the parameteric polymorphism as a very constraining tool when I give students homework.
2021-01-05 20:33:12 +0100darjeeling_(~darjeelin@122.245.218.97) (Ping timeout: 256 seconds)
2021-01-05 20:33:18 +0100tomsmeding. o O ( Theorems for Free! )
2021-01-05 20:34:26 +0100 <monochrom> For example when the question is "implement BST insert for data BST a = Nil | Node a (BST a) (BST a)", my test cases can just test for BST Integer, but students aren't allowed to write code tailor-made to Integer.
2021-01-05 20:34:27 +0100Lycurgus(~niemand@cpe-45-46-139-165.buffalo.res.rr.com)
2021-01-05 20:34:36 +0100 <monochrom> In Scheme, the teacher cannot do this.
2021-01-05 20:34:51 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 20:36:18 +0100 <Lycurgus> https://www.youtube.com/watch?v=QpDTcefoWEQ issat general enuf?
2021-01-05 20:36:19 +0100 <monochrom> In Scheme, if the homework question is "write this function: if the parameter is not a list, do X; if the parameter is a list, recurse elementwise, and do Y to combine their answers"
2021-01-05 20:36:42 +0100 <monochrom> and if your examples have integers for the non-list case
2021-01-05 20:37:32 +0100 <hyperisco> jfe, I like how Haskell makes formal reasoning easier while still being a practical programming tool
2021-01-05 20:37:37 +0100 <monochrom> you can bet that students are not going to simply "if list? x then recursive case else base case". They have to overcommit to integers, "if integer? x then base case else recursive case".
2021-01-05 20:38:00 +0100 <monochrom> In Haskell, students don't have that freedom.
2021-01-05 20:39:18 +0100 <glguy> class MonochromsTypes a where homework :: a -> Result :nod:
2021-01-05 20:39:43 +0100 <__monty__> monochrom: Your students sound like spec fuzzers.
2021-01-05 20:39:44 +0100 <glguy> instance MonochromsTypes a => MonochromsTypes [a]; instance MonochromsTypes Integer
2021-01-05 20:39:57 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Ping timeout: 260 seconds)
2021-01-05 20:40:11 +0100 <glguy> *but it worked for the examples*
2021-01-05 20:41:34 +0100 <glguy> __monty__: I'd expect if you give a bunch of people the same spec (any group, any spec) you're likely to get a couple different interpretations, even if they aren't trying to be clever
2021-01-05 20:41:35 +0100jfe(~user@pool-71-184-149-134.bstnma.fios.verizon.net) (Remote host closed the connection)
2021-01-05 20:41:48 +0100jfe(~user@pool-71-184-149-134.bstnma.fios.verizon.net)
2021-01-05 20:43:51 +0100 <idnar> monochrom: it's also easier to write correct code since there are fewer incorrect implementations that will compile
2021-01-05 20:44:12 +0100Wamanuz2(~wamanuz@78-70-34-81-no84.tbcn.telia.com) (Quit: Konversation terminated!)
2021-01-05 20:44:46 +0100 <merijn> idnar: It's not easier to write correct code, it's just harder to write incorrec tcode ;)
2021-01-05 20:44:55 +0100 <merijn> @quote everything.is.hard
2021-01-05 20:44:55 +0100 <lambdabot> roconnor says: writing incorrect programs in Haskell is hard. but writing correct programs is hard in every langauge. therefore, writing code in Haskell is hard. <EvanR> everything is hard in
2021-01-05 20:44:55 +0100 <lambdabot> haskell ;) <kmc> that's a pretty good summary
2021-01-05 20:44:59 +0100 <monochrom> They are equivalent.
2021-01-05 20:46:13 +0100Wamanuz(~wamanuz@78-70-34-81-no84.tbcn.telia.com)
2021-01-05 20:46:35 +0100cheater1(~user@unaffiliated/cheater)
2021-01-05 20:47:29 +0100glguyremembers the past when people said quotable things :)
2021-01-05 20:48:01 +0100 <merijn> glguy: Well, be funnier then! :p
2021-01-05 20:48:05 +0100cheater(~user@unaffiliated/cheater) (Ping timeout: 240 seconds)
2021-01-05 20:48:10 +0100cheater1cheater
2021-01-05 20:48:38 +0100 <glguy> merijn: this is as funny as I get; I'm not holding back!
2021-01-05 20:48:53 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 20:49:15 +0100 <hyperisco> I think finding the correct program you actually want is the hard bit
2021-01-05 20:49:55 +0100mputz(~Thunderbi@dslb-088-064-063-125.088.064.pools.vodafone-ip.de)
2021-01-05 20:50:10 +0100darjeeling_(~darjeelin@122.245.218.97)
2021-01-05 20:50:36 +0100 <hyperisco> if it was all just retroactively convincing the compiler, there wouldn't be much purpose
2021-01-05 20:52:01 +0100 <argento> but is an incorrect program code?
2021-01-05 20:52:12 +0100 <idnar> I wrote some code in Python where I had two parameters swapped; it didn't fail at runtime because the concrete types still lined up. When I ported it to Haskell, I accidentally introduced the same bug; but this time it was a type error because of polymorphism.
2021-01-05 20:52:38 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 20:53:15 +0100 <hyperisco> argento, that is possible, ideally
2021-01-05 20:56:58 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net) (Quit: -a- Connection Timed Out)
2021-01-05 20:57:00 +0100 <jfe> i also like the haskell programs can be compiled.
2021-01-05 20:58:43 +0100rayyyy(~nanoz@gateway/tor-sasl/nanoz) (Ping timeout: 240 seconds)
2021-01-05 20:59:17 +0100 <jfe> i'm sort of "over" using scripting languages now, except for cases where they offer the most direct solution. better to use go or haskell and get type safety and faster execution.
2021-01-05 20:59:46 +0100evanjs(~evanjs@075-129-098-007.res.spectrum.com) (Quit: ZNC 1.8.2 - https://znc.in)
2021-01-05 21:00:59 +0100madjestic(~Android@86-88-72-244.fixed.kpn.net)
2021-01-05 21:02:02 +0100evanjs(~evanjs@075-129-098-007.res.spectrum.com)
2021-01-05 21:02:55 +0100christo(~chris@81.96.113.213)
2021-01-05 21:02:57 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 21:03:19 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 21:03:49 +0100jneira(5127ac9c@gateway/web/cgi-irc/kiwiirc.com/ip.81.39.172.156) (Ping timeout: 246 seconds)
2021-01-05 21:03:59 +0100christo(~chris@81.96.113.213) (Read error: Connection reset by peer)
2021-01-05 21:04:00 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Quit: Lost terminal)
2021-01-05 21:04:13 +0100aidecoe_aidecoe
2021-01-05 21:04:22 +0100wroathe(~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
2021-01-05 21:04:36 +0100christo(~chris@81.96.113.213)
2021-01-05 21:05:24 +0100terrorjack(~terrorjac@static.23.111.201.195.clients.your-server.de) (Ping timeout: 268 seconds)
2021-01-05 21:08:56 +0100Wamanuz2(~wamanuz@78-70-34-81-no84.tbcn.telia.com)
2021-01-05 21:09:13 +0100christo(~chris@81.96.113.213) (Ping timeout: 264 seconds)
2021-01-05 21:10:36 +0100Rudd0(~Rudd0@185.189.115.108) (Ping timeout: 240 seconds)
2021-01-05 21:11:37 +0100jfe(~user@pool-71-184-149-134.bstnma.fios.verizon.net) (Quit: ERC (IRC client for Emacs 27.1))
2021-01-05 21:11:44 +0100Wamanuz(~wamanuz@78-70-34-81-no84.tbcn.telia.com) (Ping timeout: 256 seconds)
2021-01-05 21:12:02 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 21:12:35 +0100terrorjack(~terrorjac@static.23.111.201.195.clients.your-server.de)
2021-01-05 21:16:40 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 21:17:12 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net) (Ping timeout: 272 seconds)
2021-01-05 21:17:18 +0100Tesseraction(~Tesseract@unaffiliated/tesseraction) (Remote host closed the connection)
2021-01-05 21:17:49 +0100bitmagie(~Thunderbi@200116b80605280078abfa9c48cb4ecd.dip.versatel-1u1.de) (Quit: bitmagie)
2021-01-05 21:19:40 +0100geekosaur(42d52137@66.213.33.55) (Ping timeout: 245 seconds)
2021-01-05 21:20:04 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Ping timeout: 256 seconds)
2021-01-05 21:20:27 +0100 <koz_> @pl \acc (x, y) -> HM.insert x y acc
2021-01-05 21:20:27 +0100 <lambdabot> (`ap` snd) . (. fst) . flip (flip . HM.insert)
2021-01-05 21:20:32 +0100 <koz_> .... OK then.
2021-01-05 21:21:57 +0100Lycurgus(~niemand@cpe-45-46-139-165.buffalo.res.rr.com) ("Deus Ex")
2021-01-05 21:22:13 +0100xff0x(~fox@2001:1a81:52a7:8200:12ff:8333:fcb3:6365) (Ping timeout: 260 seconds)
2021-01-05 21:22:14 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93) (Quit: Quit 啾)
2021-01-05 21:22:51 +0100xff0x(~fox@2001:1a81:52a7:8200:c9d3:4e06:9d3c:df41)
2021-01-05 21:22:52 +0100 <sm[m]> jfe: haskell isn't too bad as a scripting language either
2021-01-05 21:22:53 +0100 <monochrom> HM.fromList
2021-01-05 21:22:57 +0100pthariensflame(~pthariens@2600:6c52:7280:100:d1bf:7ea:2ee2:f0ba)
2021-01-05 21:23:09 +0100 <koz_> monochrom: ... I feel real smart right now.
2021-01-05 21:23:15 +0100 <monochrom> haha
2021-01-05 21:23:28 +0100 <glguy> flip (uncurry insert) :: Ord k => Map k a -> (k, a) -> Map k a
2021-01-05 21:23:37 +0100 <glguy> I'm not saying do that, but it's not as bad as lambdabot guessed
2021-01-05 21:23:46 +0100taurux(~taurux@net-93-144-87-101.cust.vodafonedsl.it)
2021-01-05 21:24:05 +0100pthariensflame(~pthariens@2600:6c52:7280:100:d1bf:7ea:2ee2:f0ba) (Client Quit)
2021-01-05 21:24:57 +0100pavonia(~user@unaffiliated/siracusa)
2021-01-05 21:26:02 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93)
2021-01-05 21:28:19 +0100Tesseraction(~Tesseract@unaffiliated/tesseraction)
2021-01-05 21:30:31 +0100 <tomsmeding> lambdabot isn't perfect? :o
2021-01-05 21:32:08 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it) (Quit: Leaving)
2021-01-05 21:35:40 +0100geekosaur(42d52137@66.213.33.55)
2021-01-05 21:36:21 +0100electricityZZZZ(~electrici@108-216-157-17.lightspeed.sntcca.sbcglobal.net) (Read error: Connection reset by peer)
2021-01-05 21:39:23 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93) (Quit: Quit 啾)
2021-01-05 21:39:58 +0100MidAutumnHotaru(~MidAutumn@154.91.197.93)
2021-01-05 21:40:17 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 21:40:36 +0100cole-h(~cole-h@c-73-48-197-220.hsd1.ca.comcast.net)
2021-01-05 21:47:31 +0100 <kuribas> tomsmeding, merijn, glguy: I have something that seems to work... https://gist.github.com/kuribas/e97f408cff059896d3df5e9975229294
2021-01-05 21:47:48 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 21:48:45 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837) (Ping timeout: 272 seconds)
2021-01-05 21:48:57 +0100dandels(~dandels@unaffiliated/dandels)
2021-01-05 21:49:10 +0100bitmagie(~Thunderbi@200116b80605280008c19424c544e900.dip.versatel-1u1.de)
2021-01-05 21:49:31 +0100 <kuribas> no singletons, CPS style, etc ... :-)
2021-01-05 21:49:57 +0100bitmagie(~Thunderbi@200116b80605280008c19424c544e900.dip.versatel-1u1.de) (Client Quit)
2021-01-05 21:50:22 +0100 <kuribas> it'll default Expr a to Expr Int though...
2021-01-05 21:50:48 +0100 <tomsmeding> and it'll parse ID (ID (ID (ID ... (ID x) ...))) two times
2021-01-05 21:50:57 +0100 <tomsmeding> neat though, what is Parser?
2021-01-05 21:51:35 +0100 <kuribas> tomsmeding: Aeson parser
2021-01-05 21:51:46 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it)
2021-01-05 21:51:47 +0100 <tomsmeding> ah
2021-01-05 21:52:31 +0100 <kuribas> I don't see the problem with ID?
2021-01-05 21:52:38 +0100 <tomsmeding> I think this works in a reasonable manner because you have only two types
2021-01-05 21:53:01 +0100 <tomsmeding> replace x with "kaas"
2021-01-05 21:53:04 +0100 <merijn> Also, you're still implementing a parser per possible type
2021-01-05 21:53:19 +0100 <tomsmeding> the parseExpr @Int will traverse the whole thing, fail, and parseExpr @Text will try again
2021-01-05 21:53:40 +0100 <tomsmeding> my "singletons" idea would allow you to not make a separate parser for each type :p
2021-01-05 21:53:43 +0100 <kuribas> ah right
2021-01-05 21:53:58 +0100 <tomsmeding> but, if it works, it works! :)
2021-01-05 21:54:09 +0100justsomeguy(~justsomeg@unaffiliated/--/x-3805311)
2021-01-05 21:54:48 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net) (Read error: Connection reset by peer)
2021-01-05 21:55:00 +0100 <kuribas> merijn: true, but they don't overlap much
2021-01-05 21:55:22 +0100 <kuribas> merijn: it looks linear, not exponential
2021-01-05 21:56:48 +0100 <kuribas> I think aeson-gadt-th does something like this.
2021-01-05 21:57:00 +0100 <kuribas> however it failed with an error on my Expr type.
2021-01-05 21:57:32 +0100fradet(~pi@216.252.75.247)
2021-01-05 21:58:16 +0100 <kuribas> merijn: for example parseExp @Int only parses the Plus constructor, then calls the polymorphic one.
2021-01-05 22:01:01 +0100 <kuribas> tomsmeding: for my usecase I don't expect deeply nested polymorphism.
2021-01-05 22:01:36 +0100 <tomsmeding> it _is_ nice and compact
2021-01-05 22:02:58 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr) (Quit: Konversation terminated!)
2021-01-05 22:03:21 +0100zebrag(~inkbottle@aaubervilliers-654-1-6-52.w83-200.abo.wanadoo.fr)
2021-01-05 22:03:31 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 22:05:35 +0100knupfer(~Thunderbi@200116b8241228009cdcb3fffe910848.dip.versatel-1u1.de)
2021-01-05 22:05:37 +0100knupfer(~Thunderbi@200116b8241228009cdcb3fffe910848.dip.versatel-1u1.de) (Client Quit)
2021-01-05 22:05:59 +0100knupfer(~Thunderbi@200116b8241228003936c8de4da397ac.dip.versatel-1u1.de)
2021-01-05 22:06:08 +0100dycan(~dycan@101-137-241-111.mobile.dynamic.aptg.com.tw)
2021-01-05 22:06:15 +0100kuribas(~user@ptr-25vy0i92z2b7cinncha.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 26.3))
2021-01-05 22:07:53 +0100dycan(~dycan@101-137-241-111.mobile.dynamic.aptg.com.tw) (Remote host closed the connection)
2021-01-05 22:12:31 +0100_ht(~quassel@82-169-194-8.biz.kpn.net) (Remote host closed the connection)
2021-01-05 22:12:47 +0100bitmagie(~Thunderbi@200116b80605280008c19424c544e900.dip.versatel-1u1.de)
2021-01-05 22:14:04 +0100Tops2(~Tobias@dyndsl-095-033-094-030.ewe-ip-backbone.de) (Read error: Connection reset by peer)
2021-01-05 22:14:25 +0100Guest73365(~textual@mskresolve-a.mskcc.org) (Quit: Textual IRC Client: www.textualapp.com)
2021-01-05 22:16:06 +0100rmk236(~lcampos@2a02:908:3616:b100:ad41:f5e6:8b3a:bfc3) (Quit: Leaving.)
2021-01-05 22:20:05 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt) (Remote host closed the connection)
2021-01-05 22:23:13 +0100cgadski(~cgadski@a95-95-106-208.cpe.netcabo.pt)
2021-01-05 22:24:29 +0100christo(~chris@81.96.113.213)
2021-01-05 22:25:41 +0100kyali(~kyali@APN-123-251-234-gprs.simobil.net)
2021-01-05 22:26:12 +0100kritzefitz(~kritzefit@212.86.56.80) (Remote host closed the connection)
2021-01-05 22:26:57 +0100 <dfeuer> chessai: I'd love your opinion on touch vs touchless in https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4681
2021-01-05 22:27:19 +0100Vindaloo(~Vindaloo@70.129.133.37.dynamic.jazztel.es)
2021-01-05 22:27:22 +0100olligobber(olligobber@gateway/vpn/privateinternetaccess/olligobber) (Remote host closed the connection)
2021-01-05 22:27:33 +0100 <Vindaloo> hi ^^
2021-01-05 22:28:00 +0100arahael(~arahael@194-193-194-178.tpgi.com.au) (Ping timeout: 256 seconds)
2021-01-05 22:30:12 +0100Deide(~Deide@217.155.19.23) (Quit: Seeee yaaaa)
2021-01-05 22:30:27 +0100chenshen(~chenshen@2620:10d:c090:400::5:507b) (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
2021-01-05 22:30:39 +0100coot(~coot@37.30.55.141.nat.umts.dynamic.t-mobile.pl) (Quit: coot)
2021-01-05 22:33:36 +0100jonn(~sweater@206.81.18.26)
2021-01-05 22:35:00 +0100chenshen(~chenshen@2620:10d:c090:400::5:507b)
2021-01-05 22:37:17 +0100knupfer(~Thunderbi@200116b8241228003936c8de4da397ac.dip.versatel-1u1.de) (Ping timeout: 268 seconds)
2021-01-05 22:37:17 +0100xff0x(~fox@2001:1a81:52a7:8200:c9d3:4e06:9d3c:df41) (Ping timeout: 268 seconds)
2021-01-05 22:38:03 +0100xff0x(~fox@2001:1a81:52a7:8200:f535:aeb9:901:74c1)
2021-01-05 22:38:19 +0100Jesin(~Jesin@pool-72-66-101-18.washdc.fios.verizon.net)
2021-01-05 22:39:12 +0100kyali(~kyali@APN-123-251-234-gprs.simobil.net) (Remote host closed the connection)
2021-01-05 22:39:40 +0100Cheery_(~cheery@7-239-179-185.static.tentacle.fi) (Quit: leaving)
2021-01-05 22:41:56 +0100u0_a298(~user@47.206.148.226) (Read error: Connection reset by peer)
2021-01-05 22:42:15 +0100u0_a298(~user@47.206.148.226)
2021-01-05 22:44:35 +0100mpereira(~mpereira@2a02:810d:f40:d96:5cc6:836f:afa7:e837)
2021-01-05 22:44:35 +0100u0_a298(~user@47.206.148.226) (Read error: Connection reset by peer)
2021-01-05 22:45:18 +0100u0_a298(~user@47.206.148.226)
2021-01-05 22:49:41 +0100jneira(5127ac9c@gateway/web/cgi-irc/kiwiirc.com/ip.81.39.172.156)
2021-01-05 22:50:25 +0100geekosaur(42d52137@66.213.33.55) (Remote host closed the connection)
2021-01-05 22:50:34 +0100 <dmj`> An exact implementation of the Haskell2010 BNF in happy results in 30 reduce / reduce conflicts.
2021-01-05 22:51:05 +0100 <dmj`> maybe this explains why GHC's Parser.y is a complete garbage fire
2021-01-05 22:51:09 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
2021-01-05 22:51:15 +0100dandels(~dandels@unaffiliated/dandels) (Ping timeout: 256 seconds)
2021-01-05 22:52:20 +0100 <dfeuer> dmj`: yeah, the Haskell designers seem to have taken the view that "if we can parse it, we can add it", without enough consideration of "if it's hard to parse, it'll be hard for users to parse, and hard to extend the syntax".
2021-01-05 22:52:41 +0100 <merijn> BNFs aren't full grammars, though
2021-01-05 22:53:06 +0100 <merijn> And I don't know many people who bother to rewrite their BNF with extra complications just to make that work
2021-01-05 22:53:29 +0100 <merijn> Does happy not have a GLR mode?
2021-01-05 22:53:41 +0100 <dmj`> dfeuer: sad, imo the singular reason why we don't see more Haskell dialects is because of the poor specification that is the Haskell language, and the resulting /spaghetti/ code that ensues from it.
2021-01-05 22:53:48 +0100 <[exa]> like, even bison has something like %expect_conflicts 30
2021-01-05 22:53:59 +0100 <dmj`> [exa]: purescript its like 90
2021-01-05 22:54:09 +0100 <dmj`> GHC I think is 200 ?
2021-01-05 22:54:15 +0100 <[exa]> wait wait
2021-01-05 22:54:32 +0100 <dmj`> %expect 236 -- shift/reduce conflicts
2021-01-05 22:54:39 +0100 <dmj`> [exa]: yes
2021-01-05 22:55:14 +0100 <[exa]> how does lack of (likely redundant) smiting in parsers correspond to spaghetti code?
2021-01-05 22:55:25 +0100 <merijn> [exa]: It doesn't really
2021-01-05 22:55:30 +0100 <dmj`> GHC attempts to thread the lexer inside of the parser, its super complicated, its usage is /advanced/ to say the least.
2021-01-05 22:57:00 +0100 <monochrom> Isn't Haskll2010 BNF deliberately ambiguous but only because of unknown-at-CFG-time user-defined operator precedence?
2021-01-05 22:57:48 +0100chenshen(~chenshen@2620:10d:c090:400::5:507b) (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
2021-01-05 22:57:48 +0100 <[exa]> anyway
2021-01-05 22:58:00 +0100 <monochrom> And GHC's could be a mess just because of multitudes of slightly conflicting extensions.
2021-01-05 22:58:17 +0100 <[exa]> given the number of language extensions that might be higher than the number of s/r conflicts, I guess the stats is still very good
2021-01-05 22:58:21 +0100 <dmj`> monochrom: possible, yea. Definitely the latter (conflicting extension hell)
2021-01-05 22:58:46 +0100 <[exa]> dmj`: if in doubt, compare with PHP
2021-01-05 22:59:25 +0100 <dmj`> monochrom: I think GHCs approach for this (at least in the lexer) is to layer it with new "modes", and detect based on a single character which new mode to enter. GHC definitely does this for multiline nested comments.
2021-01-05 22:59:36 +0100 <dmj`> where each mode is a new extension
2021-01-05 22:59:46 +0100 <dmj`> The parser you can barely make heads or tails of whats going on
2021-01-05 23:00:03 +0100stree(~stree@50-108-70-224.adr01.mskg.mi.frontiernet.net) (Quit: Caught exception)
2021-01-05 23:00:08 +0100roconnor(~roconnor@host-184-164-7-193.dyn.295.ca)
2021-01-05 23:00:20 +0100stree(~stree@50-108-70-224.adr01.mskg.mi.frontiernet.net)
2021-01-05 23:00:43 +0100Rudd0(~Rudd0@185.189.115.108)
2021-01-05 23:00:54 +0100 <dmj`> [exa]: no excuse in 2020 to have a bad spec, swift unfortunately is like this too, they only cared about the IR and LLVM backend, frontend was an after thought and its not a clean parse either, very bespoke hand rolled C++ disaster
2021-01-05 23:02:47 +0100chenshen(~chenshen@2620:10d:c090:400::5:507b)
2021-01-05 23:02:54 +0100 <dmj`> there should be child seizure warnings when reading GHC's Parser.y
2021-01-05 23:02:57 +0100LKoen(~LKoen@174.175.9.109.rev.sfr.net) (Quit: “It’s only logical. First you learn to talk, then you learn to think. Too bad it’s not the other way round.”)
2021-01-05 23:03:41 +0100 <monochrom> heh
2021-01-05 23:03:43 +0100mirrorbird(~psutcliff@2a00:801:42b:8314:3772:eb7f:91f1:698c) (Ping timeout: 260 seconds)
2021-01-05 23:04:23 +0100livvy(~livvy@gateway/tor-sasl/livvy) (Ping timeout: 240 seconds)
2021-01-05 23:04:57 +0100 <monochrom> True of every piece of software that has accumulated decades of incrementally adding features.
2021-01-05 23:06:22 +0100Tops2(~Tobias@dyndsl-095-033-094-030.ewe-ip-backbone.de)
2021-01-05 23:06:45 +0100 <[exa]> dmj`: many people tried to do better and failed, question is why?
2021-01-05 23:07:17 +0100 <[exa]> (including the as-far-as-I-know-unfinished "write you a haskell" effort)
2021-01-05 23:08:50 +0100 <dmj`> [exa]: he quit the effort right at the desugaring part, which would have implied an AST, and a working parser (which is probably the exact reason he gave up on the effort)
2021-01-05 23:09:28 +0100 <dmj`> people hate working on compiler frontends, death by a thousand paper cuts, but if you're going to create a language for other people, frontend is just as important as backend
2021-01-05 23:10:27 +0100 <[exa]> perhaps we don't have a sufficient model for extensible parsers/minilanguages/sublanguages yet?
2021-01-05 23:10:42 +0100 <[exa]> a "monad jump" for parsers I'd say
2021-01-05 23:11:21 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33) (Remote host closed the connection)
2021-01-05 23:11:24 +0100theorbtwo(~theorb@cpc81822-swin19-2-0-cust3.3-1.cable.virginm.net)
2021-01-05 23:13:17 +0100abhixec(~abhixec@c-67-169-139-16.hsd1.ca.comcast.net)
2021-01-05 23:14:39 +0100__monty__(~toonn@unaffiliated/toonn) (Quit: leaving)
2021-01-05 23:15:55 +0100 <dmj`> I bet parsing ocaml isn't this bad
2021-01-05 23:16:56 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
2021-01-05 23:17:01 +0100hyperisco(~hyperisco@d192-186-117-226.static.comm.cgocable.net) (Ping timeout: 264 seconds)
2021-01-05 23:17:34 +0100takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2021-01-05 23:19:20 +0100philopsos(~caecilius@gateway/tor-sasl/caecilius)
2021-01-05 23:22:45 +0100usr25(~usr25@unaffiliated/usr25)
2021-01-05 23:22:55 +0100christo(~chris@81.96.113.213) (Remote host closed the connection)
2021-01-05 23:23:56 +0100notzmv(~user@unaffiliated/zmv)
2021-01-05 23:26:08 +0100 <[exa]> dmj`: are you ready to open the ocaml source?
2021-01-05 23:26:11 +0100 <[exa]> :]
2021-01-05 23:27:56 +0100 <monochrom> Is there a seizure warning or something? parent guidance required?
2021-01-05 23:28:25 +0100 <monochrom> There will be m4, IIRC. Probably a different evil in its own right.
2021-01-05 23:30:16 +0100Franciman(~francesco@host-82-48-174-127.retail.telecomitalia.it) (Quit: Leaving)
2021-01-05 23:31:42 +0100 <[exa]> ok let's find out
2021-01-05 23:31:58 +0100Tuplanolla(~Tuplanoll@91-159-68-239.elisa-laajakaista.fi) (Quit: Leaving.)
2021-01-05 23:32:49 +0100[exa]clicks ocaml/yacc directory
2021-01-05 23:32:58 +0100 <[exa]> oh noes all files are *.c
2021-01-05 23:35:54 +0100u0_a298(~user@47.206.148.226) (Ping timeout: 272 seconds)
2021-01-05 23:36:29 +0100geowiesnot(~user@i15-les02-ix2-87-89-181-157.sfr.lns.abo.bbox.fr)
2021-01-05 23:37:00 +0100 <dmj`> ocaml has libraries like menhir
2021-01-05 23:40:09 +0100 <dmj`> and the language itself probably isn't as ambiguous
2021-01-05 23:40:14 +0100heatsink(~heatsink@2600:1700:bef1:5e10:dfd:1630:16ef:2f33)
2021-01-05 23:40:18 +0100 <dmj`> [exa]: C is just for speed probably
2021-01-05 23:40:36 +0100 <dmj`> monochrom: This Parser is rated TV-MA
2021-01-05 23:40:57 +0100 <dmj`> at least TV-14
2021-01-05 23:43:24 +0100bitmapper(uid464869@gateway/web/irccloud.com/x-naqbxzlsevlmbjnm) (Quit: Connection closed for inactivity)
2021-01-05 23:43:54 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl)
2021-01-05 23:45:16 +0100 <jackdk> Package maintenance question: Does there exist a tool to check whether the upper bounds of a cabal file are excluding newer versions that are on hackage?
2021-01-05 23:45:43 +0100 <monochrom> "This program contains C code. Parental discretion is advised."
2021-01-05 23:46:10 +0100 <dmj`> @package bumper
2021-01-05 23:46:10 +0100 <lambdabot> https://hackage.haskell.org/package/bumper
2021-01-05 23:46:14 +0100 <dmj`> @jackdk ^ ?
2021-01-05 23:46:15 +0100 <lambdabot> Unknown command, try @list
2021-01-05 23:46:28 +0100 <monochrom> "Parents, talk to your children about qbits and C before it's too late."
2021-01-05 23:46:34 +0100 <monochrom> err qubits!
2021-01-05 23:47:59 +0100 <monochrom> jackdk: Also, "cabal oudated"
2021-01-05 23:48:56 +0100merijn(~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
2021-01-05 23:49:51 +0100 <jackdk> monochrom: thanks, that's exactly what I want. dmj`: thanks for the suggestion though
2021-01-05 23:50:05 +0100zaquest(~notzaques@5.128.210.178) (Quit: Leaving)
2021-01-05 23:50:15 +0100olban(~olban@213.152.161.133) (Ping timeout: 256 seconds)
2021-01-05 23:50:21 +0100justanotheruser(~justanoth@unaffiliated/justanotheruser) (Ping timeout: 272 seconds)
2021-01-05 23:50:23 +0100mirrorbird(~psutcliff@m83-187-174-153.cust.tele2.se)
2021-01-05 23:50:26 +0100 <dmj`> never knew about 'cabal outdated'
2021-01-05 23:50:36 +0100 <dmj`> I thought monochrom was literally saying that cabal was outdated
2021-01-05 23:50:37 +0100 <sm[m]> Also, some thing with a RSS feed you can subscribe to, maybe at packdeps.haskellers.com
2021-01-05 23:51:09 +0100 <dmj`> but I knew monochrom wouldn't touch stack with a 10ft pole
2021-01-05 23:52:21 +0100ransom(~c4264035@8.47.12.52) (Read error: Connection reset by peer)
2021-01-05 23:52:26 +0100 <jackdk> Yeah, we're moving away from stack but the LTS system did give us a nice package update story. `cabal outdated` seems like a better replacement
2021-01-05 23:53:27 +0100 <monochrom> heh
2021-01-05 23:56:28 +0100usr256(~usr25@unaffiliated/usr25)
2021-01-05 23:59:29 +0100ezrakilty(~ezrakilty@75-172-99-84.tukw.qwest.net)
2021-01-05 23:59:51 +0100usr25(~usr25@unaffiliated/usr25) (Ping timeout: 272 seconds)