Home liberachat/#haskell: Logs Calendar

Logs on 2022-05-05 (liberachat/#haskell)

00:01:20 × werneta quits (~werneta@137.79.199.110) (Ping timeout: 260 seconds)
00:02:47 alp_ joins (~alp@user/alp)
00:04:24 frost joins (~frost@user/frost)
00:04:35 × Katarushisu quits (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) (Quit: Ping timeout (120 seconds))
00:04:54 Katarushisu joins (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net)
00:08:36 × jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds)
00:12:00 × frost quits (~frost@user/frost) (Quit: Client closed)
00:12:35 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
00:12:35 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
00:12:35 wroathe joins (~wroathe@user/wroathe)
00:14:34 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5)
00:14:46 <EvanR> in satisfactory there's an intermediate item called "AI limiter". Maybe we need "Turing completeness limiter"
00:15:22 <monochrom> We have timeouts. Is that good enough? :)
00:15:25 <dminuoso> Is that like a circuit board component I can solder on, EvanR?
00:15:39 <EvanR> yes
00:15:52 <monochrom> Right? If my computer is unresponsive for a minute, I unplug it. My limiter.
00:16:10 xff0x joins (~xff0x@om126167102105.29.openmobile.ne.jp)
00:16:11 <monochrom> Except for laptops. That's harder.
00:16:28 <EvanR> the level of automation there is also like satisfactory (low)
00:16:35 <dminuoso> We actually did have turbo button many eons ago.
00:16:47 × zyklotomic quits (~ethan@res380d-128-61-86-82.res.gatech.edu) (Ping timeout: 256 seconds)
00:16:49 <dminuoso> A precursor to turing limiters.
00:16:53 <monochrom> Oh w00t turbo button. Yeah I had one.
00:17:06 <EvanR> people used it like a limiter
00:17:10 <monochrom> Err wait how is that limiting haha
00:17:19 <EvanR> by default you leave turbo on
00:17:33 <dminuoso> Yes, the turbo button was just a limiter with an inverted name.
00:17:33 zyklotomic joins (~ethan@res380d-128-61-84-187.res.gatech.edu)
00:17:36 <EvanR> then when necessary go "subturbo"
00:17:39 <monochrom> OK that's throttling if you turn it off. But it doesn't stop.
00:17:42 <dminuoso> Turbo sounds more positive than throttle.
00:18:05 <monochrom> The reset button is closer to a limiter.
00:18:12 <EvanR> they should bring back that marketing
00:18:16 <dminuoso> The power button is a turing limiter.
00:18:21 <monochrom> Yeah.
00:18:24 <dminuoso> Press it, and turing completeness is limited to 0.
00:18:33 <EvanR> your ISP will no longer throttle you, rather, they will take away your turbo
00:20:04 × Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
00:20:18 <EvanR> you guys are joking about limiting turing completeness by turning it off, unplugging it, or activate the self destruct ordinance. And a great idea goes out the window xD
00:21:52 <dminuoso> That was not a joke.
00:22:07 <dminuoso> But an odinance turing limiter sounds exciting. Tell me more.
00:22:09 <dminuoso> Do you have a video?
00:23:45 <hpc> ah yes, the principle of explosion
00:24:29 <monochrom> EvanR: What is the great idea?
00:24:55 <monochrom> Ordinance has detonational semantics >:)
00:25:35 <monochrom> https://mail.haskell.org/pipermail/haskell-cafe/2011-January/088315.html
00:27:48 × tommd quits (~tommd@97-120-41-123.ptld.qwest.net) (Ping timeout: 248 seconds)
00:27:49 <hpc> musical semantics is genius
00:28:04 <dminuoso> @remember monochrom Ordinance has detonational semantics >:)
00:28:04 <lambdabot> I will remember.
00:29:46 <seydar> another day, another attempt to implement blurhash
00:33:06 <seydar> Axman6 described it as "super compressed JPG", so now i'm trying to understand the JuicyPixels implementation of JPG encoding
00:36:17 shapr joins (~user@184.81.59.2)
00:45:37 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
00:53:38 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection)
00:58:51 Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
00:59:05 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds)
01:01:14 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
01:02:07 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
01:02:28 × CAT_S quits (apic@brezn3.muc.ccc.de) (Ping timeout: 248 seconds)
01:06:11 seydar joins (~seydar@154-27-113-252.starry-inc.net)
01:06:24 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 252 seconds)
01:06:27 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 276 seconds)
01:09:54 kaiepi joins (~Kaiepi@156.34.47.253)
01:12:23 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
01:12:35 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
01:12:35 allbery_b joins (~geekosaur@xmonad/geekosaur)
01:12:38 allbery_b is now known as geekosaur
01:15:29 CAT_S joins (apic@brezn3.muc.ccc.de)
01:20:36 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 248 seconds)
01:25:20 × gurkenglas quits (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 260 seconds)
01:29:11 × stackdroid18 quits (14094@user/stackdroid) (Quit: hasta la vista... tchau!)
01:29:17 seydar joins (~seydar@154-27-113-252.starry-inc.net)
01:35:27 <sm[i]> > <monochrom> And BTW to answer those who said I was too trigger-happy last time: I saw good regulars leaving this channel precisely because we fed the trolls instead of banning.
01:35:28 <lambdabot> <hint>:1:1: error: parse error on input ‘<’
01:36:02 <sm[i]> I am usually one of those. I get that it's a fine line and difficult to judge sometimes.
01:36:33 <sm[i]> for me, when a channel becomes too intolerant and cliquish, it's the sign of an calcifying community and time to move on
01:36:59 <sm[i]> avoid either extreme, and cool the temperature, is the goal for a channel op I think
01:37:39 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 276 seconds)
01:37:45 × shapr quits (~user@184.81.59.2) (Remote host closed the connection)
01:38:03 shapr joins (~user@184.81.59.2)
01:38:24 andrey_ joins (~andrey@p200300dbcf1053000b1abd83a6152638.dip0.t-ipconnect.de)
01:38:50 <sm[i]> monochrom, sometimes I get the feeling you enjoy the ban hammer a little more than a good op should. Just my humble and respectful 2c
01:38:55 <EvanR> seydar, that was me, too at least
01:40:51 × andrey__ quits (~andrey@p508d5cc9.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
01:41:58 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
01:42:27 × shapr quits (~user@184.81.59.2) (Ping timeout: 256 seconds)
01:42:56 shapr joins (~user@184.81.59.2)
01:43:00 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 248 seconds)
01:45:04 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
01:47:54 <EvanR> /mode +b nutter This hurts the community more than it hurts you
01:47:58 seydar joins (~seydar@154-27-113-252.starry-inc.net)
01:48:35 × kaiepi quits (~Kaiepi@156.34.47.253) (Ping timeout: 256 seconds)
01:52:36 × alp_ quits (~alp@user/alp) (Ping timeout: 252 seconds)
01:52:48 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds)
01:53:15 tommd joins (~tommd@97-120-41-123.ptld.qwest.net)
01:57:45 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 248 seconds)
02:00:49 × Unicorn_Princess quits (~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Quit: Leaving)
02:09:43 × shapr quits (~user@184.81.59.2) (Ping timeout: 260 seconds)
02:15:14 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
02:15:14 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
02:15:14 finn_elija is now known as FinnElija
02:19:42 seydar joins (~seydar@154-27-113-252.starry-inc.net)
02:19:50 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
02:19:54 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
02:19:54 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
02:19:54 wroathe joins (~wroathe@user/wroathe)
02:26:52 AlexNoo_ joins (~AlexNoo@178.34.163.12)
02:27:43 × euandreh quits (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) (Quit: WeeChat 3.5)
02:28:04 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds)
02:28:58 × AlexZenon quits (~alzenon@178.34.162.108) (Ping timeout: 272 seconds)
02:29:12 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
02:30:12 × AlexNoo quits (~AlexNoo@178.34.162.108) (Ping timeout: 246 seconds)
02:30:52 × Alex_test quits (~al_test@178.34.162.108) (Ping timeout: 272 seconds)
02:32:09 AlexZenon joins (~alzenon@178.34.163.12)
02:34:23 Alex_test joins (~al_test@178.34.163.12)
02:36:48 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds)
02:41:39 seydar joins (~seydar@154-27-113-252.starry-inc.net)
02:45:21 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
02:52:35 × xff0x quits (~xff0x@om126167102105.29.openmobile.ne.jp) (Read error: Connection reset by peer)
02:56:04 × td_ quits (~td@muedsl-82-207-238-011.citykom.de) (Ping timeout: 248 seconds)
02:57:55 td_ joins (~td@muedsl-82-207-238-115.citykom.de)
02:58:40 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds)
03:00:00 mvk joins (~mvk@2607:fea8:5ce3:8500::aa1d)
03:00:05 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds)
03:00:15 × tommd quits (~tommd@97-120-41-123.ptld.qwest.net) (Ping timeout: 252 seconds)
03:02:34 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds)
03:07:23 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
03:09:02 seydar joins (~seydar@154-27-113-252.starry-inc.net)
03:13:41 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds)
03:18:15 euandreh joins (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174)
03:19:12 seydar joins (~seydar@154-27-113-252.starry-inc.net)
03:19:45 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
03:24:52 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 248 seconds)
03:29:25 pavonia joins (~user@user/siracusa)
03:29:33 × jao quits (~jao@211.68.17.95.dynamic.jazztel.es) (Ping timeout: 256 seconds)
03:34:39 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds)
03:35:04 × littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
03:39:01 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
03:40:39 seydar joins (~seydar@154-27-113-252.starry-inc.net)
03:41:19 img joins (~img@user/img)
03:45:19 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds)
03:48:09 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
03:51:13 seydar joins (~seydar@154-27-113-252.starry-inc.net)
03:53:15 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
03:54:53 littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo)
03:55:00 × lechner quits (lechner@debian/lechner) (Quit: WeeChat 3.5)
03:55:15 lechner joins (lechner@debian/lechner)
03:56:06 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds)
03:58:00 × lechner quits (lechner@debian/lechner) (Client Quit)
03:58:14 lechner joins (lechner@debian/lechner)
03:59:07 × EvanR quits (~EvanR@user/evanr) (Remote host closed the connection)
03:59:27 EvanR joins (~EvanR@user/evanr)
04:00:39 benin joins (~benin@183.82.29.230)
04:01:18 seydar joins (~seydar@154-27-113-252.starry-inc.net)
04:06:30 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds)
04:08:24 notzmv joins (~zmv@user/notzmv)
04:13:54 × Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
04:14:40 Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
04:15:37 coot joins (~coot@213.134.190.95)
04:25:04 bahamas joins (~lucian@84.232.141.55)
04:32:43 seydar joins (~seydar@154-27-113-252.starry-inc.net)
04:35:08 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Client Quit)
04:40:26 × zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection)
04:43:48 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds)
04:46:42 zaquest joins (~notzaques@5.130.79.72)
04:47:46 mbuf joins (~Shakthi@27.58.129.52)
04:50:54 × dunj3 quits (~dunj3@kingdread.de) (Quit: ZNC 1.7.2+deb3 - https://znc.in)
05:01:09 takuan joins (~takuan@178-116-218-225.access.telenet.be)
05:03:09 × Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
05:04:32 Vajb joins (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56)
05:07:19 × jargon quits (~jargon@174-22-206-112.phnx.qwest.net) (Quit: Nini. ZZzz...)
05:09:08 × Me-me quits (~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net) (Changing host)
05:09:08 Me-me joins (~me-me@user/me-me)
05:11:39 cdman joins (~dcm@user/dmc/x-4369397)
05:35:55 × forell quits (~forell@user/forell) (Ping timeout: 256 seconds)
05:41:55 × bliminse quits (~bliminse@host86-164-128-238.range86-164.btcentralplus.com) (Quit: leaving)
05:46:44 × x_kuru quits (~xkuru@user/xkuru) (Read error: Connection reset by peer)
05:52:26 gpncarl joins (~gpncarl@120.244.220.74)
05:56:16 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
05:56:50 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
05:58:52 × [Leary] quits (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) (Remote host closed the connection)
05:59:16 [Leary] joins (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz)
06:00:48 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 250 seconds)
06:02:56 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
06:03:15 michalz joins (~michalz@185.246.204.105)
06:04:09 × gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 276 seconds)
06:06:05 acidjnk joins (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de)
06:08:30 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
06:12:46 forell joins (~forell@user/forell)
06:19:57 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
06:20:21 azimut joins (~azimut@gateway/tor-sasl/azimut)
06:40:59 Wstfgl0 joins (~me-me@v.working.name)
06:43:06 lortabac joins (~lortabac@2a01:e0a:541:b8f0:e8a7:5207:d6e5:3f9a)
06:43:27 × Me-me quits (~me-me@user/me-me) (Killed (NickServ (GHOST command used by Wstfgl0!~me-me@v.working.name)))
06:43:30 Wstfgl0 is now known as Me-me
06:43:37 × Me-me quits (~me-me@v.working.name) (Changing host)
06:43:37 Me-me joins (~me-me@user/me-me)
06:46:27 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
06:47:37 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
06:49:41 kenran joins (~kenran@ip-037-024-119-190.um08.pools.vodafone-ip.de)
06:56:55 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
07:02:34 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
07:05:03 alp_ joins (~alp@user/alp)
07:05:41 odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
07:07:24 × jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 246 seconds)
07:08:06 bahamas joins (~lucian@84.232.141.55)
07:16:44 Gilbert189 joins (~Gilbert18@user/Gilbert189)
07:22:24 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
07:22:57 × shriekingnoise quits (~shrieking@201.231.16.156) (Quit: Quit)
07:25:42 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
07:32:32 jonathanx joins (~jonathan@dyn-5-sc.cdg.chalmers.se)
07:33:12 kaph joins (~kaph@net-2-42-128-205.cust.vodafonedsl.it)
07:34:23 chele joins (~chele@user/chele)
07:35:45 fendor joins (~fendor@91.141.58.225.wireless.dyn.drei.com)
07:39:34 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds)
07:39:55 × nek0 quits (~nek0@nek0.eu) (Quit: Ping timeout (120 seconds))
07:40:13 nek0 joins (~nek0@nek0.eu)
07:47:09 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
07:47:19 mmhat joins (~mmh@2001:4090:a242:802a:ee08:6bff:fe09:5315)
07:47:41 × sus quits (zero@user/zeromomentum) (Quit: the lounge - https://webirc.envs.net)
07:47:43 machinedgod joins (~machinedg@24.105.81.50)
07:48:17 sus joins (zero@user/zeromomentum)
07:50:34 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
07:51:52 azimut joins (~azimut@gateway/tor-sasl/azimut)
07:52:03 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 276 seconds)
07:53:07 kaiepi joins (~Kaiepi@156.34.47.253)
07:53:12 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
07:53:16 × Gilbert189 quits (~Gilbert18@user/Gilbert189) (Quit: Leaving)
07:53:26 dyeplexer joins (~dyeplexer@user/dyeplexer)
07:54:25 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 260 seconds)
07:57:45 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
07:58:32 gehmehgeh joins (~user@user/gehmehgeh)
08:02:12 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 248 seconds)
08:03:17 × tzh_ quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
08:03:33 <absence> is it possible to enable GHC.Stats with a function call, or is passing the rts option -T the only way?
08:03:49 × bgs quits (~bgs@cpe-212-85-160-171.cable.telemach.net) (Ping timeout: 256 seconds)
08:03:51 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 252 seconds)
08:04:04 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
08:05:49 bgs joins (~bgs@cpe-212-85-160-171.cable.telemach.net)
08:06:43 gpncarl joins (~gpncarl@120.244.220.74)
08:07:55 × raym quits (~raym@user/raym) (Ping timeout: 260 seconds)
08:09:35 raym joins (~raym@user/raym)
08:11:05 × gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 248 seconds)
08:12:51 Midjak joins (~Midjak@82.66.147.146)
08:12:52 × mvk quits (~mvk@2607:fea8:5ce3:8500::aa1d) (Ping timeout: 248 seconds)
08:14:55 __monty__ joins (~toonn@user/toonn)
08:16:19 ubert joins (~Thunderbi@p200300ecdf1588a56901cfb4252abec6.dip0.t-ipconnect.de)
08:16:47 × acidjnk quits (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
08:16:53 ccntrq joins (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb)
08:17:52 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
08:19:11 × jpds quits (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
08:19:34 jpds joins (~jpds@gateway/tor-sasl/jpds)
08:19:36 × kaiepi quits (~Kaiepi@156.34.47.253) (Read error: Connection reset by peer)
08:22:42 kaiepi joins (~Kaiepi@156.34.47.253)
08:22:47 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
08:24:11 × ubert quits (~Thunderbi@p200300ecdf1588a56901cfb4252abec6.dip0.t-ipconnect.de) (Quit: ubert)
08:26:26 × kaiepi quits (~Kaiepi@156.34.47.253) (Client Quit)
08:26:48 bahamas joins (~lucian@92.85.13.88)
08:28:24 kaiepi joins (~Kaiepi@156.34.47.253)
08:28:36 × kenran quits (~kenran@ip-037-024-119-190.um08.pools.vodafone-ip.de) (Quit: WeeChat info:version)
08:29:56 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
08:33:32 jgeerds joins (~jgeerds@d53604b0.access.ecotel.net)
08:34:25 × [Leary] quits (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) (Remote host closed the connection)
08:34:25 _ht joins (~quassel@231-169-21-31.ftth.glasoperator.nl)
08:36:48 <apache2> speaking of intel instructions
08:37:40 <apache2> in the manuals for x86, x86_64, etc they have a description of what each assembly mnemonic does in a sort of pseudo-code language
08:37:47 <apache2> does that have a name, and has anybody implemented it?
08:40:07 <apache2> aand to get back on track: I managed to introduce some kind of bug in my code which resulted in an endless loop over an recursive list when trying to add a character to a Text string, the let binding stuff is pretty magical
08:40:35 <apache2> I found it by bisection, commenting out parts until something worked again
08:40:46 [Leary] joins (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz)
08:40:52 <apache2> is there some sort of profiler / debugger / something to help diagnose problems like that?
08:49:09 × mjacob quits (~mjacob@adrastea.uberspace.de) (Ping timeout: 256 seconds)
08:49:43 × tomku|two quits (~tomku@user/tomku) (Ping timeout: 256 seconds)
08:49:51 tomku joins (~tomku@user/tomku)
08:49:56 mjacob joins (~mjacob@adrastea.uberspace.de)
08:52:11 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
08:52:32 <merijn> apache2: Depends how the endless loop happens :p
08:53:02 <merijn> apache2: ghci has a built in debugger, but it's not used super much
08:53:29 <merijn> Because
08:53:34 <merijn> @quote cmccann stream.of.con
08:53:35 <lambdabot> cmccann says: you want a debugger? GHC has one. Except that stepping through lazy evaluation is like listening to a stream of consciousness narrative told by a 5-year-old with ADHD.
08:54:00 <merijn> There's also profiling support, but I dunno how well that works to catch infinite loops
08:56:08 teo joins (~teo@user/teo)
08:57:27 × teo quits (~teo@user/teo) (Client Quit)
08:58:18 teo joins (~teo@user/teo)
09:00:02 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
09:00:06 × corisco[m] quits (~coriscokd@2001:470:69fc:105::1:dea6) (Quit: You have been kicked for being idle)
09:00:23 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
09:02:04 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds)
09:02:32 <kuribas> the ghc debugger is also not how I want to debug.
09:02:37 × ccntrq quits (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb) (Remote host closed the connection)
09:02:40 <kuribas> I don't care about the order ghc uses to evaluate things.
09:03:01 <kuribas> So I would want to be able to specify what part of the eval tree to evaluate next.
09:03:10 <kuribas> "stepping" feels to imperative.
09:03:24 ccntrq joins (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb)
09:04:27 <kuribas> As long as the debugger keeps the right semantics, so a bottom will not quit the whole evaluation.
09:04:27 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
09:04:33 gpncarl joins (~gpncarl@120.244.220.74)
09:05:12 <kuribas> for example snd (undefined, 4), I should be able to evaluate the first argument, without it stopping evaluating the whole thing.
09:05:17 ubert joins (~Thunderbi@2a02:8109:9880:303c:ad62:b99:9259:5795)
09:05:44 <sm> apache2: another way is to sprinkle the likely code with trace statements, inspecting output and code can get you pretty far
09:06:20 <kuribas> yeah, Debug.Trace is the best
09:06:52 <kuribas> when messing around on the repl didn't produce anything interesting.
09:07:52 <sm> then there's setting stack/heap size artificially low to force termination, would that help here ?
09:08:11 <merijn> Depends if it's actually leaking memory
09:08:24 frost joins (~frost@user/frost)
09:09:03 <kuribas> ah an endless loop, those are the worst to debug.
09:09:15 <merijn> hey!
09:09:20 <merijn> you don't know it's endless! :D
09:09:44 <sm> and is there a way to send it a signal/exception to force termination, with a traceback ?
09:10:11 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
09:10:25 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
09:10:27 <merijn> Depends how picky you are about the definition of each of the words in that sentence :p
09:10:35 <sm> heh
09:10:51 <merijn> sm: async exception are only detected during allocation/GC
09:10:53 <sm> figures it wouldn't be simple
09:11:07 <merijn> It's possible to get code stuck in an allocationless loop that will thus never detect async exceptions
09:11:23 <sm> good to know
09:11:44 <merijn> sm: It should be possible to implement support for stacktraces of an active thread, but that'll be some engineering work
09:11:50 <sm> ctrl c would probably work though ?
09:11:53 <merijn> sm: hah
09:11:57 <merijn> Absolutely not
09:12:12 <merijn> Arguably ctrl-c doesn't work at all in the current state of things :p
09:12:38 <sm> uh.. ctl z ? sometimes only that that works
09:12:40 <merijn> There's something that approximately resembless "working" that has essentially no sensible semantics
09:13:04 <merijn> sm: So ctrl-z from terminal does work, because that's handled in the kernel
09:13:16 <merijn> And has actual sensible semantics
09:14:02 <merijn> sm: The problem is that ctrl-c sends SIGINT and signals are delivered (non-deterministically!) to "a" thread in the process. So you have no clue which runtime thread gets the signal
09:15:04 <sm> could you instrument haskell code with a handler for ctrl z ?
09:15:40 <merijn> sm: No, because ctrl-z causes the kernel scheduler to stop scheduling your process, so there's no handler to run
09:15:50 <merijn> Because the process itself gets suspended and doesn't execute anything
09:16:20 <sm> thanks, makes sense
09:16:29 sm grasps at straws.. could you enable some RTS logging/real-time profiling to show some of the functions executing ?
09:16:35 <merijn> sm: There's a bunch of issues on the GHC tracker on fixing the signal handling to be, you know, sensible and predictable. But since, as of yet, no one is paying me to hack on GHC it's "on my to do list"
09:16:54 <merijn> Which is code for saying "I will never do it, because I don't have the energy/attention span for that" :p
09:16:59 dut joins (~dut@user/dut)
09:17:08 <sm> 👍🏻
09:18:23 acidjnk joins (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de)
09:18:45 <merijn> I outlined (I think I did, anyway?) what a "proper" approach would look like
09:20:13 <sm> merijn: I'm not seeing that, just mention of the debugger and profiling ?
09:20:28 <merijn> Man, gitlab doesn't have a way to list all issues I commented on?
09:21:09 <sm> oh I assumed you were talking about this infinite loop debugging puzzle
09:21:28 <merijn> sm: Well, I was more referring to "proper" signal handling. But that would also open the way for more complex operations like "getting stack trace dumped out from all threads"
09:21:48 <merijn> Which sounds doable enough *iff* you have a sensible async infrastructure
09:22:01 pretty_d1 joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
09:22:02 <sm> that sure sounds useful and good for "haskell in production"
09:22:07 × pretty_d1 quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit)
09:22:35 <merijn> argh
09:22:41 <merijn> I hate gitlab
09:22:55 <sm> hope younger sponsored businesses HF or one of the big haskell using corps
09:23:12 <sm> I hope you get ...
09:23:30 <sm> dang it iphone
09:23:34 × littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
09:23:35 <merijn> How can you not allow me to search for issues I commented on...I have no idea what this issue was named, just that I wrote some stuff
09:23:38 merijn sighs
09:23:42 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 276 seconds)
09:23:58 sm throws his hands up at technology
09:24:33 <merijn> Right, so a write-up exists somewhere, just don't ask me where... >.>
09:27:13 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
09:29:21 <sm> haskell should have a periodic vote & funding round for projects, like cardano's project catalyst
09:29:55 jollygood joins (www-data@2607:5300:60:8be::1)
09:31:55 <jollygood> hi.I tried 9.2.2 on stack on windows, and I am getting weird error:
09:31:59 <jollygood> Stack has not been tested with GHC versions above 9.0, and using 9.2.2, this may fail. Found an invalid compiler at "ghc-9.2.2.exe": Received ExitFailure (-1073741515) when running Raw command: "ghc-9.2.2.exe" --info
09:32:20 <jollygood> I am using nightly-2022-05-05 resolver
09:33:23 <sm> the first sentence can usually be ignored. Try to run that exe yourself with that flag, does it work ?
09:34:15 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
09:34:57 <jollygood> it doesn't give me any errors, or any output
09:35:33 gurkenglas joins (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de)
09:36:33 <sm> what about --version, or --help ? does the exe file look ok ? is the date what you expect ? was it installed by stack ?
09:37:15 <jollygood> no output no matter what arguments I pass to it
09:37:41 <jollygood> yes it was installed by stack
09:38:34 <sm> sounds invalid alright. I'd check stack and ghc issue trackers and maybe ask #ghc
09:39:47 <sm> and maybe try installing it with ghcup and configuring stack to use that
09:40:12 <jollygood> ghci doesn't work either, it just returns.
09:40:56 xaotuk joins (~sasha@2a06:5b00:15fe:9b00::2)
09:41:36 × jonathanx quits (~jonathan@dyn-5-sc.cdg.chalmers.se) (Remote host closed the connection)
09:42:18 <maerwald> what's the best book on haskell concurrency and performance?
09:42:43 <sm> simon marlow's of course
09:42:43 <merijn> The best book on concurrency is Simon Marlow's paralle and concurrent Haskell
09:42:59 <kuribas> +1
09:43:03 <Hecate> yeah that's the best you've got at the moment
09:43:05 <merijn> it talks about *efficiency* for the things covered, but that's not the same as performance
09:43:12 <sm> ack
09:43:15 <merijn> I don't think there's really any book on Haskell performance
09:43:38 <kuribas> first learn performance in a general sense.
09:43:41 <merijn> That said, I don't think there's any decent book on performance in other languages either :p
09:44:12 <merijn> Which is kinda a problem, I learned through osmosis, but then sometimes people ask me "where/how did you learn this stuff and how can I learn?" and then I don't have an answer
09:44:17 <kuribas> optimize queries, use the right algorithms, then do linear optimizations (cache locality etc).
09:44:35 <merijn> See, I actually think that's wrong :p
09:44:44 × mbuf quits (~Shakthi@27.58.129.52) (Quit: Leaving)
09:45:05 <kuribas> merijn: are you going to say, profile first? :-)
09:45:05 <merijn> If you *truly* care about performance you can't write your code first and then optimise after. You gotta design your code "from the inner loop outwards"
09:45:10 <sm> "hire me as coach for one meelleon dollars"
09:45:32 <kuribas> merijn: also first, do you need to care about performance?
09:45:33 <merijn> kuribas: Profiling is important, but you can't profile and optimise your way out of every performance problem
09:45:36 gensyst joins (gensyst@user/gensyst)
09:45:59 <merijn> So, actually one of the most interesting and enlightening things I learned from Google was during my interview there
09:46:04 <kuribas> you need a good architecture first.
09:46:13 <merijn> One of the interviews was the "non-abstract large scale systems design" interview
09:46:41 <merijn> Which was basically, "here's some ballpark requirements and numbers, design a ballpark system design"
09:46:50 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
09:47:06 <merijn> i.e. estimate the required computational/latency stuff from some napkin math and estimate what'd you'd *roughly* need
09:47:19 <sm> kuribas++
09:47:55 <merijn> The architecture needs of high performance code can be radically different depending on the performance needed
09:48:02 <merijn> So you can't just decide architecture first
09:48:42 <sm> if you want a system to be fast, it's a good idea to think about the whole system first
09:48:55 <gensyst> I want to create a "machine" with its own state, so I can do initMachine :: m state and then updateMachine :: MyDataType -> state -> m state and along the way queryMachine :: state -> SomeOutputType. How can I do this without exposing the state type to the outside world?
09:48:55 <merijn> "hollistic systems design"
09:49:02 <kuribas> merijn: first a prototype?
09:49:09 <merijn> I will write that on my resume, next to "software zymurgist"
09:49:28 <merijn> kuribas: I mean, you don't necessarily need a prototype to make decisions like that
09:49:35 <merijn> IFF you know what you're doing
09:49:51 robosexual joins (~robosexua@92.248.229.56)
09:49:53 <gensyst> AND in such a way that the state type is still known (internally by the type checker) to be the same across all those function calls.
09:50:02 <merijn> Like, if you know the main computational load is "a bunch of matrix math" the architecture should be "how do I most efficiently feed data into BLAS"
09:50:42 <merijn> gensyst: You can use a record with an existential type to get something like that
09:51:16 <jollygood> issue is with ghc not with stack: https://gitlab.haskell.org/ghc/ghc/-/issues/21196
09:52:13 <sm> aha, there's that 9.2 showstopper so was wondering about. nice one
09:52:25 × bahamas quits (~lucian@92.85.13.88) (Ping timeout: 248 seconds)
09:52:34 <kuribas> gensyst: not that if you want things to be checked at compile time, the *must* be exposed.
09:54:02 <gensyst> So I ask for the impossible?
09:54:12 <merijn> kuribas: Wrong
09:54:15 <merijn> Hold on
09:54:20 <merijn> I'm finishing a sketch
09:54:27 <sm> Hold his beer
09:54:49 mikoto-chan joins (~mikoto-ch@213.177.151.239)
09:55:21 <kuribas> merijn: well, putting the type in a GADT is still "exposing" the state.
09:56:21 <merijn> hmm
09:56:24 <merijn> pastebin is slow
09:57:41 <merijn> Not tested, probably contains a typo, etc. but something like: https://dpaste.org/ppZAC
09:58:18 <merijn> That way the internal state 's' can be any type not visible to users of StateMachine
09:58:47 <merijn> But now it's time for my lunch walk, so I let the hard work of explanation to someone else :p
09:59:19 <kuribas> you still have the same state type everywhere, so it doesn't check the states.
09:59:31 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
10:00:05 <merijn> Either you or I misunderstood the question :p
10:00:12 <kuribas> well, if he meant, parametrize over state, that your solution would work.
10:00:24 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 248 seconds)
10:03:15 mikoto-chan joins (~mikoto-ch@213.177.151.239)
10:03:53 jonathanx joins (~jonathan@dyn-5-sc.cdg.chalmers.se)
10:04:08 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 248 seconds)
10:04:20 × sweater quits (~sweater@206.81.18.26) (Remote host closed the connection)
10:06:39 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Quit: WeeChat 3.5)
10:07:59 sweater joins (~sweater@206.81.18.26)
10:09:28 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 248 seconds)
10:12:27 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 256 seconds)
10:12:59 <gensyst> merijn, hmm the idea of combining such "internal" funcs with other "external" funcs didn't occur to me
10:13:03 <gensyst> i'll try it out
10:13:33 flinner joins (~flinner@user/flinner)
10:14:23 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
10:16:31 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
10:16:55 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
10:21:34 × flinner quits (~flinner@user/flinner) (Quit: Using Circe, the loveliest of all IRC clients)
10:27:24 × gurkenglas quits (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 276 seconds)
10:30:56 littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo)
10:33:53 × mmhat quits (~mmh@2001:4090:a242:802a:ee08:6bff:fe09:5315) (Ping timeout: 256 seconds)
10:34:53 × merijn quits (~merijn@86.86.29.250) (Ping timeout: 260 seconds)
10:36:53 crazazy joins (~user@130.89.171.62)
10:47:00 × perrierjouet quits (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Ping timeout: 248 seconds)
10:47:04 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
10:47:30 mmhat joins (~mmh@2001:4090:a242:800a:ee08:6bff:fe09:5315)
10:48:03 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds)
10:48:21 Lord_of_Life_ is now known as Lord_of_Life
10:54:02 jakalx parts (~jakalx@base.jakalx.net) ()
10:56:22 CiaoSen joins (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
11:01:34 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
11:04:35 jakalx joins (~jakalx@base.jakalx.net)
11:09:18 <gensyst> merijn, It's line 13 (utilizing the earlier pattern match) that perplexes me. Why does this work? Yet for some reason if you do the exact same thing without pattern matching, it stops working: https://dpaste.org/AM1WW
11:09:24 <gensyst> because of "escaped type variables"
11:09:27 <gensyst> but why.....
11:09:38 <gensyst> why are they any less "escaped" with pattern matching
11:15:08 × acidjnk quits (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
11:19:17 <merijn> gensyst: That's part of ExistentialQuantification
11:19:38 <merijn> gensyst: Basically, the type 's' is only "in scope" after you pattern match on StateMachine
11:20:07 <merijn> gensyst: It's complaining about "escaping", because what you wrote makes 's' "visible" outside a pattern match, but the type system cannot deal with that
11:20:59 <merijn> gensyst: So when you pattern match on StateMachine you (temporarily and in a limited scope) get a vision of 's', but you're not allowed to let anyone else notice 's', because then the type checker would have to know what it is
11:21:32 <merijn> In my version, we make 's' visible by pattern matching, but then carefully pack things back up and hidden for the outside world before returning anything
11:22:09 bahamas joins (~lucian@84.232.141.55)
11:23:04 <gensyst> merijn, ok but wouldn't it be possible to expose the stuff we got from the pattern match to the outside world? (I have tried and the compiler will complain similarly about "escaped type variables" if we try). So the point is that in my (incorrect) method, those things for some reason get escaped earlier, even if we don't really escape them in the end.
11:23:09 <gensyst> Do you see what I mean?
11:23:24 × _ht quits (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection)
11:23:34 × littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
11:23:41 <merijn> gensyst: You are allowed to expose anything *other than* 's' just fine
11:24:29 <merijn> gensyst: Theoretically you could (maybe) make a complicated analysis to make that work, but then the question is: Is that worth the maintenance effort?
11:24:43 <merijn> Especially since there's a simple workaround of "just write out the pattern match"
11:25:22 <gensyst> merijn, hmm, but how does the pattern match makes this easier for the compiler?
11:25:52 briandaed joins (~briandaed@109.95.142.93.r.toneticgroup.pl)
11:26:09 _ht joins (~quassel@231-169-21-31.ftth.glasoperator.nl)
11:28:09 <merijn> gensyst: The 'forall s' part says "there is *a* type 's', don't have to care what, but it's the same in all the bits of this datatype". When you pattern match the compiler plucks a temporary (opaque! so it doesn't know what it is) type out of thin air and checks the code as if you're using that in all the functions. If you would use "currentState myMachine :: s" (i.e. using the accessor function on a
11:28:15 <merijn> StateMachine record) it does that too, but now it escapes
11:29:05 <merijn> If you do it *twice* "querymachine myMachine (currenState myMachine)" then it creates *two* separate opaque type for each access and then goes "hey, these aren't the same" (because that type is only equivalent to itself)
11:29:33 <merijn> gensyst: You'd need to somehow see in the compiler that "really, these two reifications of the opaque type 's' happen in the same scope and refer to the same 's'"
11:29:37 <merijn> But that logic is *hard*
11:30:02 <merijn> Well, except when you simply tie it to pattern matching and sharing the opaque type accross all field members when you do the pattern match! Then it's easy
11:30:09 <merijn> So that's what's done
11:30:59 <merijn> (to you it's obvious they *are* the same, but the compiler has no logic for proving that, it just temporarily inserts opaque types unequal to every other type)
11:35:22 × robosexual quits (~robosexua@92.248.229.56) (Quit: WeeChat 3.5)
11:35:23 <gensyst> merijn, But even in your code, doesn't a new s (s2) get created when you create a *new* StateMachine?
11:35:37 <gensyst> so here it seems the compiler *can* deduce that those s are the same
11:36:04 <merijn> gensyst: No? Because all the function types can be typechecked fine
11:36:25 <merijn> gensyst: So it knows the result of 'updateInternalMachine' returns the *same* 's' as it received as input
11:36:35 chomwitt joins (~chomwitt@2a02:587:dc19:d600:6d5a:79e9:ac14:c3a8)
11:36:58 <merijn> gensyst: Imagine all the 's' variables are replaced with an imaginary "concrete" (I dislike that word, but fine) S type
11:37:27 <merijn> The compiler has no idea *what* S is, which constructors it has, etc. It just knows "type S exists and these functions take S as argument" and then typechecks that
11:37:59 <merijn> So it knows the "new" state 'result' has the same type as the old currenState (because typechecking proves that)
11:38:06 <merijn> It just has no idea what that is
11:39:00 <merijn> gensyst: Without the pattern match you end up instead getting type S for the use of currentState and S' for the use of 'updateInternalMachine', and S and S' are not the same (at least, there's no way to prove that)
11:40:12 <gensyst> ah! ok now i get what you mean by "twice"
11:40:18 <gensyst> interesting.
11:40:51 <gensyst> the pattern matching guarantees same for all
11:41:01 <gensyst> in an easy way
11:41:47 <merijn> gensyst: Right!
11:43:08 <gensyst> Thank you very much.
11:47:27 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 240 seconds)
11:47:27 <apache2> merijn: I guess profiling would work for this
11:48:08 <apache2> kuribas: Debug.Trace is kind of hard to integrate though, I haven't gotten it to work reliably (and it's probably because I'm missing something)
11:48:28 <apache2> sm: I set ulimit -v to get it to crash rather than bog down the whole machine
11:48:52 mikoto-chan joins (~mikoto-ch@213.177.151.239)
11:49:47 <apache2> sorry I''m 200 years behind the backlog
11:52:28 × mmhat quits (~mmh@2001:4090:a242:800a:ee08:6bff:fe09:5315) (Ping timeout: 260 seconds)
11:53:41 <apache2> would be nice with a signal handler for ctrl+t like in bsd libc
11:54:50 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer)
11:55:15 mikoto-chan joins (~mikoto-ch@213.177.151.239)
11:57:20 zero joins (~z@user/zero)
12:01:08 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
12:04:20 dsrt^ joins (~dsrt@173-160-94-253-atlanta.hfc.comcastbusiness.net)
12:06:21 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
12:06:34 × stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 240 seconds)
12:06:40 AlexNoo_ is now known as AlexNoo
12:07:03 <geekosaur> apache2, I keep wishing linux would add the necessary support for that, but they refuse
12:07:55 stiell_ joins (~stiell@gateway/tor-sasl/stiell)
12:08:30 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
12:10:00 <geekosaur> (it's not just libc, the tty driver needs tpgrp SIGSTAT support, but Linus considers it evil)
12:11:05 <exarkun> someone just needs to build a userspace tty driver so it can stop being the kernel's business at all, right?
12:11:32 <geekosaur> someone did: readline
12:11:48 <geekosaur> but the kernel still needs to sort out who "owns" the tty and is active
12:12:04 <geekosaur> ("who" being a process)
12:13:24 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 248 seconds)
12:13:49 dcoutts__ joins (~duncan@host81-156-211-196.range81-156.btcentralplus.com)
12:14:39 mmhat joins (~mmh@2001:4090:a246:806c:ee08:6bff:fe09:5315)
12:15:03 × frost quits (~frost@user/frost) (Quit: Client closed)
12:16:17 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
12:16:37 <kuribas> apache2: you don't "integrate" it, you just add trace statements, debug (on the repl), then remove the statements.
12:17:22 <geekosaur> I can see Linus's point, the tty driver having to walk the processes in the tpgrp and determine the (most likely) active one is pretty grody and a bit unreliable. but damn would it be useful
12:17:57 <[exa]> they're moving it finally?
12:18:48 <geekosaur> ?
12:18:59 [exa] reads the rest of the scrollback
12:19:10 <[exa]> ah ok no changes ._.
12:20:16 <geekosaur> pretty sure it won't be happening while Linus is in charge
12:20:23 frost joins (~frost@user/frost)
12:20:31 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 256 seconds)
12:21:11 mikoto-chan joins (~mikoto-ch@213.177.151.239)
12:21:24 <exarkun> geekosaur: Yea I meant all of that other "grody" stuff should be userspace too.
12:22:12 jao joins (~jao@211.68.17.95.dynamic.jazztel.es)
12:22:50 <geekosaur> userspace doesn't have enough access, and shouldn't
12:23:19 <[exa]> I hope they will eventually tie signals as OOB to file descriptors, as they should be
12:23:36 <[exa]> ^ wishful thinking for next 50+ years
12:23:54 × coot quits (~coot@213.134.190.95) (Quit: coot)
12:24:01 <geekosaur> it requires determining when a process (that might be on your uid but not readable) is blocked
12:24:11 <geekosaur> and what it's blocked on
12:25:58 acidjnk joins (~acidjnk@p200300d0c7068b43e18f8794d20d12cb.dip0.t-ipconnect.de)
12:27:57 <apache2> geekosaur: I see
12:28:03 <apache2> geekosaur: I guess the shell could do it too
12:28:20 <apache2> find the pg of the pty slave and send a USRINFO1 or whatever
12:28:48 <apache2> kuribas: oh, Debug.Trace shows up in the repl?
12:29:20 <apache2> [exa]: they have signalfd which is how sensible programs handle signals in the last few years
12:29:35 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds)
12:30:39 <apache2> it's not quite oob
12:30:51 <apache2> but close
12:32:36 mikoto-chan joins (~mikoto-ch@213.177.151.239)
12:34:40 <kuribas> apache2: yes, it goes to stderr
12:35:05 × jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds)
12:37:20 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 260 seconds)
12:37:26 Pickchea joins (~private@user/pickchea)
12:37:48 × dcoutts__ quits (~duncan@host81-156-211-196.range81-156.btcentralplus.com) (Ping timeout: 246 seconds)
12:38:15 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
12:42:09 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
12:48:52 zebrag joins (~chris@user/zebrag)
12:49:14 coot joins (~coot@213.134.190.95)
12:50:10 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
12:52:21 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 276 seconds)
12:52:35 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
12:55:32 × odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Ping timeout: 248 seconds)
13:00:14 <[exa]> apache2: ah that is cool
13:03:10 bahamas joins (~lucian@84.232.141.55)
13:04:15 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
13:07:48 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds)
13:07:48 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds)
13:07:48 xff0x joins (~xff0x@om126167084162.29.openmobile.ne.jp)
13:09:37 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
13:11:43 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
13:11:53 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
13:12:00 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
13:13:09 odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
13:16:55 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
13:20:10 Unicorn_Princess joins (~Unicorn_P@93-103-228-248.dynamic.t-2.net)
13:23:42 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
13:27:14 tlamer joins (~tlamer@ip-94-112-134-89.net.upcbroadband.cz)
13:33:44 Topsi joins (~Topsi@dyndsl-037-138-064-083.ewe-ip-backbone.de)
13:33:59 jgeerds joins (~jgeerds@d53604b0.access.ecotel.net)
13:36:55 × gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 260 seconds)
13:37:58 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
13:37:59 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
13:37:59 wroathe joins (~wroathe@user/wroathe)
13:41:55 bahamas joins (~lucian@84.232.141.55)
13:42:00 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
13:42:19 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
13:46:43 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 260 seconds)
13:48:22 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection)
13:51:02 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
13:55:43 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
14:00:16 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:e8a7:5207:d6e5:3f9a) (Quit: WeeChat 2.8)
14:00:48 × acidjnk quits (~acidjnk@p200300d0c7068b43e18f8794d20d12cb.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
14:04:55 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 260 seconds)
14:09:55 xkuru joins (~xkuru@user/xkuru)
14:15:09 Sgeo joins (~Sgeo@user/sgeo)
14:17:04 × kaiepi quits (~Kaiepi@156.34.47.253) (Remote host closed the connection)
14:18:19 kaiepi joins (~Kaiepi@156.34.47.253)
14:20:00 × frost quits (~frost@user/frost) (Ping timeout: 252 seconds)
14:20:39 × Pickchea quits (~private@user/pickchea) (Ping timeout: 256 seconds)
14:21:52 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Quit: _)
14:22:09 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
14:28:14 odnes_ joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
14:28:53 × odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Read error: Connection reset by peer)
14:30:47 vicfred joins (~vicfred@user/vicfred)
14:31:43 × xff0x quits (~xff0x@om126167084162.29.openmobile.ne.jp) (Read error: Connection reset by peer)
14:37:07 xff0x joins (~xff0x@om126167084162.29.openmobile.ne.jp)
14:38:43 × CiaoSen quits (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
14:39:18 × kaiepi quits (~Kaiepi@156.34.47.253) (Ping timeout: 260 seconds)
14:49:01 moonsheep joins (~user@iespladelestany.xtec.cat)
14:51:08 spacenautx joins (~spacenaut@user/spacenautx)
14:52:11 × cdman quits (~dcm@user/dmc/x-4369397) (Quit: Leaving)
14:52:48 × odnes_ quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Read error: Connection reset by peer)
14:53:11 odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
14:55:52 × vicfred quits (~vicfred@user/vicfred) (Quit: Leaving)
14:57:02 shriekingnoise joins (~shrieking@201.231.16.156)
14:57:43 <juhp[m]> "(if ... then ... else ...)-syntax in pattern" <- never seen the error before - boggling - no idea how I managed to make it
14:58:28 <juhp[m]> The code is just: return $ if ok then classified else []
14:59:11 <juhp[m]> Completely perfluxed
14:59:13 <geekosaur> would have to see a bit more, I think. sometimes it means the error is in whatever precedes it
15:00:00 <juhp[m]> aha - following it says "Possibly caused by a missing 'do'?"
15:00:33 <geekosaur> as written that doesn't require do, so I have to assume whatever precedes it does
15:02:23 <juhp[m]> well it is in a do block: the preceding like is: ok <- prompt "install above"
15:02:35 <dminuoso> % f (if c then a else b) = _
15:03:12 <dminuoso> juhp[m]: is there an if-then-else before?
15:03:15 <dminuoso> if yes, that would explain it
15:03:40 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
15:03:40 <juhp[m]> let me check more carefully
15:04:00 <dminuoso> Because if you remove the line break, then you have something like `if x then a else b ok <- prompt ...`
15:04:16 Ether17 joins (~Ether17@45.248.151.237)
15:04:21 <juhp[m]> basically it's something like https://github.com/juhp/koji-tool/blob/main/src/Install.hs#L204
15:04:26 <dminuoso> Who knows in what state the parser is to consider this a pattern match
15:04:51 <juhp[m]> Just I put similar do block under the All case and then this...
15:05:10 <geekosaur> I was thinking of it's on the line it says then two lines in what was supposed to be a do, with the do missing, so the second is taken as a definition of $
15:05:13 <juhp[m]> Let me try to revert back.... quite weird
15:05:40 <juhp[m]> I tried replacing $ but it didn't seem to help
15:06:14 <dminuoso> juhp[m]: ah yes, imagine you forget the do above
15:06:58 <dminuoso> if yes == Yes then return install else do mapM_ printInstalled install ok <- prompt "install above"
15:07:10 <dminuoso> I can see how this diagnostic might fire
15:10:17 <juhp[m]> So what is the solution? I still don't see it
15:10:35 <dminuoso> 17:00:00 juhp[m] | aha - following it says "Possibly caused by a missing 'do'?
15:10:57 <juhp[m]> okay
15:11:08 × moonsheep quits (~user@iespladelestany.xtec.cat) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1))
15:12:47 moonsheep joins (~user@iespladelestany.xtec.cat)
15:13:11 × dsrt^ quits (~dsrt@173-160-94-253-atlanta.hfc.comcastbusiness.net) (Remote host closed the connection)
15:14:19 <juhp[m]> Sorry!! Afaict it was caused by an incorrect <- in the following case which should have been a let :-( ugghh
15:14:40 <juhp[m]> s/case/pattern/
15:14:51 <juhp[m]> Rather confusing error message
15:15:18 <juhp[m]> Thanks a lot, dminuoso and geekosaur !
15:15:34 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
15:15:47 <juhp[m]> Never seen that before (apparently it was introduced in 2020)
15:15:54 <dminuoso> juhp[m]: you might want to follow a different style
15:16:10 <dminuoso> the kind of interleaved if-then-else + do-notation + early-return is not very idiomatic
15:16:35 <dminuoso> it's hard to follow, even for yourself as you have just seen. :)
15:16:41 <Athas> It is possible to get `cabal install` to behave more sanely (i.e. just copy the damn binaries built by 'cabal build'), or is there an alternative command I can run to do that?
15:16:44 <juhp[m]> dminuoso: right - any pointers would be welcome
15:16:46 <juhp[m]> indeed
15:17:27 <juhp[m]> Athas: you mean not generate a tarball? dunno
15:17:52 <dminuoso> Athas: cp $(cabal -v0 list-bin)
15:17:52 × Vajb quits (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56) (Read error: Connection reset by peer)
15:18:01 Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
15:18:36 <dminuoso> Depending on your cabal version, you might have to specify the cabal component for list-bin
15:18:48 <juhp[m]> Athas: I started project on github called system-cabal but it is still alpha/beta-ish, which somewhat addresses this
15:18:55 hololeap_ joins (~hololeap@user/hololeap)
15:19:32 <dminuoso> I mean it can be as simple as some `cabal build foo:exe:bar && cp $(cabal -v0 list-bin foo:exe:bar) ~/.local/bin/` *shrugs*
15:19:38 <Athas> dminuoso: I feared it would be something like that.
15:19:40 <juhp[m]> Athas: otherwise stack install ;o) :)
15:19:52 <Athas> Yes, that is the competition.
15:20:05 <dminuoso> Athas: So I guess you're looking for a simple `cabal copy-bin`?
15:20:09 × odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Remote host closed the connection)
15:20:30 <Athas> dminuoso: yes.
15:20:46 <Athas> Maybe I'll just create a shell script in my project root that abbreviates these hopeless commands.
15:21:07 <dminuoso> Haha, I was about to give you a command that was going to start `echo "#!/bin/bash\n ....`
15:21:47 <Athas> I am trying to fully migrate my project to cabal, but I don't want to hugely inconvenience my collaborators.
15:21:48 <dminuoso> Luckily we have list-bin nowadays, so the pipefitting is easy
15:23:04 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
15:23:36 <Athas> Hey, maybe I'll make it a Makefile and they can just pretend it's a C program.
15:23:41 <juhp[m]> I still feel my parse error is almost a bug? - I mean why would it mistaken the next case pattern as some other pattern just because it is missing a do
15:23:57 <juhp[m]> lol
15:24:14 <geekosaur> indentation
15:24:31 <geekosaur> I'd still like to see the whole context
15:24:33 <dminuoso> juhp[m]: Its an LALR generated parser for a whitespace sensitive language. Parser errors are always harsh in this situhation.
15:24:50 <juhp[m]> okay right, I see thanks
15:25:22 liz_ joins (~liz@host109-151-128-120.range109-151.btcentralplus.com)
15:25:36 <juhp[m]> geekosaur: I can push the code now that it compiles I guess :)
15:26:18 hololeap_ joins (~hololeap@user/hololeap)
15:31:48 × jonathanx quits (~jonathan@dyn-5-sc.cdg.chalmers.se) (Remote host closed the connection)
15:39:39 MajorBiscuit joins (~MajorBisc@86-88-79-148.fixed.kpn.net)
15:40:52 Null_A joins (~null_a@2601:645:8700:2290:b1c9:2c49:e327:d981)
15:41:49 dcoutts__ joins (~duncan@host81-156-211-196.range81-156.btcentralplus.com)
15:45:45 jinsun joins (~jinsun@user/jinsun)
15:48:41 kaiepi joins (~Kaiepi@156.34.47.253)
15:50:28 × jinsun quits (~jinsun@user/jinsun) (Ping timeout: 248 seconds)
15:52:37 dzdcnfzd joins (~dzdcnfzd@2600:387:5:807::73)
15:53:33 × xff0x quits (~xff0x@om126167084162.29.openmobile.ne.jp) (Read error: Connection reset by peer)
15:53:36 <dzdcnfzd> Can anyone figure out how to write this function: `almostBind :: Monad m => FreeT f m a -> (FreeT f Identity a -> FreeT f m b) -> FreeT f m b`
15:53:52 <dzdcnfzd> Sorry, `Functor f` too
15:54:50 <dzdcnfzd> Also `Traversable f`
15:55:13 × ubert quits (~Thunderbi@2a02:8109:9880:303c:ad62:b99:9259:5795) (Remote host closed the connection)
15:55:32 jinsun joins (~jinsun@user/jinsun)
15:56:41 × jollygood quits (www-data@2607:5300:60:8be::1) (Quit: CGI:IRC (Session timeout))
15:58:37 <monochrom> If it is not "\m k -> m >>= \a -> k (pure a)" then you need to say what it should do.
15:59:24 <c_wraith> you might need a runIdentity in there
16:00:06 × unclechu quits (~unclechu@2001:470:69fc:105::354) (Quit: You have been kicked for being idle)
16:00:39 <c_wraith> oh, I see. that's more like almostAp than almostBind
16:01:18 × kaiepi quits (~Kaiepi@156.34.47.253) (Read error: Connection reset by peer)
16:01:31 <monochrom> I don't know what else "almost bind" could mean.
16:01:44 × Ether17 quits (~Ether17@45.248.151.237) (Quit: Client closed)
16:02:43 <c_wraith> that type feels very monad-control
16:03:07 <dzdcnfzd> I called it almostBind because the type signature looks like bind to me
16:03:10 <dzdcnfzd> no deep reason
16:03:17 kaiepi joins (~Kaiepi@156.34.47.253)
16:03:17 <c_wraith> it's closer to ap than bind
16:03:32 <dzdcnfzd> But `"\m k -> m >>= \a -> k (pure a)"` works!
16:03:39 <dzdcnfzd> Thanks monochrom!
16:04:21 <geekosaur> well, it does something. but is that something what you needed?
16:04:22 <dzdcnfzd> c_wraith: Yeah, it is, actually
16:04:33 <dzdcnfzd> Yes, I think :)
16:05:33 <dzdcnfzd> My specific use case is that I'm running in a transformer stack that looks like `FreeT f (Except String) ()` where `f` is a nice, well-behaved functor
16:06:22 <dzdcnfzd> I have a function `foo` which returns values of type `FreeT f (Except String) ()`
16:06:37 × jinsun quits (~jinsun@user/jinsun) (Read error: Connection reset by peer)
16:06:50 <dzdcnfzd> I need to apply them to an action of type `FreeT f (Except String) ()` which expects an argument of type `FreeT f Identity ()`
16:06:52 jinsun joins (~jinsun@user/jinsun)
16:07:17 <dzdcnfzd> But if I get a `Left` value from `foo` I want the whole computation to collapse
16:07:46 × MajorBiscuit quits (~MajorBisc@86-88-79-148.fixed.kpn.net) (Quit: WeeChat 3.4)
16:08:57 <dzdcnfzd> I think this works
16:09:03 <dzdcnfzd> the free monad still confuses me
16:11:04 <dzdcnfzd> The only thing I'm worried about, and this might be dumb (like I said, free monad and monad transformers generally are new to me) is whether I'll end up with the `arg` left over in my computation
16:11:22 <dzdcnfzd> whereas I really only want it to be applied to `k`
16:11:30 <dzdcnfzd> Does that make any sense or no?
16:12:38 × xaotuk quits (~sasha@2a06:5b00:15fe:9b00::2) (Ping timeout: 260 seconds)
16:14:18 xaotuk joins (~sasha@net224-32-245-109.mbb.telenor.rs)
16:17:27 <dzdcnfzd> This is a comparison of what I'm doing with the suggestion: https://paste.tomsmeding.com/E9eWj957
16:17:40 × jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds)
16:18:32 <dzdcnfzd> I actually think they may be different
16:21:14 MajorBiscuit joins (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net)
16:23:22 × benin quits (~benin@183.82.29.230) (Quit: The Lounge - https://thelounge.chat)
16:23:50 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection)
16:24:26 <k`> So I get the feeling that `Pointed` is generally considered a mistake, but what about `Copointed` ? Seems like it's harder to get `copoint` 'wrong'.
16:24:26 <k`>
16:25:00 <geekosaur> it's not a mistake, it just doesn't pull its weight
16:25:15 <k`> Sorry, that's what I meant by 'mistake'. 'Not worth it'.
16:25:47 <geekosaur> if we were being strict about typeclasses, it'd be there and Applicative would be `Pointed f, Apply f => Applicative f` with no methods
16:26:04 <geekosaur> but typeclasses have a cost that nobody wants to pay
16:27:28 <k`> I really don't mind paying, but the price seems more like folks getting `point` wrong (e.g. creating a singleton for a zipping Apply).
16:27:33 <c_wraith> Note that the cost isn't technical.
16:28:39 <c_wraith> The cost is in communication. if Applicative was defined as Pointed + Apply and some laws, do you expect those laws to hold if Applicative doesn't appear in the type declaration?
16:29:51 <c_wraith> If you compose two functions, one of which uses only Apply and the other uses only Pointed, does the result depend on Applicative?
16:30:25 × dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 256 seconds)
16:31:26 <c_wraith> none of these things are technical issues with whether it will compile or not. They're issues of communication and expectations.
16:32:26 <k`> Clearly you need to put an Applicative constraint on the result if you want to be sure. Unless you're OK with documentation like 'If it's also Apply, it MUST follow these laws.' and 'If it's also Pointed, it must follow these laws.'.
16:33:18 <k`> Then `Applicative` degrades to `class (Pointed m, Apply m)=> Applicative m; instance (Pointed m, Apply m)=> Applicative m`.
16:33:56 <k`> And since all these laws are unenforced conventions, maybe that's OK. But folks already tend to get things wrong...
16:34:13 <c_wraith> It's a very slippery slope to expect people to keep an MxN matrix of laws in their head
16:34:34 <c_wraith> since as you say, it's hard enough to keep N sets of laws in your head
16:34:47 <c_wraith> Why make it worse?
16:35:12 <Bulby[m]> Pointed and Apply 😱
16:35:13 <Bulby[m]> not real right
16:35:42 <k`> Anyway, getting back to my original question, what about `Copointed`. I'm honestly not sure how to mess that up, even if you do have `instance (Copointed m, Extend m)=> Comonad m` .
16:36:46 <Bulby[m]> k`: enum and bounded do something similar in its documentation
16:36:46 <edwardk> k` i can come up with Copointed and Extend instances for the same type that are incompatible. we've had them emerge in practice.
16:37:45 <edwardk> the scalaz community tried this at one point for the record.
16:37:54 <k`> edwardk: Good to know! What kind of problems? First vs last element?
16:38:34 <edwardk> Pointed still plays a role, but it is pretty hard to find useful instances. the main usecase that comes to mind is that a PointedFunctor is basically exactly what you want to quantify over for an 'affine traversal'
16:38:46 <Bulby[m]> there are types that in conjunction with other types require new the laws to be compatible
16:38:47 <Bulby[m]> not require, it's just a "law"
16:39:00 <edwardk> first vs. last. vs. something that gives you back an infinite container
16:39:29 <k`> So you extend, get an infinite container, copoint, and loop forever?
16:40:24 <Bulby[m]> What is a pointed? Is that `pure`?
16:40:41 <c_wraith> yes
16:41:04 <Bulby[m]> where does that term come from
16:41:12 <edwardk> it is easy to wind up with a set where you can pick a point in the set (pointed set), and another where you have a binary operation on the set (a magma), and not have magically picked the right point to be the unit of the magma when you stick those features together to get a unital magma, or that is the unit of the semigroup when you go to upgrade to a monoid. if you _only_ have the vocabulary for the operations and no vocabulary for the
16:41:12 <edwardk> laws, you easily step wrong when you expect those laws to hold
16:42:21 <edwardk> instance (Applicative f, Monoid a) => Monoid (f a) -- seems like a great idea until you go to realize it makes for a shit choice of monoid for [a], and precludes ever getting Maybe a to be the lifting of a semigroup with a fresh unit.
16:43:27 <Bulby[m]> Where does the term pointed come from?
16:43:33 <k`> That makes sense.
16:43:44 <edwardk> https://en.wikipedia.org/wiki/Pointed_set
16:43:55 <edwardk> a 'pointed functor' is the same idea
16:44:15 dyeplexer joins (~dyeplexer@user/dyeplexer)
16:44:30 × moonsheep quits (~user@iespladelestany.xtec.cat) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1))
16:45:18 <Bulby[m]> so `pure` "preserves the point"
16:45:28 <k`> I've been wondering about the value of a 'lawless' class with `empty :: forall a. m a`, and it seems to do real well until you get to the possibility of somebody defining `empty = Const mempty`, when it needs to be `Const anihilatingElement` (with no inherent laws to tell you that).
16:46:14 Tuplanolla joins (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi)
16:46:34 <k`> Bulby[m]: But in practice, `point` often gets (mis)defined as `singleton`.
16:47:27 <edwardk> Bulby[m]: a functor maps objects to objects, and provides a mapping of arrows to arrows. a pointed functor, gives you a mapping pure :: a -> f a -- with the obvious laws connecting that to the arrows in the category. pure . f = fmap f . pure
16:47:27 <Bulby[m]> you can do whatever as long as it represents the input value?
16:47:39 <edwardk> fortunately the latter is a free theorem in haskell so we don't need to tie it down
16:48:12 <edwardk> so I don't even require it to be a Functor here, as there are Pointed structures that _aren't_ functors. e.g. Set
16:48:25 <edwardk> the problem with Pointed culturally is that it leads to folks doing things like foldMap point
16:48:28 <edwardk> er foldMap pure
16:48:31 <edwardk> what does that mean?
16:48:45 <edwardk> there's no law relating the monoid on 'f a' with the 'a' in any capacity
16:48:55 <edwardk> when f = [] vs. Maybe vs. Set you get TOTALLY unrelated answers
16:49:32 <edwardk> there's very little you can do parametrically in a given pointed functor usefully
16:49:44 <k`> So you need `getAlt . foldMap (Alt . pure)`
16:50:00 azimut joins (~azimut@gateway/tor-sasl/azimut)
16:50:17 <edwardk> on the other hand, something that takes advantage of the 'associative' structure of say Applicative-without-pure, which is called 'Apply' in one of my packages, that? you can do lots with.
16:50:45 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
16:50:59 <edwardk> the issue is haskell is generally bad at making classes that mix two such general extension directions, class Functor f => Applicative f. is what we have today
16:51:11 <k`> (I'm still wishing that `Apply` would be slotted into the Functor hierarchy.)
16:51:13 × coot quits (~coot@213.134.190.95) (Quit: coot)
16:51:33 arjun joins (~arjun@user/arjun)
16:51:33 azimut joins (~azimut@gateway/tor-sasl/azimut)
16:51:48 <edwardk> but if we wanted class (Apply f, Pointed f) => Applicative f -- we'd be dealing with the fact that almsot all the uses of it would infer the weaker (Apply f, Pointed f) constraint set, despite generally needing the laws of Applicative that tell us the point is related to the <*> to be useful or canonical
16:52:30 <edwardk> so the best we can do is make new operations that have their own laws that re-export the ones from those superclasses in order to get inference to do the right thing
16:52:34 <edwardk> which is a bit of a mess
16:52:53 × dut quits (~dut@user/dut) (Ping timeout: 260 seconds)
16:53:23 <edwardk> pure f <*> m = f <$> m -- works for Applicative, but not (Apply f, Pointed f)
16:54:56 <k`> So what are your thoughts on just saying "If it's also `Apply`, it must obey the law `pure f <*> mx = fmap f m`?
16:55:22 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:55:27 <Bulby[m]> what is a free theorm 😭
16:56:00 <geekosaur> https://people.mpi-sws.org/~dreyer/tor/papers/wadler.pdf
16:56:20 <k`> Bulby[m]: I think basically if your instance isn't a GADT, it's guaranteed to be true because you can't care about the element type.
16:56:25 <geekosaur> it's a theorem that follows directly from a type
16:56:31 <k`> In this case.
16:57:00 <sclv> right. its a theorem about a function which holds for any function of that type, because any implementation that satisfies the type must satisfy the theorem.
16:57:01 zeenk joins (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d)
16:57:35 Guest|68 joins (~Guest|68@144.48.23.93)
16:57:45 econo joins (uid147250@user/econo)
17:00:11 jmdaemon joins (~jmdaemon@user/jmdaemon)
17:00:55 <monochrom> http://www.vex.net/~trebla/haskell/abs-type-param.html
17:01:23 <k`> In this case, unless you're using a GADT or create an illegal Functor, it's impossible for `fmap f (point x)` to be anything other than `point (f x)`. GADTs mess it up because your 'x :: a' could actually be restricted to 'x :: (Integer ~ a)=> a'.
17:01:53 <Bulby[m]> sorcery
17:03:59 × Guest|68 quits (~Guest|68@144.48.23.93) (Quit: Connection closed)
17:07:09 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
17:08:00 x_kuru joins (~xkuru@user/xkuru)
17:11:33 × xkuru quits (~xkuru@user/xkuru) (Ping timeout: 260 seconds)
17:12:52 × dzdcnfzd quits (~dzdcnfzd@2600:387:5:807::73) (Quit: Client closed)
17:13:18 × euandreh quits (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) (Ping timeout: 260 seconds)
17:17:28 alx741 joins (~alx741@host-181-198-243-150.netlife.ec)
17:17:30 × alx741 quits (~alx741@host-181-198-243-150.netlife.ec) (Client Quit)
17:18:34 ec joins (~ec@gateway/tor-sasl/ec)
17:19:17 alx741 joins (~alx741@host-181-198-243-150.netlife.ec)
17:19:33 × alx741 quits (~alx741@host-181-198-243-150.netlife.ec) (Client Quit)
17:19:33 euandreh joins (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174)
17:23:58 wroathe joins (~wroathe@user/wroathe)
17:25:37 seydar joins (~seydar@154-27-113-252.starry-inc.net)
17:26:31 × arjun quits (~arjun@user/arjun) (Ping timeout: 256 seconds)
17:26:58 amesgen[m] joins (~amesgenm]@2001:470:69fc:105::82b)
17:28:19 <seydar> I'm having trouble translating some nested loops into Haskell
17:28:20 <seydar> https://paste.tomsmeding.com/VGyql1tq
17:30:18 <seydar> lines 53 and 63 are where I do some list comprehensions, and I feel like I'm getting them wrong, because when I swap the x and y declarations in line 63, I get a little bit closer to the right answer, but that's clearly not correct according to the C code
17:31:37 <monochrom> I think a toy example helps understand the general case.
17:31:56 <monochrom> > [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']]
17:31:58 <lambdabot> error:
17:31:58 <lambdabot> • Variable not in scope: c' :: Char
17:31:58 <lambdabot> • Perhaps you meant one of these:
17:32:06 <monochrom> > [(i, j) | i <- [0,1,2], j <- ['a', 'b', 'c']]
17:32:08 <lambdabot> [(0,'a'),(0,'b'),(0,'c'),(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')]
17:32:12 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
17:32:29 <monochrom> It means that i is the outer loop.
17:32:45 <dminuoso> Also
17:33:03 stackdroid18 joins (14094@user/stackdroid)
17:33:53 <seydar> monochrom: right, i agree, which is why i'm confused as to why my answer gets closer to correct when i mislabel the loops
17:34:05 <monochrom> So the problem is elsewhere?
17:34:57 <seydar> I... don't know. I'm convinced that the problem is in the list comprehensions, since everything else seems to be right, but I know that the `bases` variable is ultimately wrong
17:35:02 <monochrom> "closer to correct (but still incorrect)" is code for very subtle and deep mistake.
17:35:47 <seydar> my individual `basis` function is correct, i've tested that out
17:36:05 <seydar> but then I'm unable to put together a larger `bases` list correctly
17:40:35 <seydar> okay, i've confirmed that `bases` is getting produced correctly. i've compared outputs with a 5x4 image instead of playing guessing games on a 1199x1198 image
17:41:23 <monochrom> And yet you can't argue against [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']] = [(0,'a'),(0,'b'),(0,'c'),(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')]
17:41:33 <monochrom> So the problem is elseelseelsewhere?
17:42:16 <monochrom> Or a very hard to catch typo somewhere.
17:43:05 <monochrom> This is when you throw in a lot of Debug.Trace stuff or split code into more units to perform actually seriously unit testing.
17:43:08 <seydar> right, the C loop has x as the inner loop and y as the outer (lines 68 and 69 in the C), which matches the haskell (line 63)
17:43:08 × AlexNoo quits (~AlexNoo@178.34.163.12) (Read error: Connection reset by peer)
17:43:51 AlexNoo joins (~AlexNoo@178.34.163.12)
17:44:37 <monochrom> Also, use smaller inputs so you get smaller outputs so you don't just gross over "this is close enough".
17:45:06 <seydar> you're right
17:45:15 <seydar> gonna switch it to be 1x1 components
17:45:21 <monochrom> Generally being a good scientist and using the scientific method.
17:46:01 <seydar> i prefer to commune with the code and see if there's some middle ground between what the compiler wants and what i want
17:46:27 <seydar> okay well turns out my code is wildly fucked up when i go to 1x1, so that's prolly a good place to start since it removes the problem of the list comprehension
17:49:08 × AlexNoo quits (~AlexNoo@178.34.163.12) (Read error: Connection reset by peer)
17:49:40 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
17:49:54 AlexNoo joins (~AlexNoo@178.34.163.12)
17:52:26 <seydar> fixed it for 1x1 -- there was an unrelated bug that wasn't converting the linear pixels back to sRGB
17:53:32 <seydar> so now it's looking like the bug is back to the list comprehension part where i try to replicate nested loops
17:53:46 <seydar> is there a better, more haskelly way to do nested loops?
17:54:13 <monochrom> No.
17:54:41 <monochrom> Worse and less haskelly ways, plenty.
17:55:00 agumonkey joins (~user@88.163.231.79)
17:55:44 <k`> I usually end up writing `for t $ \ x -> ... for s $ \ y -> ...` -- probably worse and less Haskelly.
17:56:38 <monochrom> Are you sure you want "for" as opposed to "for_"?
17:56:57 <k`> Right, looping for effects only, `for_`.
17:57:34 <monochrom> But it's incomparable to the [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']] kind.
17:58:35 <monochrom> So yes "for" is worse and less Haskelly than "for_" when effect-only.
17:59:12 <k`> I mean, you can also use `t >>= \ x -> ... s >>= \ y -> ...` when you need Monadic powers.
17:59:20 × crazazy quits (~user@130.89.171.62) (Ping timeout: 248 seconds)
17:59:43 <k`> And I honestly can remember what list comprehension desurgars to `mzip`.
17:59:46 <mrianbloom> Is there an easy way to do size-type wrappers for arrays in Haskell?
18:00:36 <mrianbloom> These would be types that allow you to enforce that two arrays have the same dimensions.
18:00:57 jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
18:01:12 × raym quits (~raym@user/raym) (Ping timeout: 246 seconds)
18:03:06 raym joins (~raym@user/raym)
18:07:26 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
18:08:27 <EvanR> you can use numbers at the type level, that's pretty easy
18:08:42 <EvanR> doing anything more than using numbers at the type level, ymmv xD
18:10:04 × MajorBiscuit quits (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net) (Quit: WeeChat 3.4)
18:10:42 <EvanR> https://hackage.haskell.org/package/sized-vector-1.4.3.1
18:10:56 <EvanR> deprecated in favor of
18:14:31 <juhp[m]> geekosaur: I updated https://github.com/juhp/koji-tool/blob/main/src/Install.hs#L202 : I think it was indeed a missing do + some indentation issue, since I can't reproduce it again now
18:15:35 <agumonkey> he\\o
18:16:49 <juhp[m]> (it would be somewhere within the current last commit, but since corrected - I should have saved the broken code for reference)
18:19:55 x_kuru_ joins (~xkuru@user/xkuru)
18:21:29 <juhp[m]> Anyway has been some fun refactoring :-)
18:23:51 × x_kuru quits (~xkuru@user/xkuru) (Ping timeout: 276 seconds)
18:24:49 <sm> "With this paper we have tried to convey that some domain-driven design concepts are applicable and beneficial to functional languages, even strongly typed ones like Haskell. Types don’t replace proper design or GHC would have been modular to begin with."
18:25:34 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
18:25:55 <sm> I guess hsyl isn't here, but.. this paper is a gem 💎
18:26:03 <sm> https://hsyl20.fr/home/files/papers/2022-ghc-modularity.pdf
18:26:29 <mrianbloom> thanks EvanR
18:27:46 CiaoSen joins (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
18:28:34 × ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 240 seconds)
18:28:42 hololeap_ joins (~hololeap@user/hololeap)
18:32:05 x_kuru joins (~xkuru@user/xkuru)
18:32:09 × x_kuru_ quits (~xkuru@user/xkuru) (Read error: Connection reset by peer)
18:34:14 littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo)
18:34:16 odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
18:37:52 kenran joins (~kenran@200116b82b2708000a1d989028fc8790.dip.versatel-1u1.de)
18:39:08 × zeenk quits (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!)
18:42:25 × Inoperable quits (~PLAYER_1@fancydata.science) (Quit: All your buffer are belong to us!)
18:43:40 × xaotuk quits (~sasha@net224-32-245-109.mbb.telenor.rs) (Ping timeout: 260 seconds)
18:43:48 × alp_ quits (~alp@user/alp) (Ping timeout: 248 seconds)
18:43:52 Inoperable joins (~PLAYER_1@fancydata.science)
18:45:31 × teddyc quits (theodorc@cassarossa.samfundet.no) (Quit: WeeChat 3.0)
18:46:49 × dyeplexer quits (~dyeplexer@user/dyeplexer) (Remote host closed the connection)
18:50:33 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
18:51:16 × hololeap_ quits (~hololeap@user/hololeap) (Remote host closed the connection)
18:53:38 × spacenautx quits (~spacenaut@user/spacenautx) (Quit: WeeChat 3.5)
18:55:33 yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net)
18:56:36 hololeap_ joins (~hololeap@user/hololeap)
19:03:12 lortabac joins (~lortabac@2a01:e0a:541:b8f0:6c7f:24ed:3788:2a1e)
19:04:23 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
19:05:45 coot joins (~coot@213.134.190.95)
19:06:16 × yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection)
19:07:54 × mxs quits (~mxs@user/mxs) (Remote host closed the connection)
19:08:02 mxs joins (~mxs@user/mxs)
19:13:12 acidjnk joins (~acidjnk@p200300d0c7068b43f1a15e75027d04fd.dip0.t-ipconnect.de)
19:14:31 ec joins (~ec@gateway/tor-sasl/ec)
19:16:52 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
19:18:07 zero is now known as zzz
19:21:42 alp_ joins (~alp@user/alp)
19:24:36 × mxs quits (~mxs@user/mxs) (Remote host closed the connection)
19:24:45 mxs joins (~mxs@user/mxs)
19:25:35 bahamas joins (~lucian@84.232.141.55)
19:26:54 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 276 seconds)
19:27:07 × zer0bitz quits (~zer0bitz@2001:2003:f444:8f00:98db:b5ce:843:b259) (Ping timeout: 256 seconds)
19:27:52 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
19:28:04 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
19:31:15 hololeap_ joins (~hololeap@user/hololeap)
19:31:39 <maerwald> sm: my opinion is that good design cannot happen up-front, unless you really do the same thing for the second time. Good codebases need a rewrite. I'd rather start with a monolith than with a very modular design, because a monolith is easier to grow and refactor.
19:32:19 × agumonkey quits (~user@88.163.231.79) (Ping timeout: 256 seconds)
19:32:34 <sm> I agree on the first part, certainly
19:33:21 <sm> except for the kind of "obvious" design you can bring from experience with similar projects
19:33:44 abhinav joins (~abhinav@c-67-169-139-16.hsd1.ca.comcast.net)
19:34:01 <maerwald> with overly modular design you easily navigate yourself into "API locks", where you suddenly can't make drastical changes anymore. That is fine if you're confident that your module boundaries are correct. But if you're wrong about your boundaries, god help you
19:34:51 abhinav is now known as abhixec
19:34:51 × briandaed quits (~briandaed@109.95.142.93.r.toneticgroup.pl) (Ping timeout: 260 seconds)
19:35:23 × quintasan quits (~quassel@quintasan.pl) ()
19:35:33 quintasan joins (~quassel@quintasan.pl)
19:35:35 <sm> well, I think it's assumed that boundaries are part of what you can change
19:35:59 <maerwald> but programmers don't like to be "wrong", so they get obsessed with up-front design and then do worse things
19:36:04 × quintasan quits (~quassel@quintasan.pl) (Client Quit)
19:36:16 quintasan joins (~quassel@quintasan.pl)
19:36:36 <sm> and if not, that's of course a problem, ideally solvable but if not, to be worked around (as with all the "expedient, safe" fixes to ghc over the years)
19:37:22 briandaed joins (~briandaed@109.95.142.93.r.toneticgroup.pl)
19:37:46 <sm> often that's all we can afford at a point in time, or so it appears, but inevitably tech debt builds and eventually deeper cleanup is needed
19:37:55 <maerwald> "this codebase needs a rewrite" is a success story... it means the codebase has survived so long and is so popular, that it *deserves* a rewrite!
19:38:23 <maerwald> also, I'm not talking about GHC... I know nothing about it :)
19:38:23 <sm> agreed!
19:39:18 mikoto-chan joins (~mikoto-ch@213.177.151.239)
19:39:30 <sm> I know more after reading that paper ! might even understand some #ghc talk :)
19:41:14 <dibblego> <edwardk> Pointed still plays a role, but it is pretty hard to find useful instances. the main usecase that comes to mind is that a PointedFunctor is basically exactly what you want to quantify over for an 'affine traversal'
19:41:27 <dibblego> but what is the use-case for an affine traversal?
19:41:34 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
19:43:22 <dminuoso> AffineTraversal in the presence of Traversal is useful for the same reason that Maybe is useful in the presence of []/
19:43:25 xaotuk joins (~sasha@net224-32-245-109.mbb.telenor.rs)
19:44:39 hololeap_ joins (~hololeap@user/hololeap)
19:47:14 × michalz quits (~michalz@185.246.204.105) (Remote host closed the connection)
19:47:34 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 240 seconds)
19:47:39 michalz joins (~michalz@185.246.204.101)
19:48:04 × littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
19:48:24 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
19:48:31 <darkling> I'm new to Haskell, but what I'm having most trouble with at the moment is converting the marvellous new structures and intuitions into actual use-cases.
19:49:28 × abhixec quits (~abhinav@c-67-169-139-16.hsd1.ca.comcast.net) (Remote host closed the connection)
19:50:25 <darkling> I'm mostly OK with the maths-centric approaches -- I trained as a mathematician -- but linking the way I'd write the code "normally" to this new strangely-named zoo of magic is proving tricky.
19:50:49 <Cale> hmm
19:51:06 <geekosaur> have you looked at _Real World Haskell_?
19:51:14 <geekosaur> @where rwh
19:51:14 <lambdabot> http://www.realworldhaskell.org/blog/ http://book.realworldhaskell.org/read/
19:51:47 <dminuoso> Perhaps it might be useful to dispel the magic. Every bit of Haskell code can easily be inspected, and since evaluation amounts to just substituting for a definition - very much like in math - you can trivially follow code.
19:52:17 <darkling> Thanks. I'll add that to the reading list. I'm working through LYAH at the moment, in conjunction with "What I wish I knew when I started Haskell", and the Typeclassopedia, and a textbook on Category Theory.
19:53:14 × coot quits (~coot@213.134.190.95) (Quit: coot)
19:53:44 <darkling> dminuoso: I'm overstating the magic part here. It's more that I can't (yet) use those tools as building blocks, so they appear to stand alone.
19:53:47 <Cale> darkling: I guess one thing you might start with is that a lot of imperative loops end up being frozen into lists
19:53:51 × odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Remote host closed the connection)
19:54:15 odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net)
19:54:19 × roconnor quits (~roconnor@coq/roconnor) (Ping timeout: 240 seconds)
19:54:36 <Cale> Just as a loop either doesn't occur (e.g. because its loop condition isn't met), or it consists of a single iteration followed by another loop, a list is either empty, or consists of a single element followed by another list.
19:54:39 <dminuoso> darkling: Oh that. Just imagine this to be a natural language, its writing and reading that automatically builds up intuition.
19:54:55 <darkling> I've done quite a bit of Erlang, so I'm happy with the functional idioms.
19:54:57 <Cale> So, in some sense, lists are like "loops waiting to happen"
19:55:08 littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo)
19:55:13 <Cale> (and especially so if they're lazy lists)
19:55:27 <darkling> The laziness is very attractive. :)
19:55:29 <geekosaur> I would also mention that category theory is not as useful as some claim
19:55:56 <darkling> geekosaur: I had the book a few years ago, independent of Haskell. This is just the impetus to read the book.
19:56:00 <geekosaur> knowing CT won't help you one bit with understanding IO, in particular
19:56:26 <dminuoso> darkling: Erlang is almost, but not quite, entirely unlike Haskell.
19:56:31 <EvanR> so you want to write hello world in haskell, let me first introduce you to javascript's callback system
19:56:48 <Cale> haha
19:56:50 <darkling> EvanR: Please, don't. $day_job is mostly JS/TS. :)
19:57:40 <dminuoso> 21:54:56 Cale | So, in some sense, lists are like "loops waiting to happen"
19:57:48 <dminuoso> I file this under "monad tutorial fallacy"
19:58:01 <Cale> hm?
19:58:03 <darkling> dminuoso: I've already done the brain jump from imperative to functional, though. :)
19:58:33 <Cale> darkling: I guess I'm confused about your original question in that case
19:58:39 × odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Client Quit)
19:59:03 <Cale> Did you have specific Haskell gadgets that you wanted a use-case for?
19:59:29 <geekosaur> there are still jumps to be made, though. I came in knowing enough SML/NJ to be able to understand programs written in it, but laziness and IO still made for a huge jump needed
19:59:29 <dminuoso> Cale: So thinking of lists as loops is an intution that we develop after we already understand how to use them. It's similar to "Monads are Burritos", it's an intuition that only helps if you already understand it.
20:00:09 <Cale> dminuoso: Well, that was the conclusion of a very specific analogy I was making, though perhaps it requires examples to really get.
20:00:11 × _ht quits (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection)
20:00:17 <Cale> (but darkling already seems familiar)
20:00:24 <EvanR> I knew about lazy wrappers in scheme, that made haskell not seem like a cold turkey
20:00:55 <geekosaur> I don't think that's necessarily true, dminuoso. I mean, what do you do with a list in any language? You loop over it
20:00:57 <dminuoso> Cale: Right, Im not sure examples really suffice. Without being very comfortable with laziness, Im not convinced most beginners would get the gist of it.
20:01:03 <geekosaur> in Hasekll that's the whole point of a list
20:01:05 <Cale> I will say that there are a lot of libraries of general abstract nonsense on Hackage that I would rarely or never use.
20:01:44 <Cale> (but others that I would)
20:02:00 <darkling> Cale: There's a lot made of the Functor/Applicative/Monad stuff, but I'm finding it hard to see where those things fit into the way I'd do things without them.
20:02:10 <dminuoso> geekosaur: They are also very useful for other things like random access, keeping a bag of things - if your list implementation has nice asymptotics and ergonomics for that interface.
20:02:29 <Cale> darkling: Ah, are you familiar with the general concept of a combinator library?
20:02:34 <darkling> Maybe I just need to practice the basic language without them and then spot the patterns where they'd help reduce mess/boilerplate.
20:02:38 <dminuoso> In Haskell they dont, which means the "loopy interface" is way more prominent, simply because you cant do much else with it if you intend to scale
20:02:50 <dminuoso> And that might not be so obvious in other languages
20:03:06 <sm> darkling: maybe it's a good time for a tour through some practical haskell code bases ?
20:03:12 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:6c7f:24ed:3788:2a1e) (Quit: WeeChat 2.8)
20:03:17 <dminuoso> In Haskell we actively construct lists for the purpose of deconstructing element by element, you rarely do this in most common traditional languages
20:03:25 <darkling> Cale: Not entirely. I've brushed around the concept of combinators in (IIRC) lambda calculus, but never looked into it in detail.
20:03:38 <geekosaur> we need an updated RWH that covers things like pandoc and hledger
20:03:44 <darkling> I was a mathematician, not a formal computer scientist (despite lecturing as the latter).
20:04:03 <darkling> All the CS I know is autodidactic.
20:04:22 <k`> darkling: You could just take a look at how Text.ParserCombinators.ReadP does parsing.
20:04:36 <Cale> darkling: Ah, this "combinator" is in a less technical sense. The idea is that you build a library where you start with a bunch of basic building block computations of some type, they may even be too simple to be useful on their own, and then you have a bunch of operations for combining them in various ways.
20:05:12 <sm> ("practice the basic language and spot the patterns" is good too)
20:05:17 <EvanR> code reuse in haskell is better than normal, and people blame how the basic nuts and bolts like lists and eithers are "very dumb"
20:05:42 <EvanR> there's like no room for interpretation and so incompatible "cleverness" to proliferate
20:05:46 <Cale> darkling: Functor/Applicative/Monad capture patterns that frequently arise when you're building libraries in that style
20:06:05 <geekosaur> http://book.realworldhaskell.org/read/using-parsec.html
20:06:14 <geekosaur> nice use of combinators
20:06:16 <EvanR> darkling, I was trying to respond to your thing about boilerplate but then the phone wrong
20:06:20 <EvanR> rang
20:07:49 <Cale> For example, in the case of parsers, you might have a parametric type (Parser t) of parsers whose result(s) will have type t
20:08:35 <Cale> and then that will be an instance of Functor, because if we have a function (a -> b), we can apply that function to the results of a parser of type Parser a to obtain a parser of type Parser b
20:10:01 × bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds)
20:10:17 <darkling> If I've understood, that's the kind of thing where my immediate reaction is to first execute the Parser a to get an a, and then run the a -> b over that result.
20:10:56 <darkling> But with the Functor, you can manipulate the Parser a directly to get the Parser b as a stand-alone thing.
20:11:46 <darkling> So it's kind of an associative flip: transform(parse(input)) to (transform.parse)(input).
20:13:16 <Cale> Yeah, depending on how the parser itself is encoded, it might be more or less involved. But with some of the simplest functional representations of parsers, it will be little more than function composition with a bit of dressing around it.
20:14:04 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
20:14:05 <darkling> That puts the tool (Functor) in a much better context, where I feel I could actually use one. :)
20:14:40 <Cale> If we look at Monad, it'll provide us with return :: a -> Parser a which will construct a parser that consumes none of the input, but immediately returns the given value as its (sole) result
20:14:59 <Cale> as well as (>>=) :: Parser a -> (a -> Parser b) -> Parser b
20:15:01 <k`> Then up from Functor, Applicative lets you combine the results of two parsers or make a dummy parser that produces a result purely (without consuming input).
20:15:06 <Cale> which will take a parser that has results of type a
20:15:17 <Cale> and a function from values of type a to parsers with results of type b
20:15:52 <Cale> and it will glue those together in the sensible way: making a parser which runs the first parser to get a value of type a, then applies the function to decide which parser to run next, and run that on whatever is left of the input
20:16:42 <Cale> This sort of "deciding what to do next based on the result of a previous computation" is what characterises monads in this setting.
20:17:30 <darkling> And that's the ordering dependency that's the intuition of the do-construct?
20:17:35 <Cale> Yeah
20:18:22 hololeap_ joins (~hololeap@user/hololeap)
20:19:01 Guest1767 joins (~Polo@user/polo)
20:19:10 × Guest1767 quits (~Polo@user/polo) (Client Quit)
20:19:11 <maerwald> well, applicative also decides on what to do next, in a sense, except not for the effect flow
20:19:43 <maerwald> just for the values
20:20:07 × kenran quits (~kenran@200116b82b2708000a1d989028fc8790.dip.versatel-1u1.de) (Quit: WeeChat info:version)
20:20:13 <darkling> I think I should stop now, before my brain overflows.
20:20:36 <Cale> Yeah, you can't wholesale decide what happens next with applicative, it's just that one computation gets to decide how to transform the result of another (but both are happening regardless of the results)
20:20:36 <darkling> But many thanks for the conversation, ladies and gentlemen. I'm sure I'll be back.
20:21:22 <darkling> I probably need to read through this conversation again tomorrow, and see if I can advance the rest of the reading based on it.
20:21:52 <Cale> Yeah, this is the kind of thing that really you need 5 or 10 examples before you truly get it.
20:22:13 <maerwald> yeah... with monad you can decide which parser to pick based on the previous value, with applicative the parsers you run are pre-defined
20:23:02 <Cale> (i.e. different whole libraries that use the same operations, but do completely different things with them)
20:23:28 emanon42 joins (~emanon42@103.120.19.44)
20:23:30 mixfix41 joins (~sdenyninn@user/mixfix41)
20:25:32 <seydar> yo this Debug.Trace thing is pretty cool
20:25:37 <seydar> i feel so dirty using it
20:25:42 gpncarl joins (~gpncarl@120.244.220.74)
20:25:45 <EvanR> it's quite impure
20:27:21 jgeerds joins (~jgeerds@d53604b0.access.ecotel.net)
20:29:45 × gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 248 seconds)
20:30:47 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
20:32:33 Polo joins (~Polo@user/polo)
20:32:36 <Cale> It's really useful for extracting the arguments to a pure function in the case that something is going wrong (and the arguments are hard to guess), and then from there you can work out why it's producing an incorrect result.
20:33:08 × briandaed quits (~briandaed@109.95.142.93.r.toneticgroup.pl) (Remote host closed the connection)
20:36:59 <darkling> There's a lot to be said for a bunch of carefully-placed printfs. :)
20:39:54 coot joins (~coot@213.134.190.95)
20:43:10 × Polo quits (~Polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
20:48:04 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds)
20:49:11 <sm> seydar: it's an essential haskell dev tool, nothing to be ashamed of. You may want to add pretty-simple or pretty-show later
20:53:25 teddyc joins (theodorc@cassarossa.samfundet.no)
20:56:39 <seydar> sm: ooh, good tip, thank you
20:56:47 <seydar> what IO does trace* write to?
20:57:03 <seydar> it doesn't appear to be writing to stdout or stderr
20:57:06 <seydar> unless i'm high
20:57:12 <sm> stderr
20:57:19 <sm> some more ideas at https://hackage.haskell.org/package/hledger-lib-1.25/docs/Hledger-Utils-Debug.html
20:59:06 <seydar> weird, i am unable to redirect 2>&1 the way i'd expect to
20:59:37 <EvanR> wouldn't that have no effect usually
20:59:44 <EvanR> still prints out
21:01:19 <sm> eh.. you're writing 2>&1 at the right place (towards the end of the command line) ? bash is weird with that
21:01:48 <geekosaur> what exactly are you doing and what are you expecting?
21:02:00 Pickchea joins (~private@user/pickchea)
21:02:12 <seydar> `ghc Encode && ./Encode cat.jpg 2>&1 hs.out`
21:02:23 <seydar> i'm expecting my output to all go to hs.out
21:02:30 <Clint> then you have the syntax wrong
21:02:53 <geekosaur> first off, you did not redirect into hs,out so it won't be stdout
21:03:24 <geekosaur> second off, 2>&1 must follow a redirection of stdout, otherwise you redirect stderr to the old stdout and then redirect stdout to a different place
21:03:42 <sm> aHA
21:03:46 <seydar> AHHH
21:05:21 × chele quits (~chele@user/chele) (Remote host closed the connection)
21:05:33 sm remembers a command line is a small stateful procedural program
21:06:12 × zyklotomic quits (~ethan@res380d-128-61-84-187.res.gatech.edu) (Ping timeout: 248 seconds)
21:08:06 zyklotomic joins (~ethan@res388d-128-61-89-205.res.gatech.edu)
21:08:37 <seydar> https://paste.tomsmeding.com/IXOwurpv
21:08:38 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 250 seconds)
21:08:47 <seydar> i'm getting output that i don't expect. namely, things aren't happening in the order that i'd expect
21:09:02 <seydar> i'd expect a tuple followed by 20 floats
21:09:21 <seydar> going from (0, 0) -> (0, 1) -> (1, 0) -> (1, 1)
21:09:26 <sm> welcome to the wacky world of haskell lazy evaluation
21:09:29 <seydar> but that is not at _all_ what's happening
21:09:46 <darkling> There's no synchronisation guarantee between stdout and stderr -- both can be buffered.
21:10:16 <seydar> darkling: that is good to know, but all relevant output here is going to STDERR, so i don't think that's the issue
21:10:21 <darkling> You pretty much always have to interpret the two streams' outputs with a certain amount of fuzz.
21:11:02 <geekosaur> or set NoBuffering on both
21:11:20 <darkling> If it's all going to the same stream, then it should be properly ordered, but I guess sm's observation takes over here, and "properly ordered" still has unexpected results.
21:11:44 <seydar> how do i make something eager?
21:12:05 <sm> a simple way is to print it
21:12:06 <geekosaur> not guaranteed if you did it via redirection, because each Handle is still buffered independently even if they end up writing to the same place
21:12:41 <sm> (not trace it)
21:13:29 <seydar> sm: dammit, now i have to copy everything and move it to an IO () function
21:14:23 <sm> ie, using print in the IO monad. There's also `seq`, deepseq, and such like
21:14:28 <geekosaur> also, sadly, GNU stdbuf doesn't work on haskell programs because they don't use glibc's buffering stuff
21:14:56 <sm> when you're just debugging, the lazy ordering usually isn't a big problem, in fact it gives good insight into program execution
21:15:08 <sm> labeling the values can help
21:15:32 <EvanR> % let x = trace "foo" 1; y = trace "bar" 2 in (x,y)
21:15:40 <geekosaur> no yahb still
21:15:46 <EvanR> YAAAAAHB
21:16:13 <sm> if you really want guaranteed definite ordered output, then that's logging and yes requires IO
21:16:13 <geekosaur> no mniip still. hope they're enjoying their vacation or whatever
21:16:30 <geekosaur> (hoping it's that and not, say, a hospital stay)
21:17:04 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
21:17:06 geekosaur wonders if there are enough pieces in mniip's github to assemble a new yahb
21:17:30 <EvanR> if tony stark dies, no one is iron man
21:17:57 <EvanR> (spoiler alert)
21:18:25 <geekosaur> I found the bot core there and the sandboxing stuff, but I don't think it has how to glue them together into a yahb
21:19:27 <EvanR> mniip's biosignature unlocks a hidden vault which release autoscripts to glue all the pieces together onto them (or whoever can fake access)
21:19:36 <geekosaur> (or even how to sandbox a ghci)
21:21:28 hololeap_ joins (~hololeap@user/hololeap)
21:23:55 eraziel joins (~eraziel@modemcable169.17-58-74.mc.videotron.ca)
21:24:03 <seydar> "traceShow (y, x) `seq` traceShowId bases" did not have the effect i thought it would. only the second trace statement was executed
21:25:58 <monochrom> (Mixing up conversations) So yahb is Iron Man??!!
21:27:19 <sm> welcome to the second level of the wacky world of haskell lazy evaluation!
21:27:46 <sm> replace seq with $ there I think
21:28:37 <eraziel> what's a good way to ensure a small chunk of code runs uninterrupted ? doing this right now `finally (pure ()) thingIdLikeToRunUninterrupted`
21:28:50 <eraziel> the `pure ()` part seems off
21:30:12 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
21:30:28 <monochrom> Yeah this one seems to be a simple misunderstanding of traceShow. Consider giving it two arguments.
21:30:29 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
21:30:31 <EvanR> before you complain that yahb was autonomous and could be commanded by anybody here, iron man has automated clones
21:31:34 <monochrom> Ooohhh!!! So yahb is Jarvis...
21:32:37 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
21:32:38 × gensyst quits (gensyst@user/gensyst) (Quit: Leaving)
21:34:20 <seydar> okay so it looks like all of my life's woes come from the fact that i can't get the ordering right in this list comprehension
21:34:33 <seydar> it is ordering... non-deterministically
21:35:10 <seydar> it is ordering deterministically according to an unknown god
21:35:41 <sm> trace more things to see what the heck it's doing
21:35:42 <darkling> Did you forget to feed the shoggoths?
21:36:34 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
21:37:27 <seydar> sm: this is the result of my tracing
21:37:27 × Katarushisu quits (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) (Quit: The Lounge - https://thelounge.chat)
21:37:30 <EvanR> yeah don't confuse non-determinism with "not what I thought I ordered"
21:38:06 Katarushisu joins (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net)
21:38:09 <monochrom> Ugh list comprehension data order is orthogonal to evaluate order if that's what you mean.
21:38:46 <monochrom> Or rather s/data order/linked list order/
21:39:20 <seydar> okay i don't think this is the source of my bug
21:39:30 hololeap_ joins (~hololeap@user/hololeap)
21:39:40 <sm> I'd trace more till it makes sense. Things get evaluated when needed and not before, This is often surprising to a human
21:40:02 <EvanR> unless the human was raised by lazy wolves or something
21:41:02 <sm> unless raised by lazy wolves 🐺
21:41:02 <seydar> what's that eager version of haskell called?
21:41:07 × emanon42 quits (~emanon42@103.120.19.44) (Quit: The Lounge - https://thelounge.chat)
21:41:22 <EvanR> purescript
21:43:18 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
21:43:21 emanon42 joins (~emanon42@103.120.19.44)
21:43:25 <monochrom> sm: The context is effectless pure code that processes lists and number crunching, the observation is that the resulting numbers are wrong and/or the numbers are in a wrong order in the resulting lists. Lazy evaluation could be seen as nondeterministic but not to the point of being nondeterminitic in answers, we are not talking about unsafeInterleaveIO.
21:43:30 <seydar> time for my favorite game: bug or floating point error
21:44:10 <EvanR> floating point problem between chair and keyboard
21:44:25 <monochrom> I did suggest using Debug.Trace but the purpose was to observe and check intermediate numbers, not to confuse wrong numbers with wrong evaluation order.
21:44:42 <seydar> monochrom: this new level of hell is all thanks to Debug.Trace
21:44:47 <sm> ah, thanks
21:45:10 <EvanR> you realize purity was instituted because otherwise laziness would be ridiculous
21:45:12 <monochrom> This case needs zero understanding of evaluation orders. It doesn't matter at all.
21:45:56 <EvanR> but really Debug.Trace is really very mild in terms of side effects
21:46:12 <seydar> monochrom: i'm coming around to that conclusion. i just had a moment of public panic
21:48:27 <dibblego> dminuoso: show me the use-case
21:49:09 <seydar> also you guys aren't gonna believe this but the evaluation order that i thought was crazy actually makes perfect sense
21:49:17 <dibblego> (also, I have heard the []/Maybe argument before and after analysis, typically the claimant learns that it is not a good argument -- there are better arguments, though they also still fail)
21:49:38 zeenk joins (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d)
21:50:05 <sm> welcome to level 3!
21:51:16 <EvanR> you're dangerously close to being unable to return to normal programming languages
21:52:24 <EvanR> you can go back once you get to level 6
21:52:27 mikoto-chan joins (~mikoto-ch@213.177.151.239)
21:52:31 Polo joins (~Polo@user/polo)
21:53:05 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
21:55:39 × coot quits (~coot@213.134.190.95) (Quit: coot)
21:56:33 × gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving)
21:58:01 <seydar> i like the cthulu^H^H^H^H^H^Hhaskell forces you to write top-down
21:58:57 <seydar> i'm reading some C code right now and constantly asking "what are you trying to say"
21:59:04 × Topsi quits (~Topsi@dyndsl-037-138-064-083.ewe-ip-backbone.de) (Read error: Connection reset by peer)
22:01:33 <seydar> ugh i hate this
22:01:42 <seydar> all these bugs are derived from ROUNDING ERRORS
22:01:50 <seydar> adding all these doubles!
22:03:00 × kimjetwav quits (~user@2607:fea8:2362:b400:e8cd:c90e:aafe:7f5b) (Remote host closed the connection)
22:05:33 <apache2> can I get show to output whitespace/indentation?
22:10:49 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
22:11:53 <geekosaur> @hackage pretty-show
22:11:54 <lambdabot> https://hackage.haskell.org/package/pretty-show
22:11:56 <geekosaur> maybe
22:11:59 <geekosaur> show itself, no
22:14:29 × fendor quits (~fendor@91.141.58.225.wireless.dyn.drei.com) (Remote host closed the connection)
22:14:51 <monochrom> `show (Just 4)` will give you a space but no indentation.
22:18:14 <EvanR> haskell doesn't force you to write top down
22:18:25 <EvanR> > let ppɐ = (+) in ppɐ 2 2
22:18:27 <lambdabot> 4
22:18:30 <monochrom> Yeah, that.
22:18:44 <apache2> thanks geekosaur I'll try that
22:19:00 × zeenk quits (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!)
22:19:13 × liz_ quits (~liz@host109-151-128-120.range109-151.btcentralplus.com) (Quit: Lost terminal)
22:22:02 × Tuplanolla quits (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi) (Quit: Leaving.)
22:27:43 Guest|99 joins (~Guest|99@217-121-250-5.cable.dynamic.v4.ziggo.nl)
22:27:51 <seydar> my program has been deviating from the test program because apparently... they are receiving different input
22:28:33 <seydar> i need a drink
22:29:04 × ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 240 seconds)
22:29:14 <hpc> there's a liquid haskell joke in there somewhere
22:29:51 <monochrom> :)
22:30:01 <monochrom> Liquor Haskell
22:30:55 <hpc> monochrom: haskell needs dependent types to be a real "proof" assistant
22:32:19 Guest|99 parts (~Guest|99@217-121-250-5.cable.dynamic.v4.ziggo.nl) ()
22:32:43 <monochrom> "Liquor Haskell combines dependent typing, dependent refinement typing, dependent predicate subtyping, and dependent linear typing."
22:33:10 <apache2> :)
22:33:21 <monochrom> "Computer science has just become a bit too technical. Let's go for a drink." -- Jay Misra
22:33:22 <maerwald[m]> Since when is Haskell trying to become a proof assistant?
22:33:42 <apache2> since it became alcoholic?
22:33:56 <maerwald[m]> That sounds right
22:33:59 <maerwald[m]> Cheers
22:34:28 <monochrom> No no no, not proof assistant. 100-proof assistant.
22:34:29 <apache2> isn't that a big pun on liquor/dependent (addicted)/proof(as in strong alcohol) etc?
22:34:46 <hpc> yep
22:34:50 jargon joins (~jargon@174-22-206-112.phnx.qwest.net)
22:34:59 <hpc> these aren't your usual internet puns
22:35:06 <hpc> these are {-# LANGUAGE RecordPuns #-}
22:35:29 <hpc> i mean, NamedFieldPuns
22:35:52 <maerwald[m]> Isn't that just syntax cocaine?
22:36:33 <monochrom> desugared grape juice
22:37:08 <hpc> maerwald[m]: haskell is inspired by methamatics? :P
22:37:11 <monochrom> and desugared malt etc
22:38:03 <monochrom> In reality, you cannot do equational reasoning. In meth, you can.
22:39:03 <hpc> meth: not even epsilon
22:40:57 × Polo quits (~Polo@user/polo) (Quit: Textual IRC Client: www.textualapp.com)
22:44:34 × teo quits (~teo@user/teo) ()
22:51:00 × mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 276 seconds)
22:54:03 × machinedgod quits (~machinedg@24.105.81.50) (Ping timeout: 256 seconds)
22:57:04 × hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds)
23:00:17 hololeap_ joins (~hololeap@user/hololeap)
23:00:20 × xaotuk quits (~sasha@net224-32-245-109.mbb.telenor.rs) (Ping timeout: 260 seconds)
23:00:52 × acidjnk quits (~acidjnk@p200300d0c7068b43f1a15e75027d04fd.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
23:01:10 × stackdroid18 quits (14094@user/stackdroid) (Quit: hasta la vista... tchau!)
23:07:05 × eraziel quits (~eraziel@modemcable169.17-58-74.mc.videotron.ca) (Quit: Client closed)
23:08:35 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
23:10:04 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 240 seconds)
23:10:04 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
23:10:39 malinoskj290645 joins (~malinoskj@c-68-33-26-115.hsd1.md.comcast.net)
23:11:34 × malinoskj290645 quits (~malinoskj@c-68-33-26-115.hsd1.md.comcast.net) (Client Quit)
23:11:40 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.)
23:11:54 × chomwitt quits (~chomwitt@2a02:587:dc19:d600:6d5a:79e9:ac14:c3a8) (Ping timeout: 252 seconds)
23:11:55 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
23:11:57 azimut joins (~azimut@gateway/tor-sasl/azimut)
23:12:53 chexum joins (~quassel@gateway/tor-sasl/chexum)
23:14:45 machinedgod joins (~machinedg@24.105.81.50)
23:20:16 <seydar> WOW i had another list comprehension that failed to grok inner- vs outer-loop variables
23:20:20 <seydar> so... my bad
23:32:36 lagooned joins (~lagooned@108-208-149-42.lightspeed.hstntx.sbcglobal.net)
23:34:46 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
23:41:03 × alp_ quits (~alp@user/alp) (Ping timeout: 252 seconds)
23:43:17 vicfred joins (~vicfred@user/vicfred)
23:47:59 <seydar> this project is showing me just how poorly i know haskell and just how poorly i can read
23:49:56 × jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds)
23:54:05 <seydar> i'm having (Integral Double) troubles again: https://paste.tomsmeding.com/TgdvpoGl
23:54:22 <seydar> what does it mean when it says "no instance of (Integral Double)"?
23:55:47 <seydar> ah. as soon as I removed the `::Double` and the `round`, my problem went away
23:55:54 <seydar> which leads me to believe that:
23:55:56 <seydar> :t floor
23:55:57 <lambdabot> (RealFrac a, Integral b) => a -> b
23:56:20 <seydar> okay that doesn't mean much to me, but it feels like `floor` is already making it an Int
23:57:58 <monochrom> But what does "limit 0 18" expect?
23:59:37 × jao quits (~jao@211.68.17.95.dynamic.jazztel.es) (Remote host closed the connection)

All times are in UTC on 2022-05-05.