Home liberachat/#haskell: Logs Calendar

Logs on 2023-10-07 (liberachat/#haskell)

00:02:54 sympt joins (~sympt@user/sympt)
00:04:14 × Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 255 seconds)
00:05:53 × puke quits (~puke@user/puke) (Quit: puke)
00:09:16 puke joins (~puke@user/puke)
00:14:58 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 272 seconds)
00:26:18 × privacy quits (~privacy@user/privacy) (Quit: Leaving)
00:30:43 khumba joins (~khumba@user/khumba)
00:50:20 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
00:50:35 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 240 seconds)
00:51:40 Lord_of_Life_ is now known as Lord_of_Life
00:57:30 × Pixi` quits (~Pixi@user/pixi) (Ping timeout: 258 seconds)
01:05:00 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 272 seconds)
01:12:58 × billchenchina- quits (~billchenc@2a0c:b641:7a2:320:ee3e:47ca:6070:d71a) (Remote host closed the connection)
01:18:45 Alleria joins (~JohnGalt@user/alleria)
01:20:12 × hyiltiz quits (~hyiltiz@2620:149:13d1::96c) (Ping timeout: 272 seconds)
01:21:28 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
01:24:15 bilegeek joins (~bilegeek@2600:1008:b095:5aab:10d2:439f:4d89:6d45)
01:25:58 Pixi joins (~Pixi@user/pixi)
01:26:16 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
01:27:29 × otto_s quits (~user@p4ff27e4d.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
01:29:04 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 272 seconds)
01:29:19 otto_s joins (~user@p5b0446f7.dip0.t-ipconnect.de)
01:30:42 L29Ah parts (~L29Ah@wikipedia/L29Ah) ()
01:32:52 L29Ah joins (~L29Ah@wikipedia/L29Ah)
01:37:04 × Alleria quits (~JohnGalt@user/alleria) (Quit: Textual IRC Client: www.textualapp.com)
01:37:50 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 255 seconds)
01:38:17 × aforemny quits (~aforemny@i59F516E0.versanet.de) (Ping timeout: 255 seconds)
01:38:23 aforemny_ joins (~aforemny@2001:9e8:6cda:ec00:a6d6:8356:354e:8d01)
01:45:56 × Maxdamantus quits (~Maxdamant@user/maxdamantus) (Ping timeout: 255 seconds)
01:47:35 Maxdamantus joins (~Maxdamant@user/maxdamantus)
01:48:56 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
01:51:01 hyiltiz joins (~hyiltiz@2620:149:13d1::96c)
01:51:13 × _xor quits (~xor@ip-50-5-233-250.dynamic.fuse.net) (Quit: Ping timeout (120 seconds))
01:52:06 _xor joins (~xor@ip-50-5-233-250.dynamic.fuse.net)
01:58:26 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:e0cf:d5dc:ecb2:78c3) (Remote host closed the connection)
01:58:42 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
01:59:56 × todi quits (~todi@p5dca54c6.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in)
02:00:14 todi joins (~todi@p5dca54c6.dip0.t-ipconnect.de)
02:06:54 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
02:06:54 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
02:06:54 wroathe joins (~wroathe@user/wroathe)
02:13:21 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
02:13:21 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
02:13:21 finn_elija is now known as FinnElija
02:13:35 × thegeekinside quits (~thegeekin@189.217.90.224) (Read error: Connection reset by peer)
02:26:34 × Square quits (~Square@user/square) (Ping timeout: 255 seconds)
02:28:52 × phma quits (~phma@host-67-44-208-149.hnremote.net) (Read error: Connection reset by peer)
02:29:17 phma joins (~phma@host-67-44-208-149.hnremote.net)
02:35:33 thegeekinside joins (~thegeekin@189.217.90.224)
02:47:44 abrantesasf joins (~abrantesa@179.217.48.72)
02:49:39 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
02:50:25 × ddellacosta quits (~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 255 seconds)
02:52:11 ddellacosta joins (~ddellacos@ool-44c738de.dyn.optonline.net)
02:52:12 L29Ah parts (~L29Ah@wikipedia/L29Ah) ()
02:53:02 L29Ah joins (~L29Ah@wikipedia/L29Ah)
02:56:45 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
02:58:06 × td_ quits (~td@i5387091A.versanet.de) (Ping timeout: 260 seconds)
02:59:33 sm joins (~sm@plaintextaccounting/sm)
02:59:51 td_ joins (~td@i53870937.versanet.de)
03:00:02 × haasn- quits (~nand@haasn.dev) (Quit: ZNC 1.7.5+deb4 - https://znc.in)
03:02:05 azimut_ joins (~azimut@gateway/tor-sasl/azimut)
03:02:39 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
03:04:14 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 255 seconds)
03:14:25 aforemny joins (~aforemny@2001:9e8:6ce5:2900:3ebe:1c43:4cc8:272d)
03:16:06 × aforemny_ quits (~aforemny@2001:9e8:6cda:ec00:a6d6:8356:354e:8d01) (Ping timeout: 272 seconds)
03:16:50 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
03:20:12 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
03:24:35 × todi quits (~todi@p5dca54c6.dip0.t-ipconnect.de) (Quit: ZNC - https://znc.in)
03:25:09 todi joins (~todi@p5dca54c6.dip0.t-ipconnect.de)
03:37:06 × thegeekinside quits (~thegeekin@189.217.90.224) (Read error: Connection reset by peer)
03:39:28 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 255 seconds)
03:39:54 sm joins (~sm@plaintextaccounting/sm)
03:44:25 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 255 seconds)
03:51:05 × hexology quits (~hexology@user/hexology) (Quit: hex on you ...)
03:52:22 hexology joins (~hexology@user/hexology)
03:53:31 L29Ah joins (~L29Ah@wikipedia/L29Ah)
04:14:09 × hsw_ quits (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Quit: Leaving)
04:14:23 hsw joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
04:30:46 sm joins (~sm@plaintextaccounting/sm)
04:32:46 × abrantesasf quits (~abrantesa@179.217.48.72) (Remote host closed the connection)
04:35:05 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 240 seconds)
04:44:02 × paddymahoney quits (~paddymaho@cpe883d24bcf597-cmbc4dfb741f80.cpe.net.cable.rogers.com) (Remote host closed the connection)
04:49:03 blackfield joins (~aenima@85.255.4.218)
04:49:05 × hyiltiz quits (~hyiltiz@2620:149:13d1::96c) (Ping timeout: 240 seconds)
04:50:04 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
04:52:07 × sabino quits (~sabino@user/sabino) (Quit: Lambda _ -> x)
04:57:45 × bliminse quits (~bliminse@user/bliminse) (Remote host closed the connection)
05:02:55 elbear joins (~lucian@109.101.137.234)
05:07:24 × elbear quits (~lucian@109.101.137.234) (Ping timeout: 248 seconds)
05:19:21 × bilegeek quits (~bilegeek@2600:1008:b095:5aab:10d2:439f:4d89:6d45) (Quit: Leaving)
05:20:09 sm joins (~sm@plaintextaccounting/sm)
05:22:58 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
05:24:28 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 248 seconds)
05:25:47 lg188 joins (~lg188@82.18.98.230)
05:28:28 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
05:31:48 bliminse joins (~bliminse@user/bliminse)
05:45:06 × whodevil quits (~whodevil@user/whodevil) (Remote host closed the connection)
05:46:21 qqq joins (~qqq@92.43.167.61)
05:48:20 akegalj joins (~akegalj@78-3-38-175.adsl.net.t-com.hr)
05:53:46 sm joins (~sm@plaintextaccounting/sm)
05:55:58 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 255 seconds)
05:56:01 × todi quits (~todi@p5dca54c6.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
05:56:33 todi joins (~todi@p5dca54c6.dip0.t-ipconnect.de)
05:58:25 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 258 seconds)
06:02:26 <remexre> with WAI / warp, is there a standard way for middlewares to pass data to the rest of the Application without needing to manually plumb it around?
06:02:56 <remexre> I was expecting to find a TypeMap or something on Request
06:03:06 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Quit: Leaving)
06:05:01 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:07:40 × qqq quits (~qqq@92.43.167.61) (Ping timeout: 248 seconds)
06:08:02 qqq joins (~qqq@92.43.167.61)
06:19:55 hyiltiz joins (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com)
06:24:05 × hyiltiz quits (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com) (Ping timeout: 240 seconds)
06:26:34 × akegalj quits (~akegalj@78-3-38-175.adsl.net.t-com.hr) (Quit: leaving)
06:29:20 hyiltiz joins (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com)
06:31:33 acidjnk joins (~acidjnk@p200300d6e7072f72f8dec80e9aca23dc.dip0.t-ipconnect.de)
06:37:54 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
06:38:07 chexum joins (~quassel@gateway/tor-sasl/chexum)
06:39:16 × hyiltiz quits (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com) (Ping timeout: 260 seconds)
06:46:46 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
06:54:45 aliosablack joins (~chomwitt@2a02:587:7a24:b000:1ac0:4dff:fedb:a3f1)
06:55:08 × khumba quits (~khumba@user/khumba) ()
07:05:16 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
07:06:10 hyiltiz joins (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com)
07:09:05 vglfr joins (~vglfr@88.155.180.78)
07:10:36 × hyiltiz quits (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com) (Ping timeout: 240 seconds)
07:11:17 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 255 seconds)
07:12:38 hyiltiz joins (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com)
07:16:44 × hyiltiz quits (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com) (Ping timeout: 245 seconds)
07:21:35 gmg joins (~user@user/gehmehgeh)
07:21:53 × stiell quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 252 seconds)
07:22:15 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 252 seconds)
07:22:15 × chiselfuse quits (~chiselfus@user/chiselfuse) (Ping timeout: 252 seconds)
07:22:59 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 252 seconds)
07:24:25 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
07:24:29 chiselfuse joins (~chiselfus@user/chiselfuse)
07:24:55 ChaiTRex joins (~ChaiTRex@user/chaitrex)
07:26:26 × vglfr quits (~vglfr@88.155.180.78) (Read error: Connection reset by peer)
07:26:46 vglfr joins (vglfr@gateway/vpn/protonvpn/vglfr)
07:32:41 stiell joins (~stiell@gateway/tor-sasl/stiell)
07:42:16 × rgw quits (~R@2605:a601:a0df:5600:fd37:73ed:1518:5c4b) (Read error: Connection reset by peer)
07:48:11 fendor joins (~fendor@2a02:8388:1640:be00:aab:1226:f274:5021)
07:49:44 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
07:51:56 sm joins (~sm@plaintextaccounting/sm)
07:52:49 × Maeda quits (~Maeda@91-161-10-149.subs.proxad.net) (Quit: leaving)
07:54:32 hugo joins (znc@verdigris.lysator.liu.se)
07:54:59 Jackneill joins (~Jackneill@20014C4E1E1DF200085D5E2535870783.dsl.pool.telekom.hu)
07:56:03 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
07:56:15 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 240 seconds)
07:57:35 cpressey joins (~cpressey@host-92-10-151-176.as13285.net)
08:01:36 danza joins (~francesco@151.47.20.60)
08:10:20 × vglfr quits (vglfr@gateway/vpn/protonvpn/vglfr) (Ping timeout: 248 seconds)
08:10:43 Maeda joins (~Maeda@91-161-10-149.subs.proxad.net)
08:11:11 vglfr joins (~vglfr@88.155.180.78)
08:15:01 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
08:15:29 <danza> hello to all saturday's workaholics...
08:22:00 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds)
08:24:32 <haskellbridge> <s​m> or chatoholics..
08:28:00 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
08:32:37 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
08:33:30 <int-e> sm h
08:33:54 <mauke> I'm a chataholic, but like with alcohol
08:37:12 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
08:37:25 × azimut_ quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
08:37:32 Sgeo joins (~Sgeo@user/sgeo)
08:40:44 <int-e> too close to "catholic", can't unsee
08:46:35 sm joins (~sm@plaintextaccounting/sm)
08:47:17 <haskellbridge> <s​m> hi I'm sm and I might have a little chat problem
08:47:38 <haskellbridge> <s​m> it's anonymous in here right ?
08:47:47 <int-e> Yes, Simon.
08:48:38 <haskellbridge> <s​m> 😅
08:49:05 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Ping timeout: 240 seconds)
08:50:36 hugo joins (znc@verdigris.lysator.liu.se)
08:51:19 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 264 seconds)
08:51:47 <danza> is sm Simon Marlow? wow
08:52:43 <[exa]> sshhh, play along the anonymous game!
08:53:02 <danza> ^^;
08:53:17 danza is glad not to be famous, for once
08:53:19 × tzh quits (~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Quit: zzz)
08:53:43 Pickchea joins (~private@user/pickchea)
08:53:48 <haskellbridge> <s​m> no, danza
08:53:58 <mauke> no, Michael
08:54:27 <nullie> that was so not right
08:55:31 danza searchs the web for an haskeller called Simon Michael
08:58:42 Tuplanolla joins (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
08:58:44 <danza> now i would be happy to chat about what i found... but something is not right so i will cut it here
08:59:30 <danza> i don't know, anyways, communication is so tied to my work these days, i would put chataholism under the workaholism umbrella
09:00:31 <[exa]> danza: pls elaborate on #-offtopic :]
09:01:37 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 260 seconds)
09:04:21 <danza> i think the conversation pretty much finished there. If people reply means they are not annoyed, also because this channel is a bit too boring most of the times. And you just started talking about other stuff on #-offtopic, it would be rude to overlap with that
09:06:10 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
09:12:04 × aliosablack quits (~chomwitt@2a02:587:7a24:b000:1ac0:4dff:fedb:a3f1) (Ping timeout: 252 seconds)
09:12:43 <[exa]> danza: don't ask to overlap, just overlap
09:13:58 <haskellbridge> <s​m> it's fine danza (and mauke) though of course in general it's safer to let folks share their own name
09:14:12 <haskellbridge> <s​m> if that's what you're talking about
09:14:13 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
09:14:41 <haskellbridge> <s​m> hello ! 👋🏻 😎
09:17:39 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
09:17:54 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
09:18:02 × phma quits (~phma@host-67-44-208-149.hnremote.net) (Read error: Connection reset by peer)
09:18:32 remexre_ joins (~remexre@user/remexre)
09:18:58 phma joins (~phma@2001:5b0:2143:cec8:c3c:3fa4:1ab9:dd90)
09:19:01 × remexre quits (~remexre@user/remexre) (Ping timeout: 260 seconds)
09:19:31 <danza> i am not sure what we are talking about, it was nullie warning about things not being right. Anyway moving to #-offtopic
09:19:46 remexre_ is now known as remexre
09:23:09 <haskellbridge> <s​m> so... what're we all doing/thinking in Haskell today
09:24:15 <nullie> Sorry, that was an F1 joke
09:24:43 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
09:25:29 mmhat joins (~mmh@p200300f1c74e6ffcee086bfffe095315.dip0.t-ipconnect.de)
09:25:39 × mmhat quits (~mmh@p200300f1c74e6ffcee086bfffe095315.dip0.t-ipconnect.de) (Client Quit)
09:27:10 sm joins (~sm@plaintextaccounting/sm)
09:28:35 <danza> should we move to offtopic or not? I am confused. Anyways i think the job market is depressing in haskell today ... that prevents much of the doing :P
09:28:39 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
09:29:51 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds)
09:30:13 <haskellbridge> <s​m> I got a job from having haskell on my resume once
09:30:23 <tomsmeding> was it a Haskell job?
09:30:34 <haskellbridge> <s​m> nope
09:30:35 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Ping timeout: 240 seconds)
09:30:43 <danza> XD
09:30:57 <haskellbridge> <s​m> though Indid get to give a (underprepared, very bad) lunchtime talk on it
09:31:20 <tomsmeding> lunchtime talks are best if they are underprepared
09:31:38 <haskellbridge> <s​m> (it was a great job nevertheless, though
09:31:39 <haskellbridge> <s​m> short lived)
09:33:05 elbear joins (~lucian@86.120.11.223)
09:35:41 <haskellbridge> <s​m> if you want to be employed doing haskell, I think there's employers that want you, but you have to seek them out
09:36:58 <danza> the disproportion with other technologies is such to give "wearing the hard shirt" a new meaning
09:37:32 <haskellbridge> <s​m> sure it's not everywhere like mainstream techs, so what
09:37:46 × elbear quits (~lucian@86.120.11.223) (Ping timeout: 260 seconds)
09:42:06 <danza> i guess the biggest problem i have with this situation is it mines my confidence about the value i see in the language. Possibly the second problem, i worry about its longevity
09:42:21 <tomsmeding> haskell has been around for 30+ years
09:43:39 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
09:45:09 × danza quits (~francesco@151.47.20.60) (Read error: Connection reset by peer)
09:45:17 danza joins (~francesco@151.47.12.170)
09:45:36 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 272 seconds)
09:47:16 <danza> i know, i might worry too much about changes. Considering technological evolution in the past 20 years, i became a bit pessimistic about what stays and what goes, and my first point does not help for more optimism
09:47:21 × vglfr quits (~vglfr@88.155.180.78) (Read error: Connection reset by peer)
09:47:40 hugo joins (znc@verdigris.lysator.liu.se)
09:47:41 vglfr joins (~vglfr@149.102.244.101)
09:47:52 <tomsmeding> is it bad if technology evolves, replacing old stuff with newer, better stuff?
09:47:53 <haskellbridge> <s​m> it'll continue in another form even if called something else. It's also a super power to have in your toolbox
09:48:02 <tomsmeding> also that
09:48:10 <tomsmeding> but there's various rates of change here
09:48:26 <tomsmeding> famously, JS frameworks change every year to every month, if you're unlucky
09:48:32 <tomsmeding> programming languages take decades
09:48:41 <haskellbridge> <s​m> but sure, prioritize what you learn if needed to get employment in the short term
09:50:06 <tomsmeding> programming in the way we know it today hasn't been a thing for more than 75 years
09:50:31 <tomsmeding> and at 75 years ago we're talking about moving from pushing buttons to storing a program in _memory_
09:50:40 <tomsmeding> compilers were not yet in sight
09:50:54 <tomsmeding> allow some time to settle :p
09:51:08 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
09:51:44 <int-e> going down memory l[ai]ne: https://en.wikipedia.org/wiki/Delay_line_memory
09:53:36 <danza> in my opinion as haskellers we work on concepts that are on the scale of thousands of years, basically the age of math, so 75 years do not mean much to me
09:53:50 <tomsmeding> then what's the problem :p
09:55:15 <danza> but even in my very limited life span i have seen projects dying as corporations found better ways to control their technologies, and contingency sometimes matters
09:58:01 michalz joins (~michalz@185.246.204.107)
09:58:06 sm joins (~sm@plaintextaccounting/sm)
10:02:34 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 245 seconds)
10:11:36 × vglfr quits (~vglfr@149.102.244.101) (Remote host closed the connection)
10:12:19 <cpressey> I can't imagine myself getting a Haskell job because I'm sure they'd want me to use all the features of Haskell that I have no love for
10:12:21 vglfr joins (~vglfr@88.155.180.78)
10:12:49 <Rembane> cpressey: And no other.
10:13:05 × vglfr quits (~vglfr@88.155.180.78) (Read error: Connection reset by peer)
10:13:20 vglfr joins (~vglfr@149.102.244.101)
10:14:51 × vglfr quits (~vglfr@149.102.244.101) (Remote host closed the connection)
10:15:04 vglfr joins (~vglfr@149.102.244.101)
10:18:34 <danza> see, with other languages, people choose the job on the features they do like
10:20:32 × oo_miguel quits (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Quit: oo_miguel)
10:21:04 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds)
10:22:40 × michalz quits (~michalz@185.246.204.107) (Ping timeout: 255 seconds)
10:24:23 oo_miguel joins (~Thunderbi@78-11-179-96.static.ip.netia.com.pl)
10:33:42 hugo joins (znc@verdigris.lysator.liu.se)
10:52:42 sm joins (~sm@plaintextaccounting/sm)
10:54:33 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
10:57:48 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 272 seconds)
10:58:56 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
11:10:13 sm joins (~sm@plaintextaccounting/sm)
11:15:04 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Ping timeout: 245 seconds)
11:15:06 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 260 seconds)
11:21:58 aliosablack joins (~chomwitt@2a02:587:7a24:b000:1ac0:4dff:fedb:a3f1)
11:23:28 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
11:23:53 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
11:25:20 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Client Quit)
11:26:18 × falafel quits (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 272 seconds)
11:26:50 sm joins (~sm@plaintextaccounting/sm)
11:28:15 billchenchina joins (~billchenc@2a0c:b641:7a2:320:ee3e:47ca:6070:d71a)
11:31:31 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 255 seconds)
11:32:23 privacy joins (~privacy@user/privacy)
11:35:45 × xff0x quits (~xff0x@2405:6580:b080:900:4efc:9689:a16f:b515) (Ping timeout: 258 seconds)
11:37:48 xff0x joins (~xff0x@178.255.149.135)
11:38:58 sm joins (~sm@plaintextaccounting/sm)
11:43:01 × puke quits (~puke@user/puke) (Remote host closed the connection)
11:43:46 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 260 seconds)
11:48:21 × danza quits (~francesco@151.47.12.170) (Read error: Connection reset by peer)
11:49:53 puke joins (~puke@user/puke)
11:51:57 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 260 seconds)
11:59:08 × vglfr quits (~vglfr@149.102.244.101) (Ping timeout: 258 seconds)
12:03:41 hugo joins (znc@verdigris.lysator.liu.se)
12:14:19 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
12:14:37 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
12:16:00 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 258 seconds)
12:24:37 sm joins (~sm@plaintextaccounting/sm)
12:26:02 × acidjnk quits (~acidjnk@p200300d6e7072f72f8dec80e9aca23dc.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
12:28:22 × ec quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
12:28:49 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 245 seconds)
12:28:58 ec joins (~ec@gateway/tor-sasl/ec)
12:30:11 hugo joins (znc@verdigris.lysator.liu.se)
12:31:57 × xff0x quits (~xff0x@178.255.149.135) (Ping timeout: 255 seconds)
12:33:39 xff0x joins (~xff0x@2405:6580:b080:900:54b9:b3f0:7086:8bcc)
12:34:19 vglfr joins (~vglfr@88.155.180.78)
12:35:42 acidjnk joins (~acidjnk@p200300d6e7072f72f8dec80e9aca23dc.dip0.t-ipconnect.de)
12:35:53 Square joins (~Square@user/square)
12:36:54 sm joins (~sm@plaintextaccounting/sm)
12:41:03 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 240 seconds)
12:44:48 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
12:48:00 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds)
12:48:20 Nixkernal joins (~Nixkernal@119.4.193.178.dynamic.wline.res.cust.swisscom.ch)
12:54:58 sm joins (~sm@plaintextaccounting/sm)
12:57:47 sm_ joins (~sm@plaintextaccounting/sm)
12:59:00 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 240 seconds)
13:02:48 hugo joins (znc@verdigris.lysator.liu.se)
13:15:52 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 272 seconds)
13:23:17 × sm_ quits (~sm@plaintextaccounting/sm) (Quit: sm_)
13:23:18 wootehfoot joins (~wootehfoo@user/wootehfoot)
13:24:12 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
13:26:31 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
13:31:09 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
13:31:09 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
13:31:09 wroathe joins (~wroathe@user/wroathe)
13:31:49 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
13:32:29 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
13:41:05 × falafel quits (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 240 seconds)
13:47:18 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer)
13:48:24 euleritian joins (~euleritia@77.22.252.56)
13:51:13 sm joins (~sm@plaintextaccounting/sm)
13:53:48 × dolio quits (~dolio@130.44.134.54) (Quit: ZNC 1.8.2 - https://znc.in)
13:55:13 dolio joins (~dolio@130.44.134.54)
13:55:19 × dolio quits (~dolio@130.44.134.54) (Remote host closed the connection)
13:57:23 harveypwca joins (~harveypwc@2601:246:c180:a570:41a8:a837:a4a7:bda1)
13:59:37 × bliminse quits (~bliminse@user/bliminse) (Quit: leaving)
14:04:53 dolio joins (~dolio@130.44.134.54)
14:08:11 × jespada quits (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Quit: Textual IRC Client: www.textualapp.com)
14:08:26 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds)
14:10:31 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
14:10:35 killerstorm joins (~killersto@224.225.60.94.rev.vodafone.pt)
14:12:56 × euleritian quits (~euleritia@77.22.252.56) (Ping timeout: 255 seconds)
14:13:57 × johnw quits (~johnw@69.62.242.138) (Read error: Connection reset by peer)
14:14:16 johnw joins (~johnw@69.62.242.138)
14:17:05 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
14:17:59 × qqq quits (~qqq@92.43.167.61) (Read error: Connection reset by peer)
14:19:17 hugo joins (znc@verdigris.lysator.liu.se)
14:33:35 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
14:34:06 elevenkb parts (elevenkb@thunix.net) (ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.1))
14:34:24 × privacy quits (~privacy@user/privacy) (Quit: Leaving)
14:37:41 × stites quits (~stites@130.44.147.204) (Ping timeout: 255 seconds)
14:38:54 stites joins (~stites@2607:fb91:dc9:51d1:1285:280d:59e4:7da2)
14:43:12 wroathe joins (~wroathe@50.205.197.50)
14:43:12 × wroathe quits (~wroathe@50.205.197.50) (Changing host)
14:43:12 wroathe joins (~wroathe@user/wroathe)
14:45:35 bliminse joins (~bliminse@user/bliminse)
14:46:44 qqq joins (~qqq@92.43.167.61)
14:48:04 ph88 joins (~ph88@ip5b406c07.dynamic.kabel-deutschland.de)
14:52:15 <ph88> Hi all, i want to construct a type like Foo a b | Bar a b. At the place where i get my `a` i know whether i need a Foo or a Bar (`a` itself does not carry this information). Only much later (higher up in the calltree) i get my b. Would it be better to pass around partial functions as data. Or make a new data type just for signaling if it should be a Foo or Bar later?
14:58:55 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Ping timeout: 258 seconds)
15:00:14 <geekosaur> % data Foo a b = Foo a b | Bar a b deriving (Show,Read)
15:00:14 <yahb2> <no output>
15:00:23 <geekosaur> % :t Foo 5
15:00:23 <yahb2> Foo 5 :: Num a => b -> Foo a b
15:04:49 <ph88> geekosaur, yes that's one alternative. The other would be that i do like data FooBar = MkFoo a | MkFoo b. case x of; MkFoo a -> Foo a b; MkBar a -> Bar a b
15:05:34 <ph88> data FooBar a = MkFoo a | MkFoo a **
15:05:41 <ph88> data FooBar a = MkFoo a | MkBar a **
15:06:32 <geekosaur> you alos have: data FooBar = Foo | Bar; data Foo a b = F FooBar a b
15:06:38 <ph88> maybe it's just me and i considered outputting partial functions more as a trick to be used very locally. not to carry it up the callstack 10 function levels high
15:07:21 Simikando joins (~Simikando@adsl-dyn-244.95-102-83.t-com.sk)
15:07:22 <int-e> Other ideas... if `b` is a type argument you could use (); if it's not you might still use a bottom.
15:07:58 <ph88> aah as functor .. interesting that might work too
15:08:08 todi1 joins (~todi@p4fd1ae09.dip0.t-ipconnect.de)
15:08:22 <int-e> (Both of these handle similarly to making an explicit "partially applied" type)
15:09:00 <int-e> Nothing wrong with partial functions. You can wrap them inside a newtype if the function types in the signature confuse you :)
15:09:19 × todi quits (~todi@p5dca54c6.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
15:10:12 <ph88> thanks for the perspectives geekosaur int-e :)
15:12:15 sm joins (~sm@plaintextaccounting/sm)
15:12:31 × sm quits (~sm@plaintextaccounting/sm) (Client Quit)
15:17:24 sm joins (~sm@plaintextaccounting/sm)
15:17:47 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
15:23:17 sm_ joins (~sm@plaintextaccounting/sm)
15:24:10 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 255 seconds)
15:24:14 khumba joins (~khumba@user/khumba)
15:27:31 × Simikando quits (~Simikando@adsl-dyn-244.95-102-83.t-com.sk) (Quit: Leaving)
15:27:33 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
15:27:55 elbear joins (~lucian@86.120.11.223)
15:29:06 × elbear quits (~lucian@86.120.11.223) (Client Quit)
15:31:51 × billchenchina quits (~billchenc@2a0c:b641:7a2:320:ee3e:47ca:6070:d71a) (Read error: Connection reset by peer)
15:32:35 billchenchina joins (~billchenc@103.152.35.21)
15:34:41 <EvanR> is the most straightforwardest way to write a program in haskell that appears as a win32 desktop GUI app
15:35:17 <EvanR> to write the program against the C API using FFI and have a WinMain wrapper file that calls haskell main
15:35:29 notzmv joins (~zmv@user/notzmv)
15:35:50 <geekosaur> probably. or backend/frontend like a web app, with the frontend in whatever language is convenient
15:40:31 <EvanR> there was a wrong sounding rust rant posted recently about how we're stuck with C at the lowest level and we can't truly be liberated until we can interface with the OS in rust or whatever language without C
15:41:05 <EvanR> it sounded wrong in linux because you can just call into linux using the known mechanisms and C is not required
15:41:14 <geekosaur> it's half right, because at the moment FFIs are based on C
15:41:14 <EvanR> but windows...
15:42:26 <geekosaur> and in particular linux is problematic and arbitrarily changes unless you stick to the C-based entrypoints exported by glibc (yes, musl exists, but it has hardcoded mappings for known kernel versions and breaks if you use it with an unknown kernel version)
15:42:39 <geekosaur> windows is actually more stable in that sense
15:44:24 <ddellacosta> how hard is it to compile gtk apps to Windows? I've heard that API wrapper was straightforward to use in Haskell, but haven't done it myself
15:45:08 <ddellacosta> I guess that's not really what you're going for though, sounds more like proof of concept
15:46:48 <EvanR> I'm guessing a GTK app for linux written in haskell is a solved problem
15:46:51 <[exa]> EvanR: luckily for the rust people, microsoft kinda decided to replace the stuff with .NET which solves the problem :D
15:47:01 <EvanR> lol
15:47:18 <EvanR> isn't that all still built on top of the C api
15:48:02 <[exa]> anyway yeah I'd bet that a linux GTK+haskell app will (with some random effort inherent to win32) also compile to win32
15:49:22 <[exa]> there's plenty of gtk apps that work on windows and the people care about maintaining it, so I'd assume the task would not be a total one-nerd show
15:49:43 <EvanR> hahaha
15:50:02 <[exa]> but yeah as always, it's windows and YMWV
15:51:40 <EvanR> I was thinking that a long winded article on programming in haskell would need to have a realistic program to go with it. And the most realistic thing I can think of is a graphical windows app that uses windows. Which I know isn't that popular to try in haskell. But should be possible and a good place to demonstrate methods to build in abstractions to allow porting to other desktop tech
15:52:32 <[exa]> tbh I'd love to start one such thing too, wanted a RDF editor for people
15:52:58 <[exa]> and anything that avoids javascript and electron in the process is A GODSEND
15:53:03 <EvanR> right
15:53:17 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
15:53:48 <ddellacosta> what about with something like https://haskell-miso.org/ or https://reflex-frp.org/, or even https://hackage.haskell.org/package/brick
15:53:52 <[exa]> anyway pandoc ain't good enough? :D
15:54:35 <EvanR> pandoc is a rather large program for demonstration purposes
15:54:36 <[exa]> ddellacosta: I didn't see a very scaled-out FRP app so far (unfortunately!)
15:54:53 × raym quits (~ray@user/raym) (Quit: update to FreeBSD 14.0-BETA5)
15:55:08 <ddellacosta> oh yeah, that's reasonable, but if it's just about sharing something useful in Haskell for the purposes of an article. But I dunno, just spitballing here
15:55:23 <[exa]> anyway yeah brick apps are lovely
15:55:46 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
15:56:12 <[exa]> EvanR: btw you already stumbled upon the gi-gtk-examples, right?
15:56:31 <EvanR> miso reflex brick wxwidgets fltk or other thing would detract from an argument that haskell can stand on its own as a general purpose language that could replace C++ for some purpose on windows, an argument which could be doomed to fail but hey
15:56:52 <EvanR> yeah I've seen gtk stuff in haskell so that's good for linux
15:56:59 <EvanR> and pretty bad for OSX
15:57:25 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
15:59:45 <EvanR> gtk might be the sanest route for a real project that must be in haskell for some reason, but then it establishes haskell as a linux language xD
16:00:16 <EvanR> apologies to BSD people who probably have haskell working fine
16:01:11 <ddellacosta> okay yeah, I better see the angle you're coming at it from now. I think the reality is that it's going to be a hard sell--I think it's hard to argue that C++ doesn't have more of a foothold in Windows, however you slice it. But that's not an argument against Haskell as a general purpose programming language, IMHO
16:01:28 <ddellacosta> I may be biased lol
16:01:48 <EvanR> general purposes minus specific things
16:01:54 <EvanR> subtractive purposes
16:02:27 <geekosaur> brick doesn't work under windows (yet)
16:02:34 <ddellacosta> oh, whoops
16:03:17 <EvanR> I think the only barrier here is visual studio doesn't have a haskell option which does this winmain thing for you
16:03:18 <ddellacosta> for some reason I assumed it was a given with WSL or whatever it is
16:03:46 <geekosaur> wsl works but isn't native, the end user has to fire up a wsl session and run the program inside it
16:03:56 <ddellacosta> ah, I see.
16:04:31 <geekosaur> it's literally ubuntu running inside hyper-v, with no integration
16:05:02 <geekosaur> wsl1 had integration but not enough compatibility
16:05:23 <geekosaur> (and in particular haskell programs didn't work with it iirc)
16:16:48 __monty__ joins (~toonn@user/toonn)
16:17:41 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
16:17:57 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
16:18:55 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
16:20:24 × stiell quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
16:20:48 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 272 seconds)
16:20:52 stiell joins (~stiell@gateway/tor-sasl/stiell)
16:30:55 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
16:39:22 tzh joins (~tzh@c-71-193-181-0.hsd1.or.comcast.net)
16:48:27 × Maeda quits (~Maeda@91-161-10-149.subs.proxad.net) (Quit: BRB)
16:48:33 × lg188 quits (~lg188@82.18.98.230) (Quit: Ping timeout (120 seconds))
16:48:51 lg188 joins (~lg188@82.18.98.230)
16:52:22 <ph88> is there any typeclass that allows me to take one element of a data structure ? like one element of a list or vector? Usually i use Foldable but i realized it doesn't give me the ability to short iterating on the sequence. What can be done?
16:52:49 <ph88> "Abortable iterator" typeclass kind of thing
16:53:25 <geekosaur> https://hackage.haskell.org/package/witherable ?
16:54:13 <monochrom> Foldable methods can be combined to do that.
16:54:21 × killerstorm quits (~killersto@224.225.60.94.rev.vodafone.pt) (Quit: Client closed)
16:54:40 <monochrom> The lowest-tech way is toList then take 1. There is probably a fancier way.
16:55:08 Maeda joins (~Maeda@91-161-10-149.subs.proxad.net)
16:55:13 <geekosaur> lens offers `ix`
16:55:50 <monochrom> Most instances' toList are lazy enough that take 1 . toList spends minimal time.
16:56:55 <ph88> monochrom, if possible without losing the original type. So i need a polymorphic version of toList and fromList in that case
16:57:20 <monochrom> In Haskell, at least in the pure FP fragment, you don't code up imperative control flow for early exit, you use laziness and let take does the truncation.
16:57:29 <geekosaur> if you're taking only one element, you're losing the container anyway
16:57:37 <geekosaur> otherwise you probably do want witherable
16:58:24 <monochrom> Injecting an element to a singleton data structure is covered by Applicative's pure. >:)
16:58:46 × sm_ quits (~sm@plaintextaccounting/sm) (Quit: sm_)
17:01:14 <ph88> monochrom, i saw it being encoded as recursive function which decides to no longer call itself as "early exit"
17:01:52 <monochrom> That's what take does.
17:02:08 <monochrom> But the producer of the list, it just keeps producing and not care.
17:02:17 <monochrom> Namely, toList is the list producer.
17:04:00 × harveypwca quits (~harveypwc@2601:246:c180:a570:41a8:a837:a4a7:bda1) (Quit: Leaving)
17:04:55 × puke quits (~puke@user/puke) (Quit: puke)
17:04:57 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
17:05:05 <ph88> i'm confused. What i am trying to do is implement a function mapAll :: (a -> Maybe b) -> f a -> Maybe (f b). That returns Nothing when one time the predicate returns Nothing, otherwise collects the collection into Just. My question is not how to implement it for let's say a list. But whether it's possible to make it polymorphic (for at least List and Vector lets say) and short out early (stop iterating as soon as the condition is
17:05:06 <ph88> met). How could it be done ?
17:06:05 <monochrom> No, I am confused. How does "take one element of a data structure" become "mapAll :: (a -> Maybe b) -> f a -> Maybe (f b)"?
17:06:28 <ph88> monochrom, because from `f a` i want to take one `a` at a time. Perhaps my wording was less than ideal here
17:07:04 <monochrom> Take all elements but use them one at a time? toList.
17:07:49 <ph88> monochrom, i need a polymorphic version of toList and fromList right ?
17:08:26 <ph88> if i want my result type to be `Maybe (f b)`. f ~ f from input to output
17:08:38 <monochrom> OK you still need to produce the same kind of data structure. I might try Traversable.
17:08:53 puke joins (~puke@user/puke)
17:09:16 <ph88> ok thanks, i will look at what Traversable Maybe does
17:09:31 <monochrom> No, Traversable is for the f.
17:09:58 <ph88> ok but how do i know if it has the behavior i want ?
17:10:21 <tomsmeding> :t traverse
17:10:22 <lambdabot> (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
17:10:41 <monochrom> And the Maybe there becomes the Applicative instance.
17:10:56 <tomsmeding> if that seems confusing: 'traverse = sequence . map' is helpful intuition sometimes
17:11:51 <monochrom> You can try to infer from the laws, or you can test examples then use free theorems to infer the general case.
17:12:03 <tomsmeding> ('traverse = sequenceA . fmap' is actually a law, and sequence = sequenceA)
17:13:08 <monochrom> Here is one test:
17:13:36 <monochrom> > traverse (\x -> if x==0 then Just 0 else Nothing) (0 : repeat 1)
17:13:37 <lambdabot> Nothing
17:14:16 <monochrom> It termintes in finite time, despite the infinite list. Some kind of free theorems will generalize it to other data structures.
17:14:17 <ph88> more or less, is Foldable for running the full loop and Traversable for possibly shorting earlier ?
17:14:33 <tomsmeding> Traversable is for doing Foldable inside an Applicative
17:14:48 <tomsmeding> er, no
17:14:52 <monochrom> Oh in this case it's Maybe's <*> that exits early.
17:15:02 <tomsmeding> Traversable is for doing fmap inside an Applicative, i.e. an "effectful" fmap
17:15:07 <tomsmeding> :t fmap
17:15:08 <lambdabot> Functor f => (a -> b) -> f a -> f b
17:15:10 <tomsmeding> :t traverse
17:15:11 <lambdabot> (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
17:15:13 <monochrom> And here is a test for "everyone is Just":
17:15:23 <tomsmeding> fmap's 'f' = traverse's 't'
17:15:32 <monochrom> > traverse (\x -> Just x) [0, 1, 2, 3]
17:15:34 <lambdabot> Just [0,1,2,3]
17:16:52 <tomsmeding> Functor is for independent, elementwise operations; Foldable is for summarisation; Traversable is for "imperative loops" (i.e. loops with Applicative, or Monadic, effects)
17:17:16 <monochrom> traverse just uses <*> and recursion. But Maybe's <*> has a short-circuiting clause that sidesteps traverse's recursion under the condition you required.
17:18:19 <ph88> if Traversable + Applicative (Maybe instance) encodes "shorting out the loop early". What other Applicative behaviors are there to choose from? I know that Either also shorts out early. Isn't it so that in the combination of Traversable + Applicative you can divide all Applicatives in 2 groups: the ones that possibly short early + the ones that don't ?
17:18:39 <monochrom> [] is also an Applicative. IO is also an Applicative.
17:18:41 <tomsmeding> does IO short early?
17:18:49 <tomsmeding> it can if you throwIO :p
17:19:01 <ph88> tomsmeding, then it does i suppose ?
17:19:11 <tomsmeding> does the continuation monad short early
17:19:12 <tomsmeding> ?
17:19:13 <monochrom> Reader, State, Parser, ...
17:19:15 <tomsmeding> ¯\_(ツ)_/¯
17:19:39 <monochrom> Oh I even know how to make Cont do global jumps >:)
17:19:42 <tomsmeding> this goes right down to "what is a Monad"
17:19:57 <tomsmeding> even if we aren't even talking about the full power of Monad here
17:20:01 <monochrom> Um it's worse. "what is an Applicative"!
17:20:29 <ph88> hmm i see what you're saying
17:20:37 <monochrom> The space is large than Monad's space, there are going to be even more weird things out there!
17:21:23 <monochrom> I just haven't been able to imagine the really weird examples.
17:21:41 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf) (Remote host closed the connection)
17:22:06 <monochrom> Currently I have only learned ZipList and non-monadic applicative parsers.
17:22:06 × Maeda quits (~Maeda@91-161-10-149.subs.proxad.net) (Quit: BRB)
17:22:39 <monochrom> which, since they are actually very practical things, can't be said to be weird at all.
17:23:28 × driib quits (~driib@vmi931078.contaboserver.net) (Quit: The Lounge - https://thelounge.chat)
17:23:37 azimut joins (~azimut@gateway/tor-sasl/azimut)
17:23:58 <ph88> i'd like to understand. Where can i find that traverse with Applicative Maybe shorts early? i looked before in the code and i couldn't pinpoint it like i could with imperative code that jumps out of the loop
17:23:58 Heffalump parts (~ganesh@urchin.earth.li) ()
17:24:29 <tomsmeding> ph88: the Applicative instance of Maybe
17:24:42 <tomsmeding> ph88: https://hackage.haskell.org/package/base-4.18.1.0/docs/src/GHC.Base.html#line-1120
17:24:51 <ph88> monochrom, i thought since you been here so long you'd taken all the space :p
17:24:55 <tomsmeding> note that the 'Nothing <*> _' case ignores its second argument
17:25:42 tomsmeding . o O ( monochrom is missing all the coloured examples )
17:25:54 <monochrom> You look at the recursion in "traverse f (x:xs) = pure (:) <*> f x <*> traverse f xs" and you look at the <*> of Maybe "Nothing <*> _ = Nothing" therefore the "... <*> traverse f xs" recursive call is dropped.
17:26:27 <ph88> tomsmeding, ah great thanks, at least that i can understand that in the line above fmap is called another time and in the line below it doesn't call another function
17:26:58 <tomsmeding> > Nothing <*> undefined
17:26:59 <lambdabot> Nothing
17:28:16 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
17:30:46 <ph88> Could i explain Applicative like this: there is a type holding some data. When you want to change it's data the type has a rule what it does with your "change request"
17:31:48 <monochrom> How do you test that hypothesis?
17:32:11 <monochrom> IOW does it have predictive power?
17:32:21 <monochrom> Is it even refutable?
17:32:44 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
17:32:50 <monochrom> Note that in science, irrefutable => meaningless
17:33:02 <tomsmeding> monochrom: I think it is supposed to be intuition; intuition is not falsifiable and not scientific, but nevertheless useful
17:33:03 azimut joins (~azimut@gateway/tor-sasl/azimut)
17:33:48 <geekosaur> until you get to quantum mechanics where intuition will always lead you wrong
17:33:50 <ph88> ye i still don't have intuition for Applicative
17:34:12 <tomsmeding> ph88: but I have a different intuition: Monad is for effectful computation (exceptions, state, IO, whatever), and Applicative is a weaker version of Monad where all subcomputations are independent
17:34:16 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds)
17:34:22 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
17:34:52 <monochrom> No, I have seen successful intuitions that are succesful because, although falsified 10% of the time, have predictive power and have made correct predictions the other 90% of the time.
17:35:12 <ph88> tomsmeding, also useful
17:35:16 × defanor quits (~defanor@tart.uberspace.net) (Quit: .)
17:35:29 <tomsmeding> you get this independentness as follows: in Applicative you have 'pure' (which is clearly a computation whose effects (none) do not depend on any other computation in this program)
17:35:49 <tomsmeding> and you have (<*>), which does function application (which is computation), but the _effects_ of the left and of the right argument are independent
17:36:02 defanor joins (~defanor@tart.uberspace.net)
17:36:04 <tomsmeding> the effects of the right-hand side can not depend on the result of the left-hand side
17:36:09 sabino joins (~sabino@user/sabino)
17:36:23 <tomsmeding> hence: if you see 'a <*> b', you could run the _effects_ of a and b in parallel
17:36:46 <monochrom> For example "monads are like lists" is such an intuition. It works for Maybe. It breaks elsewhere, that's why it stays at the intuition status.
17:36:54 <dolio> Applicatives are sequences. Monads are trees.
17:37:12 <tomsmeding> this is not so with (>>=): the effects of the continuation (the right-hand argument of (>>=)) are allowed to depend on the _value_ of the left-hand argument, so these two cannot be run in parallel
17:38:05 <ph88> tomsmeding, don't understand what you are saying about effects. left-hand side is f (a -> b) a wrapped function, and right-hand side is f a wrapped data (in the simple case where a is a type without arrow)
17:38:33 <tomsmeding> a value of type 'f (a -> b)' can be seen as an effectful computation that results in a function of type 'a -> b'
17:38:55 driib joins (~driib@vmi931078.contaboserver.net)
17:38:59 <tomsmeding> there is not necessarily any value of type 'a -> b' contained in an 'f (a -> b)'!
17:39:18 <tomsmeding> if f ~ IO, it might read stuff from a file and determine what function to return based on the file's contents
17:39:30 roboguy_ joins (~roboguy_@cpe-69-76-235-109.kc.res.rr.com)
17:39:50 <tomsmeding> 'wrapped' is intuition that sometimes works, sometimes doesn't work very well
17:40:20 <tomsmeding> 'effectful' works always, but is awfully general and thus harder to wrap one's head around (especially when one considers e.g. the continuation monad)
17:40:45 <ph88> `determine what function to return` .. whatever function it will still be a `a -> b` right ?
17:40:51 <tomsmeding> sure
17:41:21 <tomsmeding> consider this value of type 'IO Int': do { s <- readFile "/etc/passwd" ; return (length (lines s)) }
17:41:24 <tomsmeding> is that a wrapped Int?
17:41:42 <tomsmeding> I'd say it's an effectful computation that returns an Int
17:42:16 <ph88> specifically <*> was of interest
17:42:32 <tomsmeding> 'Just 42' is also an effectful computation that returns an Int, just with a different kind of effects (only early termination)
17:42:43 <tomsmeding> :t (>>=)
17:42:44 <lambdabot> Monad m => m a -> (a -> m b) -> m b
17:42:45 <tomsmeding> :t (<*>)
17:42:46 <lambdabot> Applicative f => f (a -> b) -> f a -> f b
17:43:34 <tomsmeding> :t \mf mx -> mf >>= \f -> fmap f mx
17:43:35 <lambdabot> Monad m => m (a -> b) -> m a -> m b
17:43:54 <tomsmeding> you can make (<*>) using (>>=), but not the other way round
17:44:15 <tomsmeding> (>>=) is generic effectful sequencing: doing this one effectful thing, then take the result and _based on that_ determine what effects to perform next
17:44:29 <tomsmeding> :t flip (<*>)
17:44:30 <lambdabot> Applicative f => f a -> f (a -> b) -> f b
17:44:37 <tomsmeding> :t (>>=)
17:44:38 <lambdabot> Monad m => m a -> (a -> m b) -> m b
17:45:10 <tomsmeding> with (<*>), the you must run your effects for the continuation _first_, and only then are you going to receive the 'a'
17:46:20 <tomsmeding> now I had to flip (<*>) to make its type similar to the type of (>>=); this is because for Applicatives where that matters, (<*>) runs the effects of the function before the effects of the argument
17:47:07 <roboguy_> ph88: I always liked that one quote from shachaf: "getLine :: IO String contains a String in the same way that /bin/ls contains a list of files"
17:47:23 <tomsmeding> but this ordering difference is just a design choice; the effects in (>>=) could not be switched around because the effects of the continuation _depend_ on the result of the first computation, but the effects in (<*>) could also be executed the other way round if you pleased
17:48:17 <dolio> Right, because Monads allow nesting, instead of just sequencing.
17:48:18 <tomsmeding> that freedom is precisely why 1. fewer computations can be run using the Applicative methods than using the Monad methods (Monad is more powerful), and conversely 2. an Applicative computation has more information statically available
17:48:52 <tomsmeding> roboguy_: nice one
17:49:02 <geekosaur> @quote /bin/ls
17:49:02 <lambdabot> shachaf says: getLine :: IO String contains a String in the same way that /bin/ls contains a list of files
17:49:20 <geekosaur> immortalized
17:49:28 <ph88> tomsmeding, i was thinking in a way that "i want to apply function to mystery box" and "mystery box will figure out whether to `run your effects for the conditunation first` and then "apply function after"
17:49:47 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf) (Remote host closed the connection)
17:49:55 <tomsmeding> ...or?
17:49:58 <monochrom> https://www.vex.net/~trebla/photo/unorganized/IO-String.png >:)
17:50:34 <ph88> tomsmeding, or disregard my function and return in some other shape of `f b`
17:51:26 <tomsmeding> ph88: what do you mean with "whether to run your effects"? Do you mean that it will decide to run the effects or not?
17:51:48 <tomsmeding> also, you're applying a function to the _contents_ of the box
17:51:52 × defanor quits (~defanor@tart.uberspace.net) (Quit: .)
17:52:01 <tomsmeding> which, when reinterpreted back into haskell, is fmap
17:52:18 Pixi` joins (~Pixi@user/pixi)
17:52:21 <tomsmeding> (<*>) allows the function to itself be computed with an effectful computation
17:52:27 <ph88> tomsmeding, if your `f a` type really has an `a` there on the value level and wants to give it to `f (a -> b)`
17:52:37 defanor joins (~defanor@tart.uberspace.net)
17:52:51 <tomsmeding> but it might not, right?
17:52:59 <ph88> yes might or might not
17:53:36 <tomsmeding> when given a computation that returns an 'a', and a computation that returns an 'a -> b', if you're given no way to run those computations here and now, all you can do is return a _computation_ that returns a 'b'
17:53:43 <tomsmeding> f a -> f (a -> b) -> f b
17:54:06 <tomsmeding> that's flip (<*>)
17:54:50 × defanor quits (~defanor@tart.uberspace.net) (Client Quit)
17:55:05 <dolio> :t (<**>)
17:55:06 <lambdabot> Applicative f => f a -> f (a -> b) -> f b
17:55:06 <tomsmeding> in the case of (<*>), the computation returning the 'a -> b' will be run first -- for Applicatives where that makes a difference
17:55:31 <ph88> usually i don't think in the terms of a delayed computation. But in terms of the normal case in which the Applicative keeps applying. Knowing in the back of my head that there is the exception case that it stopped earlier
17:55:33 <remexre> if I want to install a Cabal 3 package to a DESTDIR, what's the right way to do that? The project doesn't have a Setup.hs, there's no cabal v2-copy, and cabal install doesn't seem to take a --destdir
17:55:48 × Feuermagier quits (~Feuermagi@user/feuermagier) (Quit: Leaving)
17:55:48 defanor joins (~defanor@tart.uberspace.net)
17:55:48 × Pixi quits (~Pixi@user/pixi) (Ping timeout: 272 seconds)
17:56:03 × stites quits (~stites@2607:fb91:dc9:51d1:1285:280d:59e4:7da2) (Read error: Connection reset by peer)
17:56:10 <geekosaur> cabal list-bin and copy it yourself, I think
17:56:23 <geekosaur> but beware of required data files
17:56:24 stites joins (~stites@130.44.147.204)
17:56:44 <ph88> tomsmeding, ye this sequencing you explained about Applicative having f (a -> b) run first where monad does it the other way around is also useful :)
17:57:19 <geekosaur> conceivably cabal act-as-setup (which is iirc undocumented, but behaves like Setup.hs) is closer to what you want. since it'd undocumented I don't know if it does what you need though
17:57:28 <tomsmeding> % (putStrLn "left" >> return 21) <**> (putStrLn "right" >> return (*2))
17:57:28 <yahb2> <interactive>:43:32: error: ; • Variable not in scope: (<**>) :: IO b0 -> IO (a0 -> a0) -> t ; • Perhaps you meant ‘<*>’ (imported from Prelude)
17:57:33 <tomsmeding> % (putStrLn "left" >> return 21) Control.Applicative.<**> (putStrLn "right" >> return (*2))
17:57:33 <yahb2> left ; right ; 42
17:57:51 <tomsmeding> ph88: as pointed out by dolio, (<**>) does them in the (>>=) order :p
17:58:53 <remexre> geekosaur: yeah, act-as-setup seems to be equivalent to just using the v1- commands? at least in terms of not finding my dependencies, hah
17:58:58 <remexre> I'll use list-bin, thanks
18:00:50 <ph88> tomsmeding, just the thing is when i go back to traverse (from earlier in the conversation). You don't pass in a `f (a -> b)` but a `a -> f b` so that the computation on the left-hand side must run first is more like an implementation detail at that point for me. With traverse the intuition is not the same when compared about Applicative standalone imo. I don't understand how you can keep those intuitions simultaniously in your head
18:00:50 <ph88> and make sense of them. This is why i was so far not able to make a grasp on what traverse and applicative do combined
18:01:18 <tomsmeding> I see
18:01:34 <tomsmeding> traverse f l = sequenceA (fmap f l)
18:01:47 <tomsmeding> if l :: [a], then fmap f l :: [f b]
18:01:51 <tomsmeding> sorry for the f-punning
18:02:23 <tomsmeding> that doesn't yet run any effects, it just maps over the list (in this case -- could be any Traversable, of course)
18:02:32 <tomsmeding> 'sequenceA :: [f b] -> f [b]' is the thing that runs all the effects, and it does so using (<*>)
18:03:07 <tomsmeding> the "left-hand side runs first" of (<*>) means that the effects in sequenceA are going to be performed left-to-right instead of in some other order
18:04:26 <tomsmeding> of course, "left-to-right" makes perfect sense for lists, but does not necessarily make sense for other Traversable structures, but that's okay
18:06:55 <ph88> tomsmeding, Where does sequenceA use <*> ? i don't see it in the source code
18:07:04 <ph88> https://hackage.haskell.org/package/base-4.14.1.0/docs/src/Data.Traversable.html#sequenceA
18:07:35 <tomsmeding> ph88: in the specific instances: https://hackage.haskell.org/package/base-4.17.0.0/docs/src/Data.Traversable.html#line-297
18:07:50 <tomsmeding> note that it's liftA2 here, but liftA2 itself is defined in terms of (<*>)
18:08:21 <tomsmeding> sequenceA cannot be defined _in general_ using (<*>) in the class definition; if it could, every Applicative would be Traversable, and we wouldn't have the separate Traversable class
18:08:37 <tomsmeding> er, that's not quite accurate
18:08:38 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Remote host closed the connection)
18:08:49 <tomsmeding> if it could then every Foldable would be Traversable, I guess
18:08:56 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
18:09:01 <tomsmeding> not every container is Traversable :p
18:09:05 <ph88> :D
18:09:11 <tomsmeding> so the specific definition in terms of (<*>) must be container-specific
18:09:56 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
18:14:40 <ph88> tomsmeding, `sequenceA cannot be defined _in general_ using (<*>)`. This is odd that traverse AND sequenceA demand an Applicative instance for `f`. Maybe small abstraction leak than demanding a typeclass when it it's not always needed ^^
18:15:16 <tomsmeding> ph88: what I meant is that the definition in terms of (<*>) depends on the container
18:15:27 <ph88> oooh ok
18:15:46 <tomsmeding> traverse = sequenceA . fmap; sequenceA = traverse id
18:15:55 <tomsmeding> define one, get the other
18:17:13 <ph88> feels like there are two intuitions to think about it, and also two functions that map to each other. Maybe i ought to draw up a matrix about it with some graphic arrows in between
18:24:40 <roboguy_> ph88: I recommend looking at several specific Traversable instances. I usually find that to be the best way to learn about a type class
18:24:47 <ph88> is there a function like mapAll :: (a -> Maybe b) -> f a -> Maybe (f b) where it only returns Just when all elements could be mapped ?
18:25:00 <ph88> roboguy_, ye good advice
18:26:05 <tomsmeding> ph88: yes, that's traverse
18:26:21 <tomsmeding> that's the whole reason Traversable was brought up :p
18:26:42 <tomsmeding> Maybe is the Applicative, f is the Traversable in your mapAll
18:27:14 <ph88> tomsmeding, oh sorry i mean another question mapAny :: (a -> Maybe b) -> f a -> Maybe (f b) when it only returns when any of the elements have been mapped (if they could not be mapped then use the old element)
18:27:20 <geekosaur> and this should be obvious from the result type because it doesn't allow for Nothing in the middle, only as the outer type, so a middle Nothing has to make the whole thing produce Nothing
18:27:57 <roboguy_> :t traverse @_ @Maybe
18:27:59 <lambdabot> error:
18:27:59 <lambdabot> Pattern syntax in expression context: traverse@_
18:27:59 <lambdabot> Did you mean to enable TypeApplications?
18:28:04 <geekosaur> use yahb2
18:28:05 <tomsmeding> ph88: it cannot return the old element if mapping failed because b is not a
18:28:13 <tomsmeding> % :set -XTypeApplications
18:28:13 <yahb2> <no output>
18:28:23 <tomsmeding> % :t traverse @_ @Maybe
18:28:23 <yahb2> traverse @_ @Maybe ; :: (Traversable w, Applicative Maybe) => ; (a -> Maybe b) -> w a -> Maybe (w b)
18:28:24 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
18:28:24 <roboguy_> geekosaur: ah, thanks. It's been a long time, ha!
18:28:28 <ph88> tomsmeding, good point what about mapAny :: (a -> Maybe a) -> f a -> Maybe (f a) ?
18:29:40 <tomsmeding> mapAny f l = traverse (\x -> f x <|> Just x) l
18:30:21 <tomsmeding> where 'f x <|> Just x' is also just 'case f x of { Just y -> Just y ; Nothing -> Just x }'
18:30:27 <tomsmeding> I guess one could generalise:
18:30:31 <tomsmeding> :t traverse (\x -
18:30:32 <lambdabot> error: parse error on input ‘-’
18:30:39 <tomsmeding> :t \f l -> traverse (\x -> f x <|> pure x) l
18:30:41 <lambdabot> (Traversable t, Alternative f) => (b -> f b) -> t b -> f (t b)
18:30:55 euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de)
18:32:08 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 255 seconds)
18:32:17 <[Leary]> :t fmap . (fromMaybe <*>)
18:32:17 <lambdabot> Functor f => (a -> Maybe a) -> f a -> f a
18:32:39 <tomsmeding> oh fair no more need to wrap for Maybe
18:33:12 <tomsmeding> @unpl fmap . (fromMaybe <*>)
18:33:13 <lambdabot> (\ x -> fmap (fromMaybe <*> x))
18:33:15 <tomsmeding> thanks
18:33:48 <tomsmeding> \f -> fmap (\x -> fromMaybe x (f x))
18:34:05 <tomsmeding> [Leary]: introducing the function applicative is not helpful here :p
18:34:19 <ph88> how do i run code here other than :f ?
18:34:27 <ph88> :t i mean
18:34:29 <lambdabot> error: Variable not in scope: mean
18:34:31 <tomsmeding> % 1 + 2
18:34:31 <yahb2> 3
18:34:35 <tomsmeding> > 1 + 2
18:34:36 <lambdabot> 3
18:35:02 <ph88> let mapAny f l = traverse (\x -> f x <|> Just x) l in mapAny (\_ -> Nothing) [1,2,3]
18:35:05 <ph88> % let mapAny f l = traverse (\x -> f x <|> Just x) l in mapAny (\_ -> Nothing) [1,2,3]
18:35:05 <yahb2> <interactive>:55:38: error: ; • Variable not in scope: (<|>) :: t -> Maybe a -> f1 b1 ; • Perhaps you meant one of these: ; ‘<*>’ (imported from Prelude), ‘<>’ (imported from Prelud...
18:35:17 <tomsmeding> % import Control.Applicative
18:35:17 <yahb2> <no output>
18:35:24 <ph88> % let mapAny f l = traverse (\x -> f x <|> Just x) l in mapAny (\_ -> Nothing) [1,2,3]
18:35:24 <yahb2> Just [1,2,3]
18:35:42 <tomsmeding> % let mapAny f = fmap (\x -> f x <|> pure x) in mapAny (\_ -> Nothing) [1,2,3]
18:35:42 <yahb2> [Just 1,Just 2,Just 3]
18:35:45 <tomsmeding> oh
18:35:56 <tomsmeding> % let mapAny f = fmap (\x -> fromMaybe x (f x)) in mapAny (\_ -> Nothing) [1,2,3]
18:35:56 <yahb2> <interactive>:63:28: error: ; Variable not in scope: fromMaybe :: t -> t1 -> b1
18:35:56 <ph88> well nothing has been mapped so it should output Nothing right ?
18:36:00 <tomsmeding> % import Data.Maybe
18:36:00 <yahb2> <no output>
18:36:03 <tomsmeding> % let mapAny f = fmap (\x -> fromMaybe x (f x)) in mapAny (\_ -> Nothing) [1,2,3]
18:36:03 <yahb2> [1,2,3]
18:36:06 <tomsmeding> there we go
18:36:21 <tomsmeding> _oh_
18:36:28 <tomsmeding> ph88: that be a weird function you want
18:36:47 <ph88> ok no problem, i can write it. Just wondering if there was something out of the box
18:36:51 <geekosaur> any vs. all doesn't seem that weird
18:37:03 <ph88> like for UI updates you want to show the user if anything has changed sometimes
18:37:26 <roboguy_> tomsmeding: you want traverse, not fmap
18:38:45 <tomsmeding> % let mapAny f l = if any isJust (fmap f l) then Just (fmap (\x -> fromMaybe f (f x)) l) else Nothing in (mapAny (\_ -> Nothing) [1,2,3] , mapAny (\x -> if x==2 then Just 42 else Nothing) [1,2,3])
18:38:45 <yahb2> <interactive>:71:79: error: ; • Couldn't match type ‘a5’ with ‘a4 -> Maybe a5’ ; Expected: Maybe (a4 -> Maybe a5) ; Actual: Maybe a5 ; ‘a5’ is a rigid type variable bound by...
18:38:49 <tomsmeding> crap
18:40:00 <tomsmeding> % let mapAny f l = if any isJust (fmap f l) then Just (fmap (\x -> fromMaybe x (f x)) l) else Nothing in (mapAny (\_ -> Nothing) [1,2,3] , mapAny (\x -> if x==2 then Just 42 else Nothing) [1,2,3])
18:40:00 <yahb2> (Nothing,Just [1,42,3])
18:40:02 <tomsmeding> single-char tpo
18:40:03 <tomsmeding> *typo
18:40:17 <tomsmeding> and yes, this maps twice
18:41:52 hugo joins (znc@verdigris.lysator.liu.se)
18:42:16 <ph88> Maybe better to use fold with a helper variable to track whether something was replaced
18:43:44 <ph88> tomsmeding, thanks for the discussion i will save it in my notes
18:44:13 <[Leary]> ph88: It so happens I wrote something for this kind of change-handling logic a while back. It's somewhat speculative, but could be helpful: https://gist.github.com/LSLeary/eb5e52827249bac5139213ff6ef8d874
18:44:32 <tomsmeding> % let mapAny f l = let mapped = fmap (\x -> (x, f x)) l in if any (isJust . snd) mapped then Just (fmap (uncurry fromMaybe) mapped) else Nothing in (mapAny (\_ -> Nothing) [1,2,3] , mapAny (\x -> if x==2 then Just 42 else Nothing) [1,2,3])
18:44:32 <yahb2> (Nothing,Just [1,42,3])
18:45:36 <ph88> [Leary], where/how did you use it ?
18:46:31 × cpressey quits (~cpressey@host-92-10-151-176.as13285.net) (Quit: Ping timeout (120 seconds))
18:46:39 <[Leary]> It was part of a sketch for streamlining a bunch of xmonad layout update code. That streamlining hasn't happened at this point in time, hence speculative.
18:47:32 <[Leary]> Anyway, `changes` there is basically what you want.
18:47:53 <tomsmeding> % let mapAny f l = let (Any changed, res) = traverse (\x -> case f x of { Just y -> (Any True, y) ; Nothing -> (Any False, x) }) l in if changed then Just res else Nothing in (mapAny (\_ -> Nothing) [1,2,3] , mapAny (\x -> if x==2 then Just 42 else Nothing) [1,2,3])
18:47:53 <yahb2> (Nothing,Just [1,42,3])
18:48:19 <tomsmeding> this is the nicest one, I think
18:48:34 wroathe joins (~wroathe@50.205.197.50)
18:48:34 × wroathe quits (~wroathe@50.205.197.50) (Changing host)
18:48:34 wroathe joins (~wroathe@user/wroathe)
18:49:37 <tomsmeding> the "effect" of this traverse is Writer, and the thing it's writing is a boolean that gets combined using (||), because that's the Monoid instance of Any
18:51:26 <monochrom> I am low-tech once again and I would start with catMaybes.
18:53:42 <tomsmeding> monochrom: they wanted the successful values replaced if any were successful; with catMaybes you forgot where they were
18:55:07 <ph88> i guess you could compare length of input and output array with catMaybes
18:55:19 <ph88> hmm no that doesn't work
18:55:21 <monochrom> No please don't compare lengths.
18:56:28 <ph88> :D
18:57:02 <roboguy_> hmm, what should using mapAny over an empty list give back? Nothing or Just []?
18:58:25 <monochrom> Which one gives more identity laws? :)
18:59:07 cpressey joins (~cpressey@host-92-10-151-176.as13285.net)
18:59:51 <monochrom> An example of a candidate identity law: mapAny f (xs <> ys) = mapAny f xs <> mapAny f ys
19:00:29 <monochrom> But it is just a candidate because I am not sure whether 1. it is desirable, 2. I formulated it right
19:00:39 <roboguy_> I'm thinking this: if it never gives back Just [], then why not just give back an `[a]` instead of a `Maybe [a]`?
19:00:54 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds)
19:00:56 <monochrom> But in general you think in terms of "does it have nice laws?" not "does it feel good philosophically".
19:02:54 <monochrom> (This is why "product [] = 0", "or [] = True" make many people feel good philosophically but are summarily rejected by rational people because they break, for example, product xs * product ys = product (xs ++ ys))
19:03:43 hugo joins (znc@verdigris.lysator.liu.se)
19:04:33 <monochrom> Err I guess I wrote homorphism/distributive laws, but set xs = [] to expose the connection with identity laws.
19:04:50 privacy joins (~privacy@user/privacy)
19:07:37 <roboguy_> monochrom: I was mainly asking that to challenge the original question (at least, if it *is* true that it never gives back Just []). Better to express that in the types and make the result type be [a], if that is the case. After all the type "Maybe [a] but we also know it's never Just []" is really the same as [a]
19:07:41 × falafel quits (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 255 seconds)
19:08:25 <roboguy_> if it *needs* to be Maybe [a], then we could convert it in a separate step
19:08:58 <monochrom> Yeah, most often (Any, [a]) is more desirable for this.
19:09:25 tomsmeding 's last version computes an (Any, [a]) and then converts that into a Maybe :p
19:09:36 <[Leary]> My gist does the same.
19:10:42 CiaoSen joins (~Jura@2a05:5800:298:ba00:664b:f0ff:fe37:9ef)
19:10:46 <monochrom> Many decades ago I wrote an expression-simplifier library. To date I am still debating with myself whether "Expr -> Maybe Expr" or "Expr -> (ChangedOrNot, Expr)" works better.
19:11:11 <monochrom> They are both annoying but in opposite ways.
19:11:33 <monochrom> You know what people say about "half-empty half-full glass of water" right?
19:11:50 <monochrom> I say: half of it is empty, the other half is the wrong drink. :( :>)
19:11:57 <monochrom> err, :( >:)
19:11:59 <darkling> The glass is twice as large as it needs to be. :)
19:12:18 <monochrom> Half of my emoticons are unhappy, and the other half are typos.
19:12:51 × billchenchina quits (~billchenc@103.152.35.21) (Remote host closed the connection)
19:15:23 hyiltiz joins (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com)
19:17:04 <roboguy_> Hah, I also wrote something like that for a term rewriting thing. And I also remember being annoyed
19:21:07 tomsmeding likes :>) more
19:21:39 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
19:24:25 azimut joins (~azimut@gateway/tor-sasl/azimut)
19:24:43 × cpressey quits (~cpressey@host-92-10-151-176.as13285.net) (Ping timeout: 245 seconds)
19:25:09 cpressey joins (~cpressey@host-92-10-151-176.as13285.net)
19:25:23 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
19:27:40 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
19:28:16 × cpressey quits (~cpressey@host-92-10-151-176.as13285.net) (Client Quit)
19:31:47 × myxos quits (~myxos@cpe-65-28-251-121.cinci.res.rr.com) (Remote host closed the connection)
19:32:56 myxos joins (~myxos@cpe-65-28-251-121.cinci.res.rr.com)
19:36:30 billchenchina joins (~billchenc@2a0c:b641:7a2:320:ee3e:47ca:6070:d71a)
19:38:56 cpressey joins (~cpressey@host-2-102-8-121.as13285.net)
19:41:03 × ystael quits (~ystael@user/ystael) (Ping timeout: 258 seconds)
19:44:30 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 258 seconds)
19:44:45 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds)
19:44:51 × cpressey quits (~cpressey@host-2-102-8-121.as13285.net) (Quit: Ping timeout (120 seconds))
19:45:58 azimut joins (~azimut@gateway/tor-sasl/azimut)
19:47:01 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf) (Remote host closed the connection)
19:48:08 cpressey joins (~cpressey@host-2-102-8-121.as13285.net)
19:48:58 × privacy quits (~privacy@user/privacy) (Remote host closed the connection)
19:49:11 Sgeo joins (~Sgeo@user/sgeo)
19:52:01 privacy joins (~privacy@user/privacy)
19:58:27 × Jackneill quits (~Jackneill@20014C4E1E1DF200085D5E2535870783.dsl.pool.telekom.hu) (Ping timeout: 260 seconds)
19:59:15 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
19:59:18 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 272 seconds)
20:00:07 × roboguy_ quits (~roboguy_@cpe-69-76-235-109.kc.res.rr.com) (Quit: Leaving...)
20:00:54 Opus joins (~lossy@user/opus)
20:00:59 waleee joins (~waleee@h-176-10-137-138.NA.cust.bahnhof.se)
20:02:51 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.5)
20:02:52 × vglfr quits (~vglfr@88.155.180.78) (Read error: Connection reset by peer)
20:07:38 × cpressey quits (~cpressey@host-2-102-8-121.as13285.net) (Ping timeout: 245 seconds)
20:09:02 ystael joins (~ystael@user/ystael)
20:14:36 × falafel quits (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 248 seconds)
20:22:37 pavonia joins (~user@user/siracusa)
20:28:38 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
20:30:09 hugo joins (znc@verdigris.lysator.liu.se)
20:33:11 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
20:35:57 × stites quits (~stites@130.44.147.204) (Read error: Connection reset by peer)
20:37:34 stites joins (~stites@130.44.147.204)
20:46:31 × stites quits (~stites@130.44.147.204) (Ping timeout: 255 seconds)
20:46:42 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf) (Remote host closed the connection)
20:47:40 stites joins (~stites@2607:fb90:ad63:e013:9e88:5faf:89ef:30)
20:59:57 roboguy_ joins (~roboguy_@cpe-69-76-235-109.kc.res.rr.com)
20:59:57 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
21:00:15 Pickchea joins (~private@user/pickchea)
21:01:15 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Quit: ChaiTRex)
21:03:49 ChaiTRex joins (~ChaiTRex@user/chaitrex)
21:05:02 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
21:13:23 × fendor quits (~fendor@2a02:8388:1640:be00:aab:1226:f274:5021) (Remote host closed the connection)
21:19:24 × qqq quits (~qqq@92.43.167.61) (Quit: leaving)
21:19:59 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
21:22:57 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
21:27:36 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf) (Ping timeout: 260 seconds)
21:28:02 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Quit: ChaiTRex)
21:29:09 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f026:93e1:c9cc:1bf)
21:29:24 ChaiTRex joins (~ChaiTRex@user/chaitrex)
21:29:31 bilegeek joins (~bilegeek@2600:1008:b029:9629:c264:f679:2b5f:3f7)
21:41:21 duncan joins (~duncan@nat-server.ehlab.uk)
21:51:00 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
22:01:17 × CiaoSen quits (~Jura@2a05:5800:298:ba00:664b:f0ff:fe37:9ef) (Ping timeout: 255 seconds)
22:01:25 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
22:04:02 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 258 seconds)
22:10:19 harveypwca joins (~harveypwc@2601:246:c180:a570:41a8:a837:a4a7:bda1)
22:11:37 John_Ivan joins (~John_Ivan@user/john-ivan/x-1515935)
22:11:55 <John_Ivan> hi, has anyone encountered this error where the import statements aren't being recognized?
22:12:18 <John_Ivan> the error is "error: parse error on input ‘module’" which refers to the import calls right before the "module" keyword.
22:12:22 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
22:12:31 <geekosaur> imports must come after module
22:12:39 <John_Ivan> always
22:12:40 <John_Ivan> ?
22:12:58 × jle` quits (~jle`@cpe-23-240-75-236.socal.res.rr.com) (Quit: WeeChat 3.3)
22:13:02 <geekosaur> well, the main module doesn't need a module declaration. but if one exists it must come first
22:13:17 <John_Ivan> alright, i'll try that. thank you.
22:15:05 × euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
22:18:11 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
22:18:58 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
22:22:26 × acidjnk quits (~acidjnk@p200300d6e7072f72f8dec80e9aca23dc.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
22:24:21 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds)
22:27:09 × stites quits (~stites@2607:fb90:ad63:e013:9e88:5faf:89ef:30) (Read error: Connection reset by peer)
22:27:39 stites joins (~stites@130.44.147.204)
22:41:05 × hyiltiz quits (~hyiltiz@2603-8080-1f00-082f-8cdd-ec73-edb7-293e.res6.spectrum.com) (Remote host closed the connection)
22:45:53 × billchenchina quits (~billchenc@2a0c:b641:7a2:320:ee3e:47ca:6070:d71a) (Remote host closed the connection)
22:46:31 × ddellacosta quits (~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 255 seconds)
22:47:28 × flukiluke quits (~m-7humut@2603:c023:c000:6c7e:8945:ad24:9113:a962) (Remote host closed the connection)
22:48:45 flukiluke joins (~m-7humut@2603:c023:c000:6c7e:8945:ad24:9113:a962)
22:55:41 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 260 seconds)
23:00:50 × califax quits (~califax@user/califx) (Remote host closed the connection)
23:01:05 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 240 seconds)
23:01:17 zer0bitz_ joins (~zer0bitz@user/zer0bitz)
23:01:27 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
23:01:55 califax joins (~califax@user/califx)
23:03:19 × aliosablack quits (~chomwitt@2a02:587:7a24:b000:1ac0:4dff:fedb:a3f1) (Ping timeout: 264 seconds)
23:04:36 × zer0bitz quits (~zer0bitz@user/zer0bitz) (Ping timeout: 258 seconds)
23:16:33 hugo joins (znc@verdigris.lysator.liu.se)
23:17:16 × cuiltb^ quits (~cd@76.145.193.217) (Ping timeout: 260 seconds)
23:19:14 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 255 seconds)
23:19:38 waleee joins (~waleee@h-176-10-137-138.NA.cust.bahnhof.se)
23:28:46 × bilegeek quits (~bilegeek@2600:1008:b029:9629:c264:f679:2b5f:3f7) (Quit: Leaving)
23:29:03 × khumba quits (~khumba@user/khumba) ()
23:29:41 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
23:29:41 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
23:29:41 wroathe joins (~wroathe@user/wroathe)
23:30:34 juri_ joins (~juri@84-19-175-187.pool.ovpn.com)
23:32:31 × falafel quits (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 260 seconds)
23:32:42 L29Ah joins (~L29Ah@wikipedia/L29Ah)
23:36:48 falafel joins (~falafel@62.175.113.194.dyn.user.ono.com)
23:37:11 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 260 seconds)
23:40:03 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
23:40:21 zmt00 joins (~zmt00@user/zmt00)
23:40:47 <ph88> for debugging purposes which function can i use to fully/deep evaluate a list before i pass it on ?
23:41:08 <geekosaur> rnf from the deepseq package?
23:41:45 <monochrom> That is a very unusual debugging method.
23:43:28 <ph88> thanks geekosaur

All times are in UTC on 2023-10-07.