Home liberachat/#haskell: Logs Calendar

Logs on 2022-11-06 (liberachat/#haskell)

00:00:26 nate3 joins (~nate@98.45.169.16)
00:01:29 × pie_ quits (~pie_bnc@user/pie/x-2818909) ()
00:08:16 pie_ joins (~pie_bnc@user/pie/x-2818909)
00:08:52 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 248 seconds)
00:12:15 × zeenk quits (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
00:13:32 zeenk joins (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494)
00:14:08 × Tuplanolla quits (~Tuplanoll@91-159-69-11.elisa-laajakaista.fi) (Ping timeout: 276 seconds)
00:14:12 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds)
00:15:59 × troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 260 seconds)
00:24:32 × polo_ quits (~polo@user/polo) (Ping timeout: 276 seconds)
00:28:23 × fserucas_ quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Ping timeout: 246 seconds)
00:28:46 troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua)
00:31:31 × zeenk quits (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
00:37:40 × Alex_test quits (~al_test@178.34.150.205) (Read error: Connection reset by peer)
00:37:56 Alex_test joins (~al_test@178.34.150.205)
00:38:07 ski . o O ( <https://v2.ocaml.org/manual/recursivemodules.html> )
00:42:23 × euandreh quits (~euandreh@179.214.113.107) (Ping timeout: 246 seconds)
00:44:50 euandreh joins (~euandreh@179.214.113.107)
00:47:38 × sudden quits (~cat@user/sudden) (Quit: leaving)
00:49:00 sudden joins (~cat@user/sudden)
01:01:30 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
01:03:44 pyrex_ joins (~pyrex@user/pyrex)
01:05:56 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 248 seconds)
01:07:27 × pyrex quits (~pyrex@user/pyrex) (Ping timeout: 255 seconds)
01:07:39 nate3 joins (~nate@98.45.169.16)
01:08:41 × Guest585 quits (~mike@user/feetwind) (Ping timeout: 260 seconds)
01:09:01 Guest585 joins (~mike@user/feetwind)
01:09:36 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Remote host closed the connection)
01:15:10 alphabeta joins (~kilolympu@213.144.144.24)
01:15:29 × kilolympus quits (~kilolympu@213.144.144.24) (Ping timeout: 260 seconds)
01:16:55 × Athas quits (~athas@2a01:7c8:aaac:1cf:ed50:f8c9:7754:b531) (Quit: ZNC 1.8.2 - https://znc.in)
01:18:37 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 246 seconds)
01:19:35 Athas joins (~athas@sigkill.dk)
01:20:35 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds)
01:21:16 ddellacosta joins (~ddellacos@143.244.47.77)
01:21:42 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
01:22:17 × Guest585 quits (~mike@user/feetwind) (Ping timeout: 246 seconds)
01:22:37 Guest585 joins (~mike@user/feetwind)
01:29:37 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
01:32:24 × elkcl quits (~elkcl@broadband-37-110-156-162.ip.moscow.rt.ru) (Ping timeout: 260 seconds)
01:33:35 elkcl joins (~elkcl@broadband-37-110-156-162.ip.moscow.rt.ru)
01:39:48 × abhiroop_ quits (~abhiroop@ext-1-450.eduroam.chalmers.se) (Ping timeout: 268 seconds)
01:40:48 × Yumemi quits (~Yumemi@chamoin.net) (Quit: .)
01:43:31 Yumemi joins (~Yumemi@chamoin.net)
01:43:50 nate4 joins (~nate@98.45.169.16)
01:45:49 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
01:46:23 polo_ joins (~polo@user/polo)
01:49:22 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Remote host closed the connection)
02:00:43 × polo_ quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
02:02:23 razetime joins (~quassel@117.193.7.39)
02:08:23 × dhil quits (~dhil@cpc103052-sgyl39-2-0-cust260.18-2.cable.virginm.net) (Quit: Leaving)
02:10:21 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
02:10:32 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds)
02:14:27 polo_ joins (~polo@user/polo)
02:15:00 × justPardoned quits (~justache@user/justache) (Quit: ZNC 1.8.2 - https://znc.in)
02:16:12 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
02:16:34 justache joins (~justache@user/justache)
02:16:45 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 255 seconds)
02:17:27 Lord_of_Life_ is now known as Lord_of_Life
02:22:07 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
02:22:08 × gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
02:28:27 abhiroop_ joins (~abhiroop@217-209-157-8-no2000.tbcn.telia.com)
02:29:58 × caryhartline quits (~caryhartl@2600:1700:2d0:8d30:b4a8:f86e:ce7e:7321) (Quit: caryhartline)
02:32:07 × mmhat quits (~mmh@p200300f1c723163aee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
02:35:14 × polo_ quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
02:36:25 × Kaipei quits (~Kaiepi@108.175.84.104) (Ping timeout: 272 seconds)
02:40:11 Alex_test_ joins (~al_test@178.34.150.205)
02:41:29 polo_ joins (~polo@user/polo)
02:41:49 × Alex_test quits (~al_test@178.34.150.205) (Ping timeout: 260 seconds)
02:43:32 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds)
02:46:12 × beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 248 seconds)
02:46:27 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 255 seconds)
02:47:49 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
02:48:49 × euandreh quits (~euandreh@179.214.113.107) (Ping timeout: 260 seconds)
02:49:51 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
02:50:20 euandreh joins (~euandreh@179.214.113.107)
02:50:28 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
02:50:33 × euandreh quits (~euandreh@179.214.113.107) (Client Quit)
02:51:58 × polo_ quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
02:53:29 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
02:54:33 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Ping timeout: 255 seconds)
02:54:57 sudden joins (~cat@user/sudden)
02:55:44 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
02:58:56 polo joins (~polo@user/polo)
02:59:47 Guest14 joins (~Guest14@c-73-170-80-105.hsd1.ca.comcast.net)
03:02:22 × Guest14 quits (~Guest14@c-73-170-80-105.hsd1.ca.comcast.net) (Client Quit)
03:13:25 × causal quits (~user@50.35.83.177) (Quit: WeeChat 3.7.1)
03:14:03 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
03:16:04 × abhiroop_ quits (~abhiroop@217-209-157-8-no2000.tbcn.telia.com) (Ping timeout: 248 seconds)
03:18:34 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
03:20:52 × td_ quits (~td@83.135.9.38) (Ping timeout: 248 seconds)
03:22:57 td_ joins (~td@83.135.9.27)
03:28:29 × polo quits (~polo@user/polo) (Ping timeout: 276 seconds)
03:29:03 abhiroop_ joins (~abhiroop@217-209-157-8-no2000.tbcn.telia.com)
03:32:29 × razetime quits (~quassel@117.193.7.39) (Ping timeout: 246 seconds)
03:34:09 polo joins (~polo@user/polo)
03:42:46 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
03:43:11 loras joins (~loras@c-73-139-125-125.hsd1.fl.comcast.net)
03:44:06 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
03:44:27 × rodental quits (~rodental@38.146.5.222) (Remote host closed the connection)
03:44:31 <jackdk> Given `data Foo f = Foo (f Int) deriving Generic`, why does `deriving instance Semigroup (Foo f) via Generically (Foo f)` error out with `Expected kind ‘* -> (* -> *) -> * -> Constraint’, but ‘Semigroup (Foo f)’ has kind ‘Constraint’`?
03:45:20 × terrorjack quits (~terrorjac@2a01:4f8:1c1e:509a::1) (Quit: The Lounge - https://thelounge.chat)
03:46:20 terrorjack joins (~terrorjac@2a01:4f8:1c1e:509a::1)
03:46:23 mestre joins (~mestre@191.177.185.178)
03:47:01 talismanick joins (~talismani@76.133.152.122)
03:47:09 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
03:48:07 × cheater quits (~Username@user/cheater) (Read error: Connection reset by peer)
03:48:51 cheater joins (~Username@user/cheater)
03:48:54 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
03:50:18 <jackdk> Ah, helps to read the manual. It should be `deriving via (Generically (Foo f)) instance (forall a. Semigroup (f a)) => Semigroup (Foo f)
03:50:37 × wz1000 quits (~zubin@static.11.113.47.78.clients.your-server.de) (*.net *.split)
03:50:37 × spider_ quits (~spider@vps-951ce37a.vps.ovh.ca) (*.net *.split)
03:50:37 × yaroot quits (~yaroot@2400:4052:ac0:d900:1cf4:2aff:fe51:c04c) (*.net *.split)
03:50:53 wz1000 joins (~zubin@static.11.113.47.78.clients.your-server.de)
03:50:57 yaroot joins (~yaroot@2400:4052:ac0:d900:1cf4:2aff:fe51:c04c)
03:51:02 spider_ joins (~spider@vps-951ce37a.vps.ovh.ca)
03:52:36 × abhiroop_ quits (~abhiroop@217-209-157-8-no2000.tbcn.telia.com) (Ping timeout: 255 seconds)
03:55:45 × ddellacosta quits (~ddellacos@143.244.47.77) (Ping timeout: 255 seconds)
03:56:17 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
03:57:10 Kaiepi joins (~Kaiepi@108.175.84.104)
03:57:45 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
03:58:55 × infinity0 quits (~infinity0@pwned.gg) (*.net *.split)
03:58:55 × Moyst quits (~moyst@user/moyst) (*.net *.split)
03:58:55 × p3n quits (~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1) (*.net *.split)
03:58:55 × PHO` quits (~pho@akari.cielonegro.org) (*.net *.split)
03:58:55 × Ranhir quits (~Ranhir@157.97.53.139) (*.net *.split)
03:58:55 × hnOsmium0001 quits (uid453710@user/hnOsmium0001) (*.net *.split)
03:58:55 × koz quits (~koz@121.99.240.58) (*.net *.split)
03:58:55 × Square quits (~a@user/square) (*.net *.split)
03:58:55 × tstat quits (~tstat@user/tstat) (*.net *.split)
03:58:55 × robbert-vdh quits (~robbert@robbertvanderhelm.nl) (*.net *.split)
03:58:55 × Rembane quits (~Rembane@li346-36.members.linode.com) (*.net *.split)
03:58:55 × fryguybob quits (~fryguybob@cpe-74-67-169-145.rochester.res.rr.com) (*.net *.split)
03:58:55 × Techcable quits (~Techcable@user/Techcable) (*.net *.split)
03:58:55 × mmaruseacph2 quits (~mihai@198.199.98.239) (*.net *.split)
03:58:55 × heath quits (~heath@user/heath) (*.net *.split)
03:58:55 × chymera quits (~chymera@ns1000526.ip-51-81-46.us) (*.net *.split)
03:58:55 × carbolymer quits (~carbolyme@dropacid.net) (*.net *.split)
03:58:55 × telser quits (~quassel@user/telser) (*.net *.split)
03:58:55 × Unode quits (~Unode@194.94.44.220) (*.net *.split)
03:58:55 × haritz quits (~hrtz@user/haritz) (*.net *.split)
03:58:55 × meooow quits (~meooow@165.232.184.169) (*.net *.split)
03:58:55 × red-snail quits (~snail@static.151.210.203.116.clients.your-server.de) (*.net *.split)
03:58:55 × Philonous quits (~Philonous@user/philonous) (*.net *.split)
03:58:57 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
03:59:02 Rembane joins (~Rembane@li346-36.members.linode.com)
03:59:06 haritz joins (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220)
03:59:06 carbolymer joins (~carbolyme@dropacid.net)
03:59:07 Unode joins (~Unode@194.94.44.220)
03:59:12 Techcable joins (~Techcable@user/Techcable)
03:59:15 × haritz quits (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220) (Changing host)
03:59:15 haritz joins (~hrtz@user/haritz)
03:59:22 Ranhir joins (~Ranhir@157.97.53.139)
03:59:26 hnOsmium0001 joins (uid453710@user/hnOsmium0001)
03:59:27 meooow joins (~meooow@2400:6180:100:d0::ad9:e001)
03:59:30 fryguybob joins (~fryguybob@cpe-74-67-169-145.rochester.res.rr.com)
03:59:30 mmaruseacph2 joins (~mihai@198.199.98.239)
03:59:33 telser joins (~quassel@user/telser)
03:59:41 koz joins (~koz@121.99.240.58)
03:59:43 tstat joins (~tstat@user/tstat)
04:00:02 Square joins (~a@user/square)
04:00:05 robbert-vdh joins (~robbert@robbertvanderhelm.nl)
04:00:09 p3n joins (~p3n@217.198.124.246)
04:00:11 Philonous joins (~Philonous@user/philonous)
04:00:13 red-snail joins (~snail@static.151.210.203.116.clients.your-server.de)
04:00:16 chymera joins (~chymera@ns1000526.ip-51-81-46.us)
04:00:19 PHO` joins (~pho@akari.cielonegro.org)
04:00:37 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
04:00:43 heath joins (~heath@user/heath)
04:03:06 infinity0 joins (~infinity0@pwned.gg)
04:03:32 × afotgkmnzj7asv3r quits (~afotgkmnz@2001:470:69fc:105::c24b) (*.net *.split)
04:03:32 × Clinton[m] quits (~clintonme@2001:470:69fc:105::2:31d4) (*.net *.split)
04:03:32 × schuelermine[m] quits (~schuelerm@user/schuelermine) (*.net *.split)
04:03:32 × Artem[m] quits (~artemtype@2001:470:69fc:105::75b) (*.net *.split)
04:03:32 × vaibhavsagar[m] quits (~vaibhavsa@2001:470:69fc:105::ffe) (*.net *.split)
04:03:32 × sm quits (~sm@plaintextaccounting/sm) (*.net *.split)
04:03:32 × aviladev[m] quits (~aviladevm@2001:470:69fc:105::1:cbc7) (*.net *.split)
04:03:32 × wrengr quits (~wrengr@201.59.83.34.bc.googleusercontent.com) (*.net *.split)
04:03:32 × remexre quits (~remexre@user/remexre) (*.net *.split)
04:03:32 × agander_m quits (sid407952@2a03:5180:f::6:3990) (*.net *.split)
04:03:32 × edwardk quits (sid47016@haskell/developer/edwardk) (*.net *.split)
04:03:32 × PotatoGim_ quits (sid99505@id-99505.lymington.irccloud.com) (*.net *.split)
04:03:32 × ysh____ quits (sid6017@id-6017.ilkley.irccloud.com) (*.net *.split)
04:03:32 × sooch_ quits (sid533113@id-533113.hampstead.irccloud.com) (*.net *.split)
04:03:32 × adium quits (adium@user/adium) (*.net *.split)
04:03:32 × TMA quits (tma@twin.jikos.cz) (*.net *.split)
04:03:32 × df quits (~ben@justworks.xyz) (*.net *.split)
04:03:32 × tinwood quits (~tinwood@canonical/tinwood) (*.net *.split)
04:03:32 × turlando quits (~turlando@user/turlando) (*.net *.split)
04:03:32 × Hafydd quits (~Hafydd@user/hafydd) (*.net *.split)
04:03:32 × ByronJohnson quits (~bairyn@50-250-232-19-static.hfc.comcastbusiness.net) (*.net *.split)
04:03:32 × Typedfern quits (~Typedfern@221.red-83-37-36.dynamicip.rima-tde.net) (*.net *.split)
04:03:32 × CAT_S quits (apic@brezn3.muc.ccc.de) (*.net *.split)
04:03:32 × danso quits (~danso@danso.ca) (*.net *.split)
04:03:32 × anthezium quits (~ted@75.164.54.59) (*.net *.split)
04:03:32 × bsima1 quits (9d7e39c8ad@2604:bf00:561:2000::dd) (*.net *.split)
04:03:32 × jleightcap quits (7bc4014b62@user/jleightcap) (*.net *.split)
04:03:32 × evanrelf quits (3addc196af@2604:bf00:561:2000::f0) (*.net *.split)
04:03:32 × matthews quits (~matthews@gentoo/developer/matthew) (*.net *.split)
04:03:38 bsima1_ joins (9d7e39c8ad@2604:bf00:561:2000::dd)
04:03:39 ysh____ joins (sid6017@id-6017.ilkley.irccloud.com)
04:03:39 sooch_ joins (sid533113@id-533113.hampstead.irccloud.com)
04:03:39 bsima1_ is now known as bsima1
04:03:40 evanrelf joins (3addc196af@2604:bf00:561:2000::f0)
04:03:40 ByronJohnson joins (~bairyn@50-250-232-19-static.hfc.comcastbusiness.net)
04:03:43 jleightcap joins (7bc4014b62@user/jleightcap)
04:03:43 CAT_S joins (apic@brezn3.muc.ccc.de)
04:03:44 anthezium joins (~ted@75.164.54.59)
04:03:44 df joins (~ben@justworks.xyz)
04:03:44 tinwood joins (~tinwood@general.default.akavanagh.uk0.bigv.io)
04:03:48 TMA joins (tma@twin.jikos.cz)
04:03:52 agander_m joins (sid407952@id-407952.tinside.irccloud.com)
04:03:52 edwardk joins (sid47016@haskell/developer/edwardk)
04:03:54 Typedfern joins (~Typedfern@221.red-83-37-36.dynamicip.rima-tde.net)
04:03:54 matthews joins (~matthews@gentoo/developer/matthew)
04:03:57 × tinwood quits (~tinwood@general.default.akavanagh.uk0.bigv.io) (Changing host)
04:03:57 tinwood joins (~tinwood@canonical/tinwood)
04:03:59 remexre joins (~remexre@user/remexre)
04:04:04 Hafydd joins (~Hafydd@2001:41d0:305:2100::31aa)
04:04:08 turlando joins (~turlando@user/turlando)
04:04:09 × Hafydd quits (~Hafydd@2001:41d0:305:2100::31aa) (Signing in (Hafydd))
04:04:09 Hafydd joins (~Hafydd@user/hafydd)
04:04:11 danso joins (danso@2600:3c03::f03c:91ff:fe05:6954)
04:04:12 wrengr joins (~wrengr@201.59.83.34.bc.googleusercontent.com)
04:04:14 PotatoGim_ joins (sid99505@id-99505.lymington.irccloud.com)
04:04:16 Moyst joins (~moyst@user/moyst)
04:04:22 × ell quits (~ellie@user/ellie) (Quit: ill be backkk)
04:04:45 adium joins (adium@user/adium)
04:04:49 Artem[m] joins (~artemtype@2001:470:69fc:105::75b)
04:04:49 schuelermine[m] joins (~schuelerm@user/schuelermine)
04:05:18 Clinton[m] joins (~clintonme@2001:470:69fc:105::2:31d4)
04:05:18 afotgkmnzj7asv3r joins (~afotgkmnz@2001:470:69fc:105::c24b)
04:07:04 aviladev[m] joins (~aviladevm@2001:470:69fc:105::1:cbc7)
04:07:21 sm joins (~sm@plaintextaccounting/sm)
04:07:43 vaibhavsagar[m] joins (~vaibhavsa@2001:470:69fc:105::ffe)
04:13:27 × xff0x quits (~xff0x@2405:6580:b080:900:dde7:2b6c:97ae:a5eb) (Ping timeout: 246 seconds)
04:14:37 nate4 joins (~nate@98.45.169.16)
04:15:06 xff0x joins (~xff0x@2405:6580:b080:900:fd8d:71ab:7640:b47a)
04:16:26 × Goodbye_Vincent quits (cyvahl@freakshells.net) (*.net *.split)
04:16:26 × steve[m]12 quits (~stevetrou@2001:470:69fc:105::e0b) (*.net *.split)
04:16:26 × akhesacaro quits (~caro@212-83-144-58.rev.poneytelecom.eu) (*.net *.split)
04:16:26 × Neosake[m] quits (~neosakema@2001:470:69fc:105::2:989e) (*.net *.split)
04:16:26 × olivermead[m] quits (~olivermea@2001:470:69fc:105::2:4289) (*.net *.split)
04:16:26 × romes[m] quits (~romesmatr@2001:470:69fc:105::2:1660) (*.net *.split)
04:16:26 × ManofLetters[m] quits (~manoflett@2001:470:69fc:105::3be) (*.net *.split)
04:16:26 × Christoph[m] quits (~hpotsirhc@2001:470:69fc:105::2ff8) (*.net *.split)
04:16:26 × nicm[m] quits (~nicmollel@2001:470:69fc:105::1:feeb) (*.net *.split)
04:16:26 × ormaaj quits (~ormaaj@user/ormaaj) (*.net *.split)
04:16:26 × famubu[m] quits (~famubumat@2001:470:69fc:105::1081) (*.net *.split)
04:16:26 × ongy[m] quits (~ongymatri@2001:470:69fc:105::5018) (*.net *.split)
04:16:26 × beaky quits (~beaky@2a03:b0c0:0:1010::1e:a001) (*.net *.split)
04:16:26 × h2t quits (~h2t@user/h2t) (*.net *.split)
04:16:26 × sa1 quits (sid7690@id-7690.ilkley.irccloud.com) (*.net *.split)
04:16:26 × carter quits (sid14827@id-14827.helmsley.irccloud.com) (*.net *.split)
04:16:26 × NemesisD quits (sid24071@id-24071.lymington.irccloud.com) (*.net *.split)
04:16:26 × joel135 quits (sid136450@id-136450.hampstead.irccloud.com) (*.net *.split)
04:16:26 × gmc quits (sid58314@id-58314.ilkley.irccloud.com) (*.net *.split)
04:16:26 × caasih quits (sid13241@id-13241.ilkley.irccloud.com) (*.net *.split)
04:16:26 × dsal quits (sid13060@id-13060.lymington.irccloud.com) (*.net *.split)
04:16:26 × whez quits (sid470288@id-470288.lymington.irccloud.com) (*.net *.split)
04:16:26 × dpratt quits (sid193493@id-193493.helmsley.irccloud.com) (*.net *.split)
04:16:26 × Xe quits (~cadey@tailscale/xe) (*.net *.split)
04:16:26 × hendi quits (sid489601@id-489601.lymington.irccloud.com) (*.net *.split)
04:16:26 × sphynx quits (~xnyhps@2a02:2770:3:0:216:3eff:fe67:3288) (*.net *.split)
04:16:26 × Jon quits (jon@dow.land) (*.net *.split)
04:16:26 × [Ristovski] quits (~Ristovski@hellomouse/perf/ristovski) (*.net *.split)
04:16:35 akhesacaro joins (~caro@212-83-144-58.rev.poneytelecom.eu)
04:16:36 Jon joins (jon@dow.land)
04:16:39 sphynx joins (~xnyhps@2a02:2770:3:0:216:3eff:fe67:3288)
04:16:44 dpratt joins (sid193493@id-193493.helmsley.irccloud.com)
04:16:44 NemesisD joins (sid24071@id-24071.lymington.irccloud.com)
04:16:44 sa1 joins (sid7690@id-7690.ilkley.irccloud.com)
04:16:48 caasih joins (sid13241@id-13241.ilkley.irccloud.com)
04:16:50 gmc joins (sid58314@id-58314.ilkley.irccloud.com)
04:16:52 whez joins (sid470288@id-470288.lymington.irccloud.com)
04:16:56 dsal joins (sid13060@id-13060.lymington.irccloud.com)
04:16:58 Xe joins (~cadey@lufta.cetacean.club)
04:16:59 Goodbye_Vincent joins (cyvahl@freakshells.net)
04:17:03 steve[m]12 joins (~stevetrou@2001:470:69fc:105::e0b)
04:17:06 × Xe quits (~cadey@lufta.cetacean.club) (Signing in (Xe))
04:17:06 Xe joins (~cadey@tailscale/xe)
04:17:09 carter joins (sid14827@id-14827.helmsley.irccloud.com)
04:17:16 h2t joins (~h2t@user/h2t)
04:17:26 hendi joins (sid489601@id-489601.lymington.irccloud.com)
04:17:30 beaky joins (~beaky@2a03:b0c0:0:1010::1e:a001)
04:17:32 joel135 joins (sid136450@id-136450.hampstead.irccloud.com)
04:18:04 ManofLetters[m] joins (~manoflett@2001:470:69fc:105::3be)
04:18:06 [Ristovski] joins (~Ristovski@hellomouse/perf/ristovski)
04:18:09 olivermead[m] joins (~olivermea@2001:470:69fc:105::2:4289)
04:18:11 romes[m] joins (~romesmatr@2001:470:69fc:105::2:1660)
04:19:40 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
04:21:34 Neosake[m] joins (~neosakema@2001:470:69fc:105::2:989e)
04:21:36 famubu[m] joins (~famubumat@2001:470:69fc:105::1081)
04:21:40 ongy[m] joins (~ongymatri@2001:470:69fc:105::5018)
04:21:54 ormaaj joins (~ormaaj@user/ormaaj)
04:22:15 <jackdk> Another question about quantified constraints: https://www.irccloud.com/pastebin/8j1d1vT0/quantified-monoid-constraint.txt
04:22:55 Christoph[m] joins (~hpotsirhc@2001:470:69fc:105::2ff8)
04:22:57 nicm[m] joins (~nicmollel@2001:470:69fc:105::1:feeb)
04:25:02 × polo quits (~polo@user/polo) (Ping timeout: 276 seconds)
04:26:02 × justache quits (~justache@user/justache) (Quit: ZNC 1.8.2 - https://znc.in)
04:29:03 × justsomeguy quits (~justsomeg@user/justsomeguy) (Ping timeout: 255 seconds)
04:30:02 justache joins (~justache@user/justache)
04:32:32 × ircbrowse_tom quits (~ircbrowse@2a01:4f8:1c1c:9319::1) (ZNC 1.8.2+deb2build5 - https://znc.in)
04:33:37 ircbrowse_tom joins (~ircbrowse@2a01:4f8:1c1c:9319::1)
04:33:37 Server sets mode +Cnt
04:33:46 × liskin quits (~liskin@ackle.nomi.cz) (Changing host)
04:33:46 liskin joins (~liskin@xmonad/liskin)
04:33:51 × onosendi quits (sid552923@id-552923.lymington.irccloud.com) (Changing host)
04:33:51 onosendi joins (sid552923@user/onosendi)
04:34:17 ouroboros joins (~ouroboros@user/ouroboros)
04:34:20 remedan joins (~remedan@octo.cafe)
04:34:21 kitzman joins (~kitzman@user/dekenevs)
04:34:25 simp|e joins (skralg@user/simple)
04:34:32 pierrot joins (~pi@user/pierrot)
04:34:41 poscat joins (~poscat@114.245.106.84)
04:34:44 tv joins (~tv@user/tv)
04:34:51 oats joins (~thomas@user/oats)
04:35:54 razetime joins (~quassel@117.193.7.39)
04:36:14 anderson joins (~ande@user/anderson)
04:36:41 gdd joins (~gdd@129.199.146.230)
04:37:47 aku joins (~aku@163.172.137.34)
04:37:50 tristanC joins (~tristanC@user/tristanc)
04:39:56 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
04:40:53 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
04:41:15 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
04:45:08 × troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 248 seconds)
04:45:50 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
04:47:16 × cheater quits (~Username@user/cheater) (Ping timeout: 248 seconds)
04:47:56 cheater joins (~Username@user/cheater)
04:48:49 nate4 joins (~nate@98.45.169.16)
04:50:09 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 260 seconds)
04:50:39 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
04:50:47 <jackdk> Per https://stackoverflow.com/questions/59743170/derive-ord-with-quantified-constraints-forall-a-ord-a-ord-f-a, it needs `(forall a . Semigroup a => Semigroup (f a))` as a constraint on the `Monoid (Bar f)` instance.
04:51:34 × razetime quits (~quassel@117.193.7.39) (Ping timeout: 252 seconds)
04:54:00 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
04:55:55 king_gs joins (~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
04:57:50 × cheater quits (~Username@user/cheater) (Ping timeout: 246 seconds)
04:58:25 cheater joins (~Username@user/cheater)
04:59:29 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
05:00:54 sudden joins (~cat@user/sudden)
05:08:14 razetime joins (~quassel@117.193.7.39)
05:09:17 × Kaiepi quits (~Kaiepi@108.175.84.104) (Ping timeout: 252 seconds)
05:10:17 nate4 joins (~nate@98.45.169.16)
05:11:26 × king_gs quits (~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Read error: Connection reset by peer)
05:11:35 × Sauvin quits (~sauvin@user/Sauvin) (Ping timeout: 272 seconds)
05:11:39 Bocaneri joins (~sauvin@user/Sauvin)
05:12:03 Bocaneri is now known as Guest8611
05:12:13 × Xeroine quits (~Xeroine@user/xeroine) (Ping timeout: 272 seconds)
05:13:58 rumgzy joins (~sauvin@user/Sauvin)
05:15:02 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
05:15:32 Xeroine joins (~Xeroine@user/xeroine)
05:15:32 polo_ joins (~polo@user/polo)
05:15:48 × justache quits (~justache@user/justache) (Quit: ZNC 1.8.2 - https://znc.in)
05:16:45 × Guest8611 quits (~sauvin@user/Sauvin) (Ping timeout: 260 seconds)
05:17:30 justache joins (~justache@user/justache)
05:19:40 × polo_ quits (~polo@user/polo) (Client Quit)
05:21:48 polo_ joins (~polo@user/polo)
05:24:40 nate4 joins (~nate@98.45.169.16)
05:25:08 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
05:27:32 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
05:27:38 × polo_ quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
05:32:50 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 246 seconds)
05:37:33 syntactic_sugar joins (~amoljha@2601:644:9080:77c0::f473)
05:40:49 polo_ joins (~polo@user/polo)
05:40:52 × polo_ quits (~polo@user/polo) (Remote host closed the connection)
05:41:20 polo_ joins (~polo@user/polo)
05:44:41 × danso quits (danso@2600:3c03::f03c:91ff:fe05:6954) (Quit: ZNC - https://znc.in)
05:46:03 danso joins (danso@2600:3c03::f03c:91ff:fe05:6954)
05:50:49 × talismanick quits (~talismani@76.133.152.122) (Ping timeout: 260 seconds)
05:52:52 × bilegeek quits (~bilegeek@2600:1008:b022:ec7c:be7c:26b9:42ac:7e7c) (Quit: Leaving)
05:55:24 × syntactic_sugar quits (~amoljha@2601:644:9080:77c0::f473) (Quit: WeeChat 3.6)
05:55:29 × wz1000 quits (~zubin@static.11.113.47.78.clients.your-server.de) (Ping timeout: 260 seconds)
05:55:45 wz1000 joins (~zubin@static.11.113.47.78.clients.your-server.de)
05:56:53 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
06:02:29 × tstat quits (~tstat@user/tstat) (Ping timeout: 260 seconds)
06:02:29 × Unode quits (~Unode@194.94.44.220) (Ping timeout: 260 seconds)
06:02:48 Unode joins (~Unode@194.94.44.220)
06:03:04 × mmaruseacph2 quits (~mihai@198.199.98.239) (Ping timeout: 260 seconds)
06:03:04 × Techcable quits (~Techcable@user/Techcable) (Ping timeout: 260 seconds)
06:03:04 × carbolymer quits (~carbolyme@dropacid.net) (Ping timeout: 260 seconds)
06:03:19 mmaruseacph2 joins (~mihai@198.199.98.239)
06:03:35 Philonous_ joins (~Philonous@user/philonous)
06:03:39 × koz quits (~koz@121.99.240.58) (Ping timeout: 260 seconds)
06:03:44 carbolymer joins (~carbolyme@dropacid.net)
06:03:54 × Philonous quits (~Philonous@user/philonous) (Read error: Connection reset by peer)
06:04:00 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
06:04:37 koz joins (~koz@121.99.240.58)
06:04:58 Techcable joins (~Techcable@user/Techcable)
06:06:34 × matthews quits (~matthews@gentoo/developer/matthew) (Ping timeout: 260 seconds)
06:06:50 matthews joins (~matthews@gentoo/developer/matthew)
06:07:20 tstat joins (~tstat@user/tstat)
06:07:41 × turlando quits (~turlando@user/turlando) (Read error: Connection reset by peer)
06:07:44 × CAT_S quits (apic@brezn3.muc.ccc.de) (Ping timeout: 260 seconds)
06:08:26 turlando joins (~turlando@user/turlando)
06:11:49 × razetime quits (~quassel@117.193.7.39) (Ping timeout: 260 seconds)
06:12:40 razetime joins (~quassel@117.193.4.35)
06:16:36 nate4 joins (~nate@98.45.169.16)
06:20:10 CAT_S joins (apic@brezn3.muc.ccc.de)
06:23:07 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 248 seconds)
06:28:15 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:33:11 × zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection)
06:33:27 iteratee_ joins (~kyle@162.218.222.107)
06:34:00 × polo_ quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
06:35:15 nate4 joins (~nate@98.45.169.16)
06:36:19 × aku quits (~aku@163.172.137.34) (Ping timeout: 260 seconds)
06:36:19 × remedan quits (~remedan@octo.cafe) (Ping timeout: 260 seconds)
06:36:19 × iteratee quits (~kyle@162.218.222.107) (Ping timeout: 260 seconds)
06:36:54 × abrar quits (~abrar@static-108-2-152-54.phlapa.fios.verizon.net) (Ping timeout: 260 seconds)
06:36:54 × micro quits (~micro@user/micro) (Ping timeout: 260 seconds)
06:37:00 remedan joins (~remedan@octo.cafe)
06:37:19 abrar joins (~abrar@static-108-2-152-54.phlapa.fios.verizon.net)
06:37:28 poscat0x04 joins (~poscat@2408:8206:4823:fd6f:98ab:5c38:136c:5932)
06:37:29 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 260 seconds)
06:37:30 hyiltiz_ joins (~quassel@31.220.5.250)
06:38:04 × oats quits (~thomas@user/oats) (Ping timeout: 260 seconds)
06:38:04 × tv quits (~tv@user/tv) (Ping timeout: 260 seconds)
06:38:10 aku joins (~aku@163.172.137.34)
06:38:23 micro joins (~micro@user/micro)
06:38:39 × poscat quits (~poscat@114.245.106.84) (Ping timeout: 260 seconds)
06:39:36 polo joins (~polo@user/polo)
06:40:01 anderson_ joins (~ande@user/anderson)
06:40:24 × anderson quits (~ande@user/anderson) (Ping timeout: 260 seconds)
06:40:30 oats joins (~thomas@user/oats)
06:41:28 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
06:41:33 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
06:41:48 × polo quits (~polo@user/polo) (Client Quit)
06:42:22 anderson_ is now known as anderson
06:44:50 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
06:46:50 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
06:51:19 tv joins (~tv@user/tv)
06:52:04 × dsrt^ quits (~dsrt@76.145.185.103) (Remote host closed the connection)
06:55:30 × razetime quits (~quassel@117.193.4.35) (Ping timeout: 252 seconds)
07:03:40 coot joins (~coot@213.134.171.3)
07:05:29 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
07:06:52 sudden joins (~cat@user/sudden)
07:09:43 polo joins (~polo@user/polo)
07:11:49 × polo quits (~polo@user/polo) (Client Quit)
07:16:20 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
07:17:32 polo joins (~polo@user/polo)
07:17:52 zaquest joins (~notzaques@5.130.79.72)
07:19:42 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 252 seconds)
07:20:04 × Xeroine quits (~Xeroine@user/xeroine) (Ping timeout: 252 seconds)
07:20:41 razetime joins (~quassel@117.193.4.35)
07:20:44 Xeroine joins (~Xeroine@user/xeroine)
07:26:16 × polo quits (~polo@user/polo) (Quit: Textual IRC Client: www.textualapp.com)
07:28:16 dtbouo^ joins (~dtbouo@76.145.185.103)
07:28:19 polo joins (~polo@user/polo)
07:32:45 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Remote host closed the connection)
07:34:59 nate4 joins (~nate@98.45.169.16)
07:35:56 × polo quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
07:39:23 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 248 seconds)
07:40:29 talismanick joins (~talismani@76.133.152.122)
07:45:58 gmg joins (~user@user/gehmehgeh)
08:00:19 × wz1000 quits (~zubin@static.11.113.47.78.clients.your-server.de) (Ping timeout: 260 seconds)
08:00:36 wz1000 joins (~zubin@static.11.113.47.78.clients.your-server.de)
08:03:58 derpadmin joins (~Anonymous@homebase.200013.net)
08:04:09 Guest75 joins (~Guest75@178.141.177.81)
08:06:41 Philonous joins (~Philonous@user/philonous)
08:07:09 <derpadmin> hello, I am very new to haskell... I started with the intro, and so far so good (so I thought) https://termbin.com/ylja
08:07:32 <derpadmin> this was before I paid a bit more attention to what the "do" keywork actually do
08:07:49 <derpadmin> now I feel like I don't understand anything at all
08:07:54 × koz quits (~koz@121.99.240.58) (Ping timeout: 260 seconds)
08:07:54 × Philonous_ quits (~Philonous@user/philonous) (Ping timeout: 260 seconds)
08:08:05 <derpadmin> could someone help desugar this for me https://termbin.com/sjjl
08:08:20 <derpadmin> I feel it would help tremendously with my comprehension
08:08:58 <Guest75> Hi derpadmin: do you know function composition? f . g ?
08:09:30 <derpadmin> I saw it pass by Guest75, but did not grasp it yet no
08:10:00 <Guest75> roughly speaking, >>= is a kind of
08:10:11 koz joins (~koz@121.99.240.58)
08:10:19 <Guest75> function composition (or rather, >=> is)
08:10:47 <Guest75> so you should at least learn about just regular one
08:11:24 × turlando quits (~turlando@user/turlando) (Ping timeout: 260 seconds)
08:11:38 <derpadmin> ok, I will look into it... thanks for the hint
08:12:06 turlando joins (~turlando@user/turlando)
08:12:49 <derpadmin> aahh, yes, this seems spot on
08:14:41 <[Leary]> @undo do { let {var = 1}; let {result = funct var}; print result }
08:14:42 <lambdabot> let { var = 1} in let { result = funct var} in print result
08:15:00 <derpadmin> thanks lambdabot
08:18:26 <[Leary]> derpadmin: Consider reading the relevant section of the Haskell2010 report: https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14
08:18:45 <[Leary]> It lays out do-notation desugaring pretty clearly.
08:20:59 <derpadmin> yes, I can find it in there too
08:22:31 <derpadmin> I gathered there was many levels/scope/depth? after trying a=1 and a=2 in ghci, but it was unclear to me how it the vars were applied
08:26:46 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
08:29:18 <[Leary]> GHCi is contorted for convenience over principle, so it's not the best place for this kind of exploration. To test the behaviour of real Haskell, you should write it in a file (perhaps letting something like ghcid reload it on change).
08:29:34 <[Leary]> > let a = 1 in (let a = 2 in a)
08:29:36 <lambdabot> 2
08:29:52 <[Leary]> Or you can do it all on one line, which usually works fine.
08:31:54 troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua)
08:32:58 <derpadmin> Leary, yes, I use ghc to compile and I can include my tests in a module file and reload
08:33:15 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
08:33:26 <derpadmin> and yes, ghci starts in a do statement, so it does have a different behaviour
08:35:28 <derpadmin> I do want to use the nice imperative statements, but once I learned the basics
08:35:43 <derpadmin> at this point, it confuses me more than anything else
08:36:11 × Chai-T-Rex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 255 seconds)
08:38:00 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Ping timeout: 260 seconds)
08:39:06 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
08:41:35 Chai-T-Rex joins (~ChaiTRex@user/chaitrex)
08:41:44 × hyiltiz_ quits (~quassel@31.220.5.250) (Ping timeout: 260 seconds)
08:42:11 hyiltiz joins (~quassel@31.220.5.250)
08:42:19 × micro quits (~micro@user/micro) (Ping timeout: 260 seconds)
08:42:19 × tompaw quits (~tompaw@static-47-206-100-136.tamp.fl.frontiernet.net) (Ping timeout: 260 seconds)
08:42:31 tompaw joins (~tompaw@static-47-206-100-136.tamp.fl.frontiernet.net)
08:43:16 anderson_ joins (~ande@user/anderson)
08:43:56 micro joins (~micro@user/micro)
08:44:04 × anderson quits (~ande@user/anderson) (Ping timeout: 260 seconds)
08:45:29 × Goodbye_Vincent quits (cyvahl@freakshells.net) (Quit: )
08:45:37 anderson_ is now known as anderson
08:45:44 ubert joins (~Thunderbi@178.165.168.167.wireless.dyn.drei.com)
08:51:04 × libertyprime quits (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz) (Ping timeout: 260 seconds)
08:51:19 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
08:53:47 × mixfix41 quits (~sdeny9ee@user/mixfix41) (Ping timeout: 246 seconds)
08:54:35 Kaiepi joins (~Kaiepi@108.175.84.104)
09:00:03 × siraben quits (~siraben@user/siraben) (Quit: You have been kicked for being idle)
09:03:31 × razetime quits (~quassel@117.193.4.35) (Ping timeout: 252 seconds)
09:06:47 <ski> derpadmin : `let'-commands inside a `do'-expression are not desugared/translated into `>>='. `<-'-commands are, though
09:07:24 × coot quits (~coot@213.134.171.3) (Ping timeout: 260 seconds)
09:07:52 <derpadmin> thanks ski
09:09:08 × rburkholder quits (~blurb@96.45.2.121) (Ping timeout: 248 seconds)
09:09:10 offtherock joins (~blurb@96.45.2.121)
09:10:54 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
09:11:34 × Alex_test_ quits (~al_test@178.34.150.205) (Quit: ;-)
09:12:04 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
09:12:06 × AlexZenon quits (~alzenon@178.34.150.205) (Quit: ;-)
09:12:06 <ski> derpadmin : do you have an example of a `do' with `<-'s (or with plain commands, which are neither `let's or `<-'s) ?
09:12:17 × AlexNoo quits (~AlexNoo@178.34.150.205) (Quit: Leaving)
09:12:40 <ski> well, i guess you do, in your first paste
09:12:49 sudden joins (~cat@user/sudden)
09:12:52 <ski> (no `<-'s, though)
09:13:02 Tuplanolla joins (~Tuplanoll@91-159-69-11.elisa-laajakaista.fi)
09:14:08 <ski> if you have a command that's neither a `let'-command nor a `<-'-command, then that's a command that is performed, but its computed result is thrown away. that is `do {foo; bar}' is similar to `do {_ <- foo; bar}', explicitly throwing away the result of executing/running/performing the action `foo'
09:14:23 <ski> @undo do {_ <- foo; var}
09:14:23 <lambdabot> foo >>= \ _ -> var
09:14:26 <ski> @undo do {foo; var}
09:14:27 <lambdabot> foo >> var
09:14:54 <ski> as you can see, the former gets translated to `>>=' ("bind"), and the latter to `>>' ("then")
09:15:10 <ski> (er, s/var/bar/)
09:15:27 <ski> and you might then guess that `foo >> bar' is equivalent to `foo >>= \_ -> bar' .. and you'd be right
09:15:36 <ski> @src (>>)
09:15:37 <lambdabot> m >> k = m >>= \_ -> k
09:16:26 <ski> anyway, the type signature of `(>>)' here is
09:16:36 <ski> (>>) :: IO a -> IO b -> IO b
09:17:21 <ski> so, in `foo >> bar' (or `do {foo; bar}', both `foo' and `bar' are `IO'-actions, but `foo' is an `IO'-action with monadic result type `a', while `bar' instead has monadic result type `b'
09:17:57 Goodbye_Vincent joins (cyvahl@freakshells.net)
09:18:16 <ski> `foo >> bar' is the action that, when (later) executed, will first execute `foo' (and throw away its intermediate result), then execute `bar' (and yield its result as the result of executing the whole `foo >> bar')
09:19:40 <derpadmin> ok, so >> discards, and >>= bind chain the result to the subsequent operation
09:19:54 <ski> so `foo >> bar' is like combining two recipes that haven't happened yet, into a larger recipe that hasn't happened yet. or like concatenation of two "lists of commands". whenever we (at some point in the future) actually start following the instructions, performing the commands, they'll happen in the constructed order in the "recipe"
09:19:59 <ski> yes
09:20:06 <ski> and the way to express that in types is to say
09:20:15 <ski> (>>=) :: IO a -> (a -> IO b) -> IO b
09:21:35 <derpadmin> ok, that is clearer now
09:21:49 <derpadmin> will go and toy around with this new found knowledge
09:21:59 <ski> so, when `foo >>= cont' is (later) executed, `foo' will first be executed, and its result, call it `x' (of type `a', will be passed to `cont' (a function giving the next action, a "continuation"). so that next the action `cont x' is executed (and its result will be the whole result of the whole `foo >>= cont')
09:22:37 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
09:22:57 <ski> `foo >>= cont' is the same as `foo >>= \x -> cont x' (by "eta-expansion". a function `f' is the same as the function `\x -> f x' that given an input, call it `x', will just call `f' with it, and give as result whatever `f' gives as result)
09:22:57 <derpadmin> ok, very clear
09:23:21 razetime joins (~quassel@117.193.4.35)
09:23:40 <ski> @undo do {l <- getLine; putStrLn (reverse l)}
09:23:40 <lambdabot> getLine >>= \ l -> putStrLn (reverse l)
09:23:59 <ski> (a program that waits for a line of input to be entered, and then reverses and outputs it again)
09:24:10 <ski> derpadmin : any further questions, at this time ?
09:24:39 AlexZenon joins (~alzenon@178.34.150.205)
09:24:55 <derpadmin> hahaha, no ski, you went beyond the call
09:24:56 AlexNoo joins (~AlexNoo@178.34.150.205)
09:25:08 <derpadmin> but it was helpful
09:25:12 <ski> (oh, and btw, everything i said about `do',`let',`>>=',`>>' above also applies to other monads than `IO' (e.g. `Maybe',`Either e',`[]' ..) .. i just talked specifically about `IO', since that's what your code was about)
09:25:21 ski nods
09:26:18 <ski> > do x <- [0 .. 3]; y <- [x .. 3]; return (x,y)
09:26:20 <lambdabot> [(0,0),(0,1),(0,2),(0,3),(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
09:26:21 Alex_test joins (~al_test@178.34.150.205)
09:26:38 jakalx joins (~jakalx@base.jakalx.net)
09:26:38 <ski> > [(x,y) | x <- [0 .. 3],y <- [x .. 3]]
09:26:40 <lambdabot> [(0,0),(0,1),(0,2),(0,3),(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
09:26:45 mixfix41 joins (~sdeny9ee@user/mixfix41)
09:27:07 <ski> > concatMap (\x -> map (\y -> (x,y)) [x .. 3]) [0 .. 3]
09:27:08 <lambdabot> [(0,0),(0,1),(0,2),(0,3),(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
09:27:16 <ski> @undo [(x,y) | x <- [0 .. 3],y <- [x .. 3]]
09:27:16 <lambdabot> concatMap (\ x -> concatMap (\ y -> [(x, y)]) [x .. 3]) [0 .. 3]
09:28:45 <ski> that's the "list monad" (the `[]' monad. note that the type `[(Integer,Integer)]' is desugared to `[] (Integer,Integer)' (and even to `[] ((,) Integer Integer)'). `[]' here, the "list of" thing, is a monad, that does "nested looping", that explores alternative solutions, that does backtracking, just like list comprehension (`[.. | ...]') does)
09:28:57 <ski> @src [] (>>=)
09:28:57 <lambdabot> xs >>= f = concatMap f xs
09:29:07 <ski> (is what `>>=' does, for the list monad)
09:29:31 <ski> (ok, end of teaser of the list monad)
09:29:38 nate4 joins (~nate@98.45.169.16)
09:30:52 mmhat joins (~mmh@p200300f1c73503bcee086bfffe095315.dip0.t-ipconnect.de)
09:34:19 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
09:35:29 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
09:36:19 × raym quits (~ray@user/raym) (Ping timeout: 272 seconds)
09:39:50 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Ping timeout: 260 seconds)
09:42:23 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
09:42:38 <Xeroine> Hello, here https://en.wikibooks.org/wiki/Haskell/Type_basics#Type_signatures_in_code it says that add type signatures can be used for annotation in source files but if I try to define the type signature for function "xor" like in that example I first get an error by ghci I guess because "xor" isn't defined yet which makes sense and if I run it afterwards after the "xor" function definition it
09:42:40 <Xeroine> gives a different error which I don't understand. Here's the output https://bpa.st/BDCA
09:42:56 <Xeroine> what am I doing wrong?
09:43:22 <Xeroine> it says that type signatures*
09:44:09 × talismanick quits (~talismani@76.133.152.122) (Ping timeout: 260 seconds)
09:44:10 <ski> Xeroine : the interactor (GHCi, GHC interactive, the "REPL" (Read-Eval-Print-Loop)) isn't really intended to do complicated definitions, here
09:44:41 <Xeroine> oh so this only works when compiled?
09:44:54 zeenk joins (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494)
09:45:07 × loras quits (~loras@c-73-139-125-125.hsd1.fl.comcast.net) (Ping timeout: 268 seconds)
09:45:09 <Xeroine> okay thanks
09:45:11 <ski> you need to either give both the type signature (if present) and all the defining equations, at the same time (with a single press of `<return>'), or use `:{' and `:}' to bracket all your lines .. or just define it in a module source file, and load that
09:46:23 <Xeroine> ah, thanks
09:46:23 <ski> Prelude> let xor :: Bool -> Bool -> Bool; xor p q = (p || q) && not (p && q)
09:46:26 <ski> will work
09:47:13 <ski> (also without the `let', nowadays .. although i'm not really a fan of that. (i don't like it being less clear the difference between evaluating an expression, and elaborating a declaration))
09:47:17 <ski> also
09:47:27 <ski> Prelude> :{
09:47:35 <ski> Prelude| xor :: Bool -> Bool -> Bool
09:48:01 <ski> Prelude| xor p q = (p || q) && not (p && q)
09:48:06 <ski> Prelude| :}
09:48:09 <ski> will work
09:49:01 <ski> but simplest, at least for longer definitions, or ones which you think you may want to keep (rather than just a quick test), is to simply out them into your source file, (save and) reload with `:r' (or load initially with `:l')
09:49:45 <ski> also note that when you reload, all the definitions you've made in the interactor are discarded .. which is another reason to put them into a file
09:50:38 <ski> (well, ok, your paste said `ghci>' instead of `Prelude>' .. only now noticed your second link)
09:53:14 <ski> (if you had entered `let xor :: Bool -> Bool -> Bool', including the `let', then the error message you'd gotten would have been slightly more understandable, since it'd have at least realized that you wanted to *define* `xor' (giving a type signature for it), rather than *evaluating* the *expression* `xor :: Bool -> Bool -> Bool' (which is the same as `xor', except with an explicit type ascription))
09:53:26 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
09:53:49 <Xeroine> oh
09:54:16 <ski> for quick tests, i use the `let blah :: ...; blah ... = ...; blah ... = ...' method
09:56:21 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
09:56:36 <ski> (that way, i can edit it back and forth, until i'm satisfied, and then hit `<enter>'/`<return>' .. if i use `:{' and `:}', then if a realize a previous line was wrong, i need to abort and start all over again, and reenter all the non-changed lines again .. however, it *is* nicer to not enter such a long line at a time, and to have visual alignment between lines .. which is when i go back to defining it in a
09:56:42 <ski> file, when that annoys me enough (or i think i want to keep the definition))
10:01:17 <ski> (the difference between type ascription and type signature is that a type ascription is a `:: <type>' part you tack on to the end of an expression (any expression), to explicitly specify/constrain its type. while a type signature is a *declaration*, something you don't put inside an expression (unless it's further inside a `let' or `where' inside of that), but rather put it where declarations are expected,
10:01:23 <ski> either at the top-level (inside a module), usually (but not always) just before the defining equation(s), or in a few other places (`let',`where' (attached to defining equations, to `case'-`of' branches, to `class' and `instance' declarations .. and some language extensions))
10:03:27 <ski> .. anyway, if any of that was confusing, you can probably safely ignore it, for the time being
10:03:39 <Xeroine> ski: if I do "let x=1" in ghci it prompts me to continue that line with "Prelude|". Correct me if I'm wrong but if I do "let x=1" then hit enter twice to return to "Prelude>" it defines x as a global variable and if instead I did "let x=1 in x+1" it's defined as a variable only in the "in" scope, right? If this is correct then is there a way to tell "let" that I just want to define a global
10:03:41 <Xeroine> variable and instead of being prompted to continue the line in "Prelude|" just have it go to "Prelude>"?
10:04:13 <Xeroine> this is the reason why I haven't been using "let" that much by the way, I just don't get this kind of issue by doing x=1
10:04:28 <ski> `let x=1' doesn't give me a continuation prompt in the interactor, here .. could you maybe paste exactly what you did ?
10:04:37 <Xeroine> sure
10:04:59 <Xeroine> ski: but like I said I have the multiline mode enabled with ":set +m" and I'd like to keep it enabled for when I need it
10:05:45 <Xeroine> https://bpa.st/
10:05:49 <Xeroine> oops
10:05:51 <Xeroine> https://bpa.st/QFJQ
10:06:11 <Xeroine> doesn
10:06:20 <ski> ah, right `:set +m' is to be able to continue the previous line, when that is a possibility (iirc) (i don't really use it)
10:06:22 <Xeroine> doesn't happen with multiline mode disabled by the way
10:06:34 <Xeroine> yea
10:07:10 <ski> anyway, what you said about `let' with and without `in' is correct
10:07:18 <ski> `let ... in ...' is an expression
10:07:29 × derpadmin quits (~Anonymous@homebase.200013.net) (Ping timeout: 260 seconds)
10:07:46 <Xeroine> ski: oh I just figured out how to stop it from happening
10:07:46 <ski> `let ...', without an `in', is an interactor thing (and is also a thing that happens inside a `do'-expression)
10:07:52 <ski> ok ?
10:08:01 <Xeroine> I just put a space after the "let x=1 " and it doesn't give the "Prelude|" prompt
10:08:11 <ski> hm .. curious
10:09:00 <Xeroine> ski: what do you mean by "interactor thing" like it's something that works only in ghci?
10:09:04 derpadmin joins (~Anonymous@homebase.200013.net)
10:09:23 <ski> anyway, with `:set +m', you can do stuff like
10:09:34 <ski> ghci> let xor p q
10:09:52 <ski> ghci> | p = not q
10:10:05 <ski> ghci> | otherwise = q
10:10:06 <Xeroine> yeah I know, continue lines but thanks
10:10:16 <ski> (er, should be `ghci|' on the successive lines)
10:10:19 thyriaen joins (~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1)
10:10:24 <ski> or even just
10:10:33 <ski> ghci> let double x =
10:10:45 <ski> ghci| 2*x
10:11:02 <ski> you can give a single defining equation over multiple lines
10:11:45 <ski> and, for `let x=1' (but for some inscrutable reason, not for `let x=1 ' ..), it was thinking you might want to give additional lines to that, and so gives you a continuation prompt
10:12:06 <ski> e.g. you *could* say
10:12:12 <ski> ghci> let x=1
10:12:22 <ski> ghci| +2
10:12:35 <ski> and then `x' becomes `1+2', iow `3'
10:12:51 <ski> dunno why the space at the end makes that not happen, though
10:13:23 koz_ joins (~koz@121.99.240.58)
10:13:54 × koz quits (~koz@121.99.240.58) (Ping timeout: 260 seconds)
10:13:55 <Xeroine> ski: ah, by the way why do you quote with ` and ' instead of ' and ' and what's iow?
10:14:38 <ski> Xeroine : the interactor is the thing where you interact, well, interactively, with the system, asking queries (expressions to evaluate), and get answers (computed values back), and also (with some limitations) give declarations and definitions, and also interactor-specific commands (like `:r',`:t',`:l') to ask the interactor to load files, check type (only), set options, &c.
10:16:13 × intelligent_boat quits (~intellibo@user/intelligent-boat/x-3514795) (Ping timeout: 272 seconds)
10:16:14 × turlando quits (~turlando@user/turlando) (Ping timeout: 260 seconds)
10:16:46 turlando joins (~turlando@user/turlando)
10:17:17 <ski> (i say "interactor" rather than "interpreter", since an interactor doesn't need to be an interpreter. it can be an on-the-fly compiler (in this case, GHCi compiles to byte-code, which is then interpreted) .. the opposite of "interator" is "batch processor", when you feel whole files to the compiler (or interpreter !), producing compiled code, which may be stored in files, or executed directly (or simply
10:17:23 <ski> interpreting that as you go, as most shells do in "script mode"))
10:18:33 <ski> Xeroine : those are TeX-style quotes .. one reason is that they're more nestable. another is that it's an ingrained habit in me, over many years. i don't think about it
10:18:40 <ski> "iow" is "in other words"
10:19:19 <ski> (i commonly (like in this case) also don't think about / realize when i'm using such abbreviations .. feel free to ask about any other one i happen to employ)
10:19:59 <ski> (er, s/when you feel whole files/when you feed whole lines/)
10:20:20 <Xeroine> ski: thanks a lot =) your answers are really detailed but easy to understand. I've asked here stuff before but got severly confused by answers that involve terminology that I don't yet understand
10:20:32 <Xeroine> severely*
10:21:15 <ski> well .. i do tend to try to explain possibly unknown terms i use (sometimes to the detriment of brevity, risking becoming too long-winded an explanation .. also risking going off tangents too much, i think)
10:21:56 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds)
10:22:09 <ski> (but it's nice to know i'm apparently doing *something* right, reasonably often, at least)
10:23:32 <Xeroine> =)
10:25:19 ski 's still trying to see where "iow" was used ..
10:26:45 wootehfoot joins (~wootehfoo@user/wootehfoot)
10:28:01 ski also now noticed using "iirc" without realizing it
10:28:29 <Xeroine> =D yeah I use iirc too
10:28:48 <darkling> [10:11:54] <ski> and then `x' becomes `1+2', iow `3'
10:28:51 <darkling> About 15 minutes ago.
10:30:57 <ski> .. oh .. missed that, despite glossing over it, multiple times
10:38:58 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
10:39:07 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds)
10:39:40 <ski> (i don't really like "dumbed down" language, where you specifically avoid "hard/advanced" words, much .. if people don't encounter more specialized technical jargon words (that are intended to help, rather than befuddle, although the latter is sadly often also the case, and not just because of what i'm presently ranting on) .. but i also don't like people being scared away by jargon that they don't know, and
10:39:46 <ski> possibly doesn't know where to find elaborated upon (although many people could do well with learning to ask when they're confused (although unfortunately in many cases, people have bad experiences with that, with unfriendly or unhelpful responses to such)) .. so i tend to settle for using them, and then also elaborating on what i mean, if i suspect it might be unclear .. but as said, this does tend to run
10:39:52 <ski> the risk of falling into the trap of being too long-winded, or, sometimes, introducing too many technically correct gotchas, caveats, and "oh, and look/think at this cool related thing !"s, to the detriment of the clarity of the situation. sometimes a provisionary simplification is called for, or just pointing out that something's not the whole story .. attempting to help someone learn something is
10:39:58 <ski> complicated, i guess)
10:40:03 ski sometimes talks too much, and occasionally not too much
10:40:43 rburkholder joins (~blurb@96.45.2.121)
10:40:44 × offtherock quits (~blurb@96.45.2.121) (Ping timeout: 260 seconds)
10:41:08 fserucas_ joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
10:42:56 <ski> (er .. "if people don't encounter more specialized technical jargon words (...), how're they to be expected to learn to understand and possibly use them ?")
10:43:52 danza joins (~francesco@22.red-79-153-42.dynamicip.rima-tde.net)
10:47:00 ski wanders off into the corner, muttering and mumbling to themselves
10:48:38 <Xeroine> =D yeah I understand what you're saying
10:51:18 <[exa]> kinda hard with the dumbed down language; there are things that are best explained by straightforward 5-word imprecise intuition (or rule of thumb or so), but the risks...
10:52:06 <ski> yea ..
10:52:17 neceve_ joins (~neceve@user/neceve)
10:53:11 <[exa]> (like the "atomic" yesterday, which retrospectively caught me totally off guard)
10:53:31 <ski> missed that, what was that about ?
10:53:33 × neceve_ quits (~neceve@user/neceve) (Client Quit)
10:54:03 × libertyprime quits (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz) (Ping timeout: 248 seconds)
10:54:22 <[exa]> the semantic of "atomic" in the 2 first paragraphs herE: https://www.haskell.org/tutorial/goodies.html
10:54:25 darkstardev13 joins (~darkstard@50.53.3.186)
10:54:51 <ski> ty
10:55:38 <[exa]> like, in the 2nd paragraph I have no idea how the (->) type is less structued than []
10:56:17 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
10:56:52 × darkstarx quits (~darkstard@50.126.124.156) (Ping timeout: 248 seconds)
10:57:23 <ski> (i can see how a technical expansion of that might be less than helpful, in some circumstances, as opposed to perhaps something like "it's a simple, 'indivisible', expression that doesn't need to be 'protected' with brackets")
10:57:38 <[exa]> I kinda understand the atomic there as "indivisible" as in "not compound" which would make sense, and the 2nd paragraph should certainly have "types of atomic values" instead of "atomic types"
10:57:59 × Xeroine quits (~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in)
10:58:20 Xeroine joins (~Xeroine@user/xeroine)
10:58:25 <ski> (i would probably argue `\x -> x+1' is structured, btw)
10:58:52 <[exa]> structured as an expression, but you can't really decompose the value right?
10:59:31 <ski> yea .. there's a difference between "atomic expression" (a syntactic thing) and "atomic value" (a semantic thing)
10:59:46 <[exa]> anyway yeah, not a big problem but spawns doubt. :D
10:59:50 × zeenk quits (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
11:00:14 <ski> (but still you *can* "decompose"/eliminate it .. by calling the function. you just can't "simply reach inside it and have a look at the body", say)
11:00:50 <[exa]> that's kinda like decomposing the integer by adding to it
11:01:08 <ski> .. i guess, maybe
11:01:11 [exa] feels nerdsniped
11:02:26 jakalx joins (~jakalx@base.jakalx.net)
11:02:31 <ski> (although when you learn about natural deduction (every type/logic formula has introduction and elimination rules), and how that relates to the typing rules, you learn that function calling is the (primitive/basic) elimination rule for functions, but addition is not really the (primitive/basic) elimination tule for integers)
11:03:37 <ski> (s/formula/formula connective/)
11:05:55 <ski> (oh, right, the second paragraph .. yea, agree with you there. .. maybe they're thinking about whether the type in question is an abstract type or not ?)
11:06:28 <[exa]> re abstract, all seems fully instantiated
11:06:55 <[exa]> basic properties are complicated. :D
11:06:58 × whez quits (sid470288@id-470288.lymington.irccloud.com) (Quit: Connection closed for inactivity)
11:07:13 <ski> we can look at the data constructors of the list type, and the pair type. but not of the integer type (barring implementation details), or the function type
11:07:32 <ski> just like `Map k v' is an abstract data type
11:07:56 <ski> (or `IO',`Array',`IORef',`Handle')
11:10:28 ski . o O ( `data a -> b = forall env. Closure env ((# env , a #) #-> b)' )
11:12:11 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 268 seconds)
11:12:50 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
11:16:54 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
11:18:46 sudden joins (~cat@user/sudden)
11:20:15 jakalx joins (~jakalx@base.jakalx.net)
11:22:42 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
11:25:29 AlexNoo_ joins (~AlexNoo@178.34.150.205)
11:25:39 Alex_test_ joins (~al_test@178.34.150.205)
11:26:44 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
11:27:24 × Alex_test quits (~al_test@178.34.150.205) (Ping timeout: 260 seconds)
11:28:34 × AlexNoo quits (~AlexNoo@178.34.150.205) (Ping timeout: 260 seconds)
11:28:53 gurkenglas joins (~gurkengla@p548ac72e.dip0.t-ipconnect.de)
11:28:54 AlexNoo_ is now known as AlexNoo
11:29:09 Alex_test_ is now known as Alex_test
11:31:06 Heyting joins (~Heyting@193.198.16.217)
11:31:23 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
11:34:05 gmg joins (~user@user/gehmehgeh)
11:34:30 neceve_ joins (~neceve@user/neceve)
11:34:48 × gmg quits (~user@user/gehmehgeh) (Client Quit)
11:36:58 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
11:39:38 × neceve_ quits (~neceve@user/neceve) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
11:41:45 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Ping timeout: 260 seconds)
11:41:46 <Guest75> For Maybe Semigroup vs. Maybe Monoid, does (<>) behave differently?
11:44:07 <Franciman> no
11:44:56 <Franciman> Guest75: in last versions it's exactly the same
11:45:25 <Franciman> i mean to say that now Monoid's (<>) is exactly Semigroup's (<>)
11:45:37 <Franciman> while before they could be different. But for Maybe it has always been the same
11:46:16 <[exa]> ski: wait that's actually written down somewhere?
11:46:36 mc47 joins (~mc47@xmonad/TheMC47)
11:47:00 jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
11:48:04 × jonathanx__ quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 248 seconds)
11:48:23 <Guest75> Franciman: thanks! I've got it now, looking at the task I have
11:48:26 <Guest75> Prelude> Only (Sum 1) `mappend` Nada
11:48:26 <Guest75> Only (Sum {getSum = 1})
11:49:15 <Guest75> I first implemented this as returning Nada. but according to identity law it should return the Only (Sum 1)
11:52:11 × libertyprime quits (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz) (Ping timeout: 248 seconds)
11:53:00 × vglfr quits (~vglfr@145.224.100.100) (Remote host closed the connection)
11:54:04 vglfr joins (~vglfr@145.224.100.100)
11:58:14 <ski> [exa] : hah, nah. it's just an imagined rationalization of first-class functions, in terms of a lower level kind of functions, "toplevel/nonnested" ones (like ones in C (not counting GCC or CLang nested ones))
12:00:35 <ski> .. the latter `a #-> b' can be thought of as a modal version `[] (a -> b)' of the first-class ("closure") ones, where the ("always"-type) `[]' modality means something like "globally known". cf. Lewis's <https://en.wikipedia.org/wiki/Strict_implication>
12:01:10 <Franciman> sorry ski how do you interpret a #-> b ?
12:01:13 <Franciman> i don't understand
12:01:34 gmg joins (~user@user/gehmehgeh)
12:02:14 <ski> (.. perhaps there could be a Haskell implementation which actually used that implementation of `->' above, giving `Closure :: env #-> ((# env , a #) #-> b #-> (a -> b)', presumably .. perhaps this would suggest using a `data#' or something instead of `data')
12:02:32 <ski> Franciman : similarly to `b_t (*)(a_t)', in C
12:02:58 <ski> (or, i guess, `b_t ()(a_t)' ..)
12:03:01 ski checks
12:04:24 <Franciman> so it's a _stricter_ version
12:08:04 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
12:08:11 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 248 seconds)
12:08:16 × Heyting quits (~Heyting@193.198.16.217) (Remote host closed the connection)
12:09:33 beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt)
12:10:47 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
12:11:57 nilradical joins (~nilradica@user/naso)
12:13:11 gmg joins (~user@user/gehmehgeh)
12:16:54 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
12:17:37 gmg joins (~user@user/gehmehgeh)
12:18:02 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
12:18:55 × maerwald quits (~maerwald@mail.hasufell.de) (Changing host)
12:18:55 maerwald joins (~maerwald@user/maerwald)
12:20:29 × turlando quits (~turlando@user/turlando) (Ping timeout: 260 seconds)
12:21:26 turlando joins (~turlando@user/turlando)
12:21:27 <ski> ah, right. it should be just `b_t (a_t)', in C
12:21:32 <ski> Franciman : yep
12:21:44 <Franciman> nice
12:23:06 <ski> it's nice when explaining how `a -> b' can be implemented as a closure, effectively `exists env. (# env , (# env , a #) -> b #)', from a high-level perspective
12:25:49 <ski> (which then also helps with explaining how the OO-like (synchronous stream processor) `newtype SSP a b = MkSSP (a -> (b,SSP a b))' could alternatively be represented as `data SSP a b = forall s. MkSSP s (s -> a -> (b,s))' .. or, generally, `nu s. f s' as `exists s. (s,s -> f s)' ("State representation"), comparable to `mu r. f r' being representable as `forall r. (f r -> r) -> r' ("Church representation"),
12:25:55 <ski> provided `f' is a functor)
12:28:02 <ski> @quote commingle
12:28:02 <lambdabot> GuySteele says: Some people prefer not to commingle the functional, lambda-calculus part of a language with the parts that do side effects. It seems they believe in the separation of Church and
12:28:02 <lambdabot> state.
12:28:04 <ski> @quote Haskell.separates
12:28:05 <lambdabot> shapr says: Haskell separates Church and state!
12:28:06 × vglfr quits (~vglfr@145.224.100.100) (Remote host closed the connection)
12:28:07 <ski> @quote are.dual
12:28:08 <lambdabot> ski says: I'd rather say that in Haskell, Church and State are dual
12:28:10 __monty__ joins (~toonn@user/toonn)
12:28:51 vglfr joins (~vglfr@145.224.100.100)
12:29:17 × gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds)
12:29:23 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
12:31:30 gmg joins (~user@user/gehmehgeh)
12:33:54 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
12:36:48 <ski> (also relevant for comparision is Yoneda, `f t' being equivalent to `forall a. (t -> a) -> f a', and Coyoneda, `f t' being equivalent to `exists x. (f x,x -> t)' .. provided `f' is a functor, in both cases. (if a contravariant functor, flip the direction of the arrow `t -> a'/`x -> t')
12:37:50 <ski> fmap :: forall f a b. Functor f => (a -> b) -> (f a -> f b)
12:38:09 <ski> flip fmap :: forall f a b. Functor f => f a -> ((a -> b) -> f b)
12:38:39 <ski> flip fmap :: forall f a. Functor f => f a -> (forall b. (a -> b) -> f b)
12:39:05 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds)
12:39:19 <ski> \fa -> MkYoneda (flip fmap fa) :: forall f a. Functor f => f a -> Yoneda f a
12:39:21 <ski> given
12:39:40 <ski> newtype Yoneda f a = MkYoneda (forall b. (a -> b) -> f b)
12:39:45 <ski> and
12:39:45 <ski> fmap :: forall f a b. Functor f => (a -> b) -> (f a -> f b)
12:40:05 <ski> uncurry fmap :: forall f a b. Functor f => (a -> b,f a) -> f b
12:40:25 <ski> uncurry fmap :: forall f a. Functor f => (exists a. (a -> b,f a)) -> f b
12:41:53 <ski> er
12:41:59 <ski> uncurry fmap :: forall f b. Functor f => (exists a. (a -> b,f a)) -> f b
12:42:09 <ski> \(MkCoyoneda abfa) -> uncurry fmap abfa :: forall f b. Functor f => Coyoneda f b -> f b
12:42:12 <ski> given
12:42:39 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
12:42:40 <ski> data Coyoneda f b = MkCoyoneda (exists a. (a -> b,f a))
12:42:41 <ski> iow
12:42:51 <ski> data Coyoneda f b = forall a. MkCoyoneda (a -> b,f a)
12:46:45 <ski> (you can do similar derivations for the `Density f a' monad (`forall b. (a -> f b) -> f b') and the `Codensity f b' comonad (`exists a. (f a,f a -> b)'), relating them to `(=<<)'/`(>>=)' (monads) and `(<<=)'/`(=>>)' (comonads))
12:47:37 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
12:47:39 jlgw joins (~jw@83-233-104-81.cust.bredband2.com)
12:48:46 nilradical joins (~nilradica@user/naso)
12:48:52 <ski> (and of course also for `Mu f r' and `Nu f s' .. what are the relevant operations there ? .. well the fold `cata :: Functor f => (f r -> r) -> (Mu f -> r)' and the unfold `ana :: Functor f => (s -> f s) -> (s -> Nu s)')
12:48:57 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
12:51:26 <[Leary]> ski: fold/unfold; inMu/outNu; outMu/inNu; rec/corec.
12:52:31 <[Leary]> The duality made me really happy, until I realise `Nu` also had dual performance problems to `Mu` ... when duality goes too far.
12:52:50 <ski> elaborate ?
12:53:40 × ulvarrefr quits (~user@188.124.56.153) (Read error: Connection reset by peer)
12:54:19 × nilradical quits (~nilradica@user/naso) (Ping timeout: 260 seconds)
12:54:48 <ski> (s/Nu s/Nu f/)
12:55:48 <[Leary]> Nu f has ideal performance in destructing entirely or constructing piece-by-piece, and terible performance destructing piece-by-piece. Mu f has ideal performance in constructing entirely or destructing piece-by-piece, but terrible performance constructing piece-by-piece.
12:55:51 darkstarx joins (~darkstard@50.53.3.186)
12:56:25 <[Leary]> Oh, I may have that backwards.
12:56:27 <ski> do you mean the other way around ?
12:56:28 <ski> yea
12:56:29 <[Leary]> Yeah.
12:56:46 <ski> (swap `Mu' and `Nu')
12:56:50 <[Leary]> I use `LFP` and `GFP` in my code; easier to remember.
12:57:08 ski . o O ( "Least/Greatest Fixed Point" )
12:57:32 <[Leary]> Also, `Mu f r` and `Nu f r` are perfectly well defined if you're using fixed points of functors on functors instead. :)
12:57:50 <ski> "using fixed points of functors on functors" ?
12:58:24 × darkstardev13 quits (~darkstard@50.53.3.186) (Ping timeout: 260 seconds)
12:58:59 <ski> unfoldSSP :: (s -> a -> (b,s)) -> (s -> SSP a b) -- i guess is the relevant operation, in that case, cf.
12:59:03 <ski> @type unfoldr
12:59:04 <lambdabot> (b -> Maybe (a, b)) -> b -> [a]
12:59:33 nilradical joins (~nilradica@user/naso)
12:59:51 <[Leary]> @let newtype LFPF h r = LFPF (forall f. Functor f => h f ~> f -> f r)
12:59:52 <lambdabot> /sandbox/tmp/.L.hs:173:54: error:
12:59:52 <lambdabot> Not in scope: type constructor or class ‘~>’
12:59:52 <lambdabot> |
12:59:52 rumgzy is now known as Sauvin
13:00:03 <[Leary]> Ah, right. Well, you get the idea.
13:00:10 <[Leary]> Probably.
13:01:01 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
13:02:00 seriously_guest joins (~seriously@2001:1c06:2715:c200:477d:d99e:8fa:a2d8)
13:02:05 <[Leary]> So regular `LFP :: (Type -> Type) -> Type`, while `LFPF :: ((Type -> Type) -> (Type -> Type)) -> (Type -> Type)`.
13:02:37 <[Leary]> I suspect you can fix any kind that ultimately resolves to `Type`, but I'm not sure how to write the generalisation.
13:03:10 <ski> hm, so `forall f. Functor f => (forall a. h f a -> f a) -> f r' ..
13:05:09 <[Leary]> I'll put up a gist, gimme a minute to trim all the crap out of the file I was working in...
13:05:39 <ski> basically a (higher) `Mu h' (`forall f. Functor f => (h f -> f) -> f', if you squint appropriately)
13:07:18 <ski> hmm .. this is good food-for-thought .. for my ideas about "structure (level) terms"
13:08:15 <ski> (right, so now i'm with you again, so far)
13:09:37 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
13:09:41 <ski> hm, i guess `unfoldSSP' could be said to be the/a "constructor"/"class" (in OO terms), of `SSP a b'
13:10:03 <ski> unfoldSSP :: (s -> a -> (b,s)) -> (s -> SSP a b)
13:10:45 <ski> runSSP (unfoldSSP step state0) a = (b,state1)
13:10:47 <ski> where
13:11:19 <ski> (b,state1) = step state0 a
13:12:05 <ski> no, that ought to be
13:12:16 <ski> runSSP (unfoldSSP step state0) a = (b,unfoldSSP step state1)
13:12:18 <ski> where
13:12:22 <ski> (b,state1) = step state0 a
13:13:00 <ski> (given `data SSP a b = MkSSP {runSSP :: a -> (b,SSP a b)}')
13:13:06 Major_Biscuit joins (~MajorBisc@86-88-79-148.fixed.kpn.net)
13:14:52 × troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 252 seconds)
13:15:00 nilradical joins (~nilradica@user/naso)
13:15:30 <ski> (for the existential version, it just packs `state0' and `step' into the `data' constructor, no recursion. and instead, methods/messages like `runSSP :: SSP a b -> a -> (b,SSP a b)' will be defined to rewrap the new state with the method( implementation)(s))
13:17:14 <[Leary]> https://gist.github.com/LSLeary/98763e62f6fe4a2d629f74b38b9f2e45
13:17:17 <[Leary]> ski: ^
13:18:05 ski appreciates the alignment :)
13:19:17 <ski> is there a reason why you CPS the `GFP' existential, rather than use existential data constructors ?
13:20:49 <[Leary]> I've not gone all-out with it, but the idea is that all the code here can be translated into e.g. System F or Dhall.
13:21:18 <ski> with just `forall's, no `exists' ?
13:21:24 <[Leary]> Right.
13:21:27 <ski> ok
13:21:27 notzmv joins (~zmv@user/notzmv)
13:21:54 <ski> (and presumably no existential `data' constructors, or equivalent, either)
13:22:12 <ski> (of course, i think `ExistentialDataTypes' is a misnomer ..)
13:22:34 <ski> (er .. `ExistentialQuantification', rather)
13:22:54 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
13:24:44 sudden joins (~cat@user/sudden)
13:25:07 <ski> ah, `rec' and `corec' are your `para' and `apo'
13:25:28 <ski> ("primitive recursion" and "primitive corecursion")
13:28:09 × Alex_test quits (~al_test@178.34.150.205) (Ping timeout: 260 seconds)
13:28:28 Alex_test joins (~al_test@178.34.150.205)
13:28:59 <ski> not quite seeing why `outLT' and `inGT' requires `FuncTrans', just yet
13:29:27 <ski> (also, not sure i'd have thought of making `FuncTrans' a mere synonym, rather than a defined type class)
13:31:05 <[Leary]> I derived my names from a Wadler draft, rather than the recursion-schemes library or whatever corner of category theory may have inspired it. I don't really fancy hyderomastgroningemorphisms etc.
13:31:06 nate4 joins (~nate@98.45.169.16)
13:31:26 <ski> fair enough
13:32:25 <[Leary]> As for FuncTrans, it's not strictly necessary, but it seems more morally correct than, e.g. a `Functor (h (LFPF h))` constraint.
13:32:27 × Major_Biscuit quits (~MajorBisc@86-88-79-148.fixed.kpn.net) (Ping timeout: 248 seconds)
13:33:13 <ski> ok, `LDeep' is effectively a non-regular `data' type
13:33:59 <ski> (like `data Nest a = Leaf a | Branch a (Nest (Nest a))')
13:34:03 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 248 seconds)
13:34:53 <[Leary]> Yeah, that's the idea.
13:35:39 <ski> `FuncTrans' (cf. `MonadTrans') is basically a higher `Pointed' .. it does seem uncalled for, in this circumstance, afaics
13:35:59 <ski> hm
13:36:11 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 248 seconds)
13:36:27 <[Leary]> Well, `h` is supposed to be a functor from one category of functors to another.
13:37:14 <[Leary]> Or something like that anyway, I'm not actually a CT guy.
13:37:24 <[Leary]> It seemed appropriate.
13:37:58 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 252 seconds)
13:38:10 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
13:38:49 <ski> ah, no .. i'm confused. `MonadTrans t' gives `forall m. Monad m => m -> t m', not `Monad m => Monad (t m)' (which is basically provided case-by-case for each transformer `t')
13:39:12 <ski> (`forall m. Monad m => Monad (t m)')
13:44:42 <ski> ok .. now i think i see why it threw me off. to express `h : EndoFunctor Type >---> EndoFunctor Type' (rather than a mere `h : (Type -> Type) >---> (Type -> Type)', where the inhabitants of the domain and codomain are just type functions, need not be functors), we need `FuncTrans' (and in addition that `h' is actually a functor itself, not just a type function) .. but for the lower `f : Type >---> Type'
13:44:48 <ski> case, there's no such complication for the domain and codomain (but we still need `f' to be a functor, of course)
13:45:10 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
13:45:45 <ski> (CT mostly doesn't consider the "raw type function" case, afaik .. so these kind of quibbles don't tend to turn up that often, i think)
13:46:24 <ski> [Leary] : so i think you've it right, here
13:47:03 epolanski joins (uid312403@id-312403.helmsley.irccloud.com)
13:47:52 <ski> (s/need `f' to be a functor/need `f' itself to be a functor/)
13:48:41 jonathanx_ joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
13:51:10 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 252 seconds)
13:51:29 × jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 260 seconds)
13:51:34 × son0p quits (~ff@181.136.122.143) (Read error: Connection reset by peer)
13:51:43 <[Leary]> I see, well I'm glad if we're on the same page.
13:56:07 × razetime quits (~quassel@117.193.4.35) (Ping timeout: 252 seconds)
13:57:28 <seriously_guest> hello... I was here a few days ago, struggling with an excercise in yorgey cis194, homework 7, folds and monoids. I feel really comfortable with the concept of a monoid and the benefits of the combining nature of them. Im struggling with the concept of a JoinList being used for "fast-indexing". I cant wrap my head around the inuitiveness of this
13:57:29 <seriously_guest> data structure... I dont see how having the size of a subtree gives you any indication of which child subtree the desired index is in.
13:57:53 <seriously_guest> https://www.cis.upenn.edu/~cis1940/spring13/hw/07-folds-monoids.pdf, Ex. 2
14:00:27 <seriously_guest> Given joinlist x, x = Append (Size 3) (Single 1 'y') (Single 1 '0'), how does one choose the correct tree (left subtree or right subtree) to look into?
14:00:43 <seriously_guest> given the index to search for is 1
14:01:55 <ski> seriously_guest : iirc, you look at the size of the (direct) subtrees
14:02:36 <seriously_guest> Right, so how does one deter anything in my example
14:02:46 <seriously_guest> determine*
14:03:14 <ski> so for `Append (..) (Append (Size m) (..) (..)) (Append (Size n) (..) (..))', `m' and `n' would be the sizes of the direct subtrees that you could think about
14:03:47 <ski> (and similarly when the two direct subtrees aren't `Append's, but rather `Single's (or `Empty's, if you have those))
14:04:56 srk joins (~sorki@user/srk)
14:05:11 <seriously_guest> I understand that bit... I understand that theres a way to determine which subtree you should traverse to into based on the index and the size
14:05:18 <ski> (i remember someone asked about this same issue, a few days ago .. perhaps that was you)
14:05:23 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
14:05:30 <seriously_guest> yeah that was me
14:05:50 razetime joins (~quassel@117.193.3.152)
14:05:58 <seriously_guest> But i dont have any inkling of the math necesarry to make the determination
14:06:32 <ski> "I dont see how having the size of a subtree gives you any indication of which child subtree the desired index is in.","I understand that theres a way to determine which subtree you should traverse to into based on the index and the size" -- but you don't see what that way is, correct ?
14:06:41 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
14:06:52 <seriously_guest> correct
14:08:05 nilradical joins (~nilradica@user/naso)
14:09:38 <ski> well .. suppose there's a small collection of houses (perhaps in a suburb), near a forest/hill/lake, where all the houses are numbered contiguously (perhaps placed somewhat unorderly), with just one area name, rather than separate street names. say "Lakeview" for concreteness
14:09:58 justsomeguy joins (~justsomeg@user/justsomeguy)
14:11:08 <ski> now, upon arriving at this place, by the road there, you get to one tip of the lake, and the road forks into two directions, to the two different sides of this lake point/tip, and you see a sign saying "Lakeview 1 - 17" pointing to the left, and "Lakeview 18 - 31" pointing to the right
14:11:21 <ski> you want to get to Lakeview 25 .. which way do you turn ?
14:11:45 <seriously_guest> I turn right
14:11:49 <ski> why ?
14:12:00 <seriously_guest> because 25 is between 18-31
14:12:05 <ski> yes
14:12:18 <ski> what's the number of houses to the left ? what's the number of houses to the right ?
14:12:37 × nilradical quits (~nilradica@user/naso) (Ping timeout: 252 seconds)
14:12:47 <seriously_guest> 17 houses to the left, 13 houses to the right
14:12:50 <ski> yes
14:13:16 <ski> so, effectively, you have `Append (Size 31) (Append (Size 17) (..) (..)) (Append (Size 13) (..) (..))'
14:14:09 <ski> (do you see this ?)
14:14:22 <seriously_guest> Yeah I do
14:15:45 <ski> so, given that you want to index into this `JoinList', with an index `i', how do you compare `i' to something involving the constants `31',`17',`13' above ?
14:16:09 nilradical joins (~nilradica@user/naso)
14:16:30 <ski> (let's say `i' is `0'-based, rather than `1'-based .. presumably that's the case in your exercise (although i didn't check))
14:17:19 <seriously_guest> right so i (25) is less than 31 so the house definetly in this area
14:17:31 <ski> yes, .. and ?
14:18:02 <seriously_guest> I know looking the the left that i cant be there because i is greater than the amount of houses there, so I walk right
14:18:04 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
14:18:09 <ski> correct
14:18:18 <ski> do you think you can code this, now ?
14:18:58 <seriously_guest> I can defintely code that bit... I actually understood that concept inuitevly... but lets shrink the use case to something with a tie breaker
14:19:21 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
14:19:43 <seriously_guest> lets say theres 2 houses total
14:20:08 <seriously_guest> and im looking for house 1 (0-indexed)
14:20:23 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
14:20:34 <ski> (it might help to define an auxilary `annotation :: Monoid m => JoinList m a -> m' function, that simply extracts the annotated monoid element of the whole tree)
14:20:45 <ski> yes ?
14:21:32 <seriously_guest> Both the left side of the area and the right side of the area have 1 house, and im looking for house 1
14:21:51 <ski> makes sense, so far
14:23:57 <seriously_guest> Both sizes of each area are 1, how can I come to a conclusion of which side to go ?
14:24:09 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
14:26:37 <ski> well, with `0'-based, a total size of `2' means valid indices are `0' and `1'. so, having both subtrees of size `1', means the valid index in the left is `0', and the valid index in the right is `1'
14:28:00 <ski> generally, if `k' is an index into an `m + n' sized tree, then `i = ..k..m..n..' is an index into the `m' sized direct subtree, if [something here]; and `j = ..k..m..n..' is an index into the `n' sized direct subtree, if [something here]
14:28:26 <ski> can you figure out the two `..k..m..n..'s, and the two "[something here]"s ?
14:29:56 <ski> (it seems you're mostly stuck on the possiblity of off-by-one errors, the exact dividing criteria to use (and perhaps how to transform the indices appropriately for the chosen subtree))
14:30:52 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
14:32:25 <Guest75> What's wrong with this code? https://paste.tomsmeding.com/uJT6WeHZ Why the infinite type?
14:33:11 <ski> .. it might perhaps help to think about an `m + n' sized array, which you want to think of as two slices, one `m' sized, and one `n' sized .. if you've any experience with such manipulation of arrays (cf. binary search (as well as quick sort, and merge sort) on arrays, which, although not exactly the same kind of situation (main difference here (for our purposes) is which's given and which's sought), has a
14:33:17 <ski> certain similarity
14:33:45 <ski> Guest75 : what type does `f' have ?
14:33:59 <ski> (what type does the `fmap' you're implementing have ?)
14:34:00 <Guest75> so by definition, (a -> b) :-)
14:34:07 <ski> and `fa' ?
14:34:24 nilradical joins (~nilradica@user/naso)
14:34:24 <Guest75> fa should match a in (a -> b)
14:34:58 <ski> i dunno what you mean by that ("match .. in ..")
14:35:18 <ski> <ski> (what type does the `fmap' you're implementing have ?)
14:35:22 <Guest75> well. fa has type f a, where f has kind * -> *
14:35:31 <seriously_guest> "(it seems you're mostly stuck on the possiblity of off-by-one errors, the exact dividing criteria to use (and perhaps how to transform the indices appropriately for the chosen subtree))" - Yeah that pretty much sums it up
14:36:56 <ski> seriously_guest : i'd suggest drawing an array with `m + n' elements, indexed from `0' to `m + n - 1', and divide it up into two chunks/slices, of size `m' respectively `n'. then see which indices falls into which chunk, and how to transform the global index (in each of the two cases) into local indices for the individual chunk/slice
14:36:59 × mmhat quits (~mmh@p200300f1c73503bcee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
14:37:02 <Guest75> ski: thanks, it's my bad. fixed now
14:37:23 <ski> (consider a particular value of `m' and `n', for concreteness .. perhaps `m = 5' and `n = 8')
14:37:34 <seriously_guest> ok let me do that
14:37:37 <seriously_guest> ski
14:37:49 <ski> Guest75 : what was the solution ?
14:38:34 <Guest75> instance Functor f => Functor (Wrap f) where
14:38:34 <Guest75>   fmap f (Wrap fa) = Wrap $ fmap f fa
14:38:37 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
14:38:39 <ski> yes
14:38:52 <ski> (i'd avoid the `$' .. but that's a style/taste matter)
14:38:58 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
14:38:59 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
14:39:12 <ski> Guest75 : why was that the solution ?
14:39:37 <Guest75> ski: about $: do you think $ is better with functions than data constructors?
14:40:04 <ski> i mostly try to avoid using `$' altogether, except in a few quite specific situations
14:40:17 <Guest75> ski: 'cause fa has the type f a and f a -> b, and to go from f a to f b we should use fmap
14:40:27 <ski> (the `BlockArguments' extension does help remove several of those .. although i don't always bother to use that)
14:40:49 <ski> yes, Guest75
14:41:13 <ski> you're deferring `Functor (Wrap f)' to `Functor f'. so `fmap' on `Wrap f' needs to defer to `fmap' on `f'
14:42:17 <Guest75> ski: I'm coming with experience of writing a lot of dense one-liners. and I find $ to be bringing a lot of "air" to the code, which I like :-)
14:43:25 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
14:44:23 sameer joins (~sameer@2409:4070:4e83:879b::c049:d90c)
14:45:36 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
14:47:47 <ski> (it's not a recursive call, even though it might look like one .. although if you e.g. defined `newtype Fix1 t a = In1 (t (Fix1 t) a)' or `data Ann1 t a = MkAnn1 a (t (Ann1 f) a)', with `instance Functor (t (Fix1 t)) => Functor (Fix1 t)' (or similarly for `Ann1'), then using `Fix1 Wrap' or `Ann1 Wrap', the `fmap' call in the body of the `fmap' for `Wrap' would effectively *become* a recursive call
14:47:53 <ski> )
14:50:18 <ski> Guest75 : i find that brackets are nothing to be afraid of. (lots of closing brackets in succession, especially on later lines than the corresponding opening brackets, though, may warrant rephrasing to avoid those). i often use `(foo x . bar . baz y z) blah' (rather than `foo x (bar (baz y z blah))', or `foo x . bar . baz y z $ blah', and definitely not using `foo x $ bar $ baz y z $ blah')
14:51:53 <ski> > ((map . map) toLower . words) "Foo can Bar with A Baz"
14:51:55 <lambdabot> ["foo","can","bar","with","a","baz"]
14:52:55 <ski> > (zipWith . zipWith) replicate [[0,1,2],[3,4,5,6]] ["baz","quux"]
14:52:56 <lambdabot> [["","a","zz"],["qqq","uuuu","uuuuu","xxxxxx"]]
14:53:35 <ski> @type map . map
14:53:36 <lambdabot> (a -> b) -> [[a]] -> [[b]]
14:53:37 <ski> @type zipWith . zipWith
14:53:38 <lambdabot> (a -> b -> c) -> [[a]] -> [[b]] -> [[c]]
14:54:14 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
14:54:48 <ski> (otoh, i find `$'s ugly, and very often (especially with beginners, who may've seen others use it, and thinking it's a good idea) completely or mostly unwarranted)
14:54:59 mmhat joins (~mmh@p200300f1c739c92cee086bfffe095315.dip0.t-ipconnect.de)
14:56:16 <Guest75> ski: I like this form: (foo x . bar . baz y z) blah
14:56:23 <ski> (what's the point of writing `return (foo $ x + y)' rather than `return (foo (x + y))', or perhaps `(return . foo) (x + y)' ? .. i can at least understand `return $ ...'/`pure $ ...' can be handy, to gloss over the `return'/`pure', even though i often avoid that as well)
14:57:00 <[Leary]> Guest75: There are a lot of opinions about ($), but the most common and least controversial advice is probably: 1. don't use ($) when a /single/ pair of brackets would suffice, except perhaps when those brackets would span multiple lines; and 2. don't use a sequence of ($); replace them with (.) when possible.
14:57:17 <ski> yes
14:58:17 <ski> i might be somewhat extreme in my (mostly, not completely) avoidance of `$', but those two rules above are good general rules-of-thumb, that i think most more experienced ("sensible") Haskell programmers would agree with (perhaps with some extra caveats, modifications)
14:59:56 <ski> the reason for (2) is that `.' is associative. in `foo x . bar . baz y z' you can both break out the `foo x . bar' part, naming it, or instead the `bar . baz y z' part. `$' is not associative, so it's not just a matter of factoring out / uninlining / folding a subsection of the code there
15:00:10 <ski> often you'll see
15:00:20 <ski> frobnicate x y z = foo x
15:00:30 <ski> . bar
15:00:33 <ski> . baz y z
15:00:42 <ski> or perhaps
15:00:48 <ski> frobnicate x y z t = foo x
15:00:52 <ski> . bar
15:00:55 <ski> . baz y z
15:00:58 <ski> $ t
15:01:24 <ski> especially when you have a long composition chain, where you might want to later insert new transforms, or remove ones, or reorder
15:01:45 <ski> (this is one of the cases where i use `$')
15:03:30 <ski> (e.g. defining `showsPrec', when (rarely needed/desired) making an explicit `Show' instance (if you do that, then usually you should *not* define `show'))
15:04:32 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
15:05:41 <ski> (it used to be that `foo x $ \y -> ..y..' and `foo x $ do ...' was more common (might also occur with `if' or `let') .. but now `BlockArguments' allow you to elide the `$' here. would be handy for `runST', e.g., except that iirc the type checker still specializes `$' to deal with that problem ?)
15:06:21 <ski> (s/or `let'/or `case' or `let'/)
15:07:34 × vglfr quits (~vglfr@145.224.100.100) (Remote host closed the connection)
15:07:49 <Guest75> ski: > perhaps with some extra caveats, modifications
15:07:52 <geekosaur> Ithink the only specialization left in ghc9+ is that ImpredicativeTypes is always on foir it?
15:08:03 <Guest75> I thought there are no caveats in haskell :-)
15:08:07 vglfr joins (~vglfr@145.224.100.100)
15:08:14 <Guest75> (except for everything related to bottom)
15:09:21 <Guest75> sorry. by "caveats" I mean edge cases
15:09:23 <ski> (oh, and definitely don't use `$', when it could just be removed outright, like e.g. `length $ xs'. also note that `((length $ foo xs),n)' is just the same as `(length $ foo xs,n)' and `(length (foo xs),n)')
15:09:56 <ski> Guest75 : lots of caveats for style and taste issues, idioms
15:16:58 × razetime quits (~quassel@117.193.3.152) (Ping timeout: 252 seconds)
15:18:14 × fserucas_ quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Quit: Leaving)
15:23:03 nilradical joins (~nilradica@user/naso)
15:25:38 × Guest75 quits (~Guest75@178.141.177.81) (Ping timeout: 260 seconds)
15:25:47 razetime joins (~quassel@117.193.4.35)
15:28:54 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
15:30:41 sudden joins (~cat@user/sudden)
15:31:14 × nilradical quits (~nilradica@user/naso) (Remote host closed the connection)
15:32:13 nate4 joins (~nate@98.45.169.16)
15:36:04 nilradical joins (~nilradica@user/naso)
15:38:01 polo joins (~polo@user/polo)
15:38:04 × polo quits (~polo@user/polo) (Client Quit)
15:40:22 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
15:40:27 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 248 seconds)
15:43:40 × seriously_guest quits (~seriously@2001:1c06:2715:c200:477d:d99e:8fa:a2d8) (Quit: Client closed)
15:43:49 seriously_guest joins (~seriously@2001:1c06:2715:c200:477d:d99e:8fa:a2d8)
15:45:00 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f) (Ping timeout: 260 seconds)
15:46:01 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5dfc:b079:6d3b:228f)
15:46:03 <ski> newtype LFPF h = LFPF (forall f. Functor f => (h f >---> f) --> f)
15:46:51 <ski> foldT :: Functor f => (h f >---> f) -> (LFPF h >---> f)
15:47:00 polo joins (~polo@user/polo)
15:47:14 <ski> foldT alg (| LFPF k ; a |) = (| k alg ; a |)
15:47:19 <ski> or just
15:47:31 <ski> foldT alg (LFPF k) = k alg
15:47:39 <ski> or even
15:47:49 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
15:47:55 <ski> foldT :: Functor f => (h f -> f) >---> (LFPF h -> f)
15:48:04 <ski> hmm
15:48:55 × polo quits (~polo@user/polo) (Client Quit)
15:49:06 <ski> recT :: (HFunctor h,Functor f) => (h (Product (LFPF h) f) >---> f) -> (LFPF h >---> f)
15:49:29 <ski> recT alg (| lh ; a0 |) = (| f ; a1 |)
15:49:32 <ski> where
15:50:18 <ski> (| Pair _ f ; a1 |) = foldT (\hlhf@(| h , Pair lh _ |) |---> Pair (inLT (| h , lh |)) (alg hlhf)) (| lh ; a0 |)
15:50:24 <ski> or just
15:50:37 <ski> recT alg lh = f
15:50:38 <ski> where
15:51:00 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
15:51:00 <ski> Pair _ f = foldT (\hlhf@(| h , Pair lh _ |) |---> Pair (inLT (| h , lh |)) (alg hlhf)) lh
15:51:06 <ski> or even
15:51:20 <ski> recT :: (HFunctor h,Functor f) => (h (Product (LFPF h) f) -> f) >---> (LFPF h -> f)
15:51:24 <ski> [Leary] ^
15:52:20 xerox joins (~edi@user/edi)
15:53:57 <ski> ( `>--->' is morphism arrow ("Hom-set") .. natural transformation here. `->' is exponential object (function type for `Type',right Kan extension for `Type -> Type'). `-->' is "power" (raising a type in `k' to a type in `Type', giving a type in `k', for `k' a kind. there's also a corresponding "scaling" operation, scaling a `k' by a `Type')
15:54:15 <seriously_guest> hey @ski, I think i've figured it out. Thanks for the analogy with the lake area, that really helped. Another thing i'd like to ask though is whether you believe that for the fast index method to work, the tree needs to match a certain criteria
15:54:16 <ski> (so my `>--->' is basically your `~>')
15:54:54 drewr96 joins (~drewr@user/drewr)
15:54:55 <seriously_guest> I dont think the question is very clear on this, but i think the tree needs to be a complete tree? a complete tree being "A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible"
15:56:17 <seriously_guest> Like with your lake area example, I think that might fall apart if say there were some houses in the left area 1-16 that didnt exist there...
15:56:39 <ski> seriously_guest : fwiw, there's no need (no IRC custom/convention) to prefix/adorn nicknames with sigils like `@' here on IRC. if you want to address, or reference, someone, simply mention their nickname
15:56:43 <ski> (most IRC clients will highlight/alert the user if their nickname is mentioned, *first* thing in a message. not as many will do it, by default at least, if it's not first (e.g. if there's a `@' before it))
15:57:24 <ski> (besides, `@' already means something else on IRC (IRC predates Twitter, and other things using `@' in the way you just did) .. namely channel operator)
15:58:12 <ski> seriously_guest : np
15:58:38 <ski> i don't think it needs to be complete .. just the size information needs to be accurate for each subtree
15:59:32 machinedgod joins (~machinedg@89.164.90.215)
15:59:33 <ski> (so that, by definition, each subtree is completely filled, in the sense of using all the indices that its size indicates. there's no gaps in the overall sequence of infices)
16:01:22 polo joins (~polo@user/polo)
16:02:54 seriously_guest9 joins (~seriously@2001:1c06:2715:c200:7bea:e76a:62a0:5dcf)
16:02:58 × seriously_guest quits (~seriously@2001:1c06:2715:c200:477d:d99e:8fa:a2d8) (Ping timeout: 260 seconds)
16:03:17 <ski> seriously_guest9 : which was the last message which you saw from me on the channel ?
16:03:43 <seriously_guest9> "np"... im going through the history now
16:03:46 <seriously_guest9> let me caatch up
16:03:47 <ski> (the last one i saw from you was "<seriously_guest> Like with your lake area example, I think ..")
16:04:10 <ski> let me PM you the ones you probably missed, then
16:04:15 money is now known as Guest1158
16:04:15 polo is now known as money
16:04:46 drewr96 is now known as drewr
16:05:53 <ski> (seriously_guest9 : check your PM tab/window named "ski" in your IRC client)
16:07:10 × drewr quits (~drewr@user/drewr) (Quit: drewr)
16:09:56 <seriously_guest9> ok im up to date... so according to your defitinion, this tree would be invalid for the purpose of JoinList fast indexing: Append (Size 6) (Append (Size 2) (Single Size 1 'y') (Empty)) (Append (Size 3) (Single (Size 1) 'e') (Single (Size 1) 'a')))
16:10:34 <ski> yes, afaiui
16:11:26 <ski> since the size of `Empty' is `Size 0', but the `Append (Size 2) (Single (Size 1) 'y') Empty)' indicates size `Size 2', rather than the expected `Size 1'
16:12:04 × machinedgod quits (~machinedg@89.164.90.215) (Ping timeout: 260 seconds)
16:12:23 <ski> size (Single (Size 1 'y')) Empty
16:12:30 <ski> er
16:12:50 <ski> size (Single (Size 1 'y')) + size Empty
16:13:04 <ski> = Size 1 + Size 0
16:13:06 <ski> = Size 1
16:13:29 × nilradical quits (~nilradica@user/naso) ()
16:13:50 <ski> so `size (Append (Size 2) (Single (Size 1) 'y') Empty)' ought to be `Size 1', but the cached size is `Size 2', incorrectly
16:14:17 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
16:14:37 × money quits (~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
16:14:45 <ski> (we want `size (Append _ l r) = size l + size r' to hold .. but we'd like to use the cached size, rather than actually recursively computing the size like this, iow `size (Append s _ _) = s')
16:14:52 <seriously_guest9> ok I can agree with that but then we wouldnt be cacheing the size of each subtree but rather the ammount of leaf nodes (Single .. .. ) in each subtree
16:15:38 <ski> yes, "size" would here be defined as the number of `a' elements in a `JoinList m a' .. which in this case is the number of `Single' nodes
16:16:34 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
16:16:45 jtomas joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
16:16:45 <ski> (if we also had stored `a's in internal nodes, it'd not just been counting the leaf nodes .. the important part is that we're counting the elements that we're to index. we're indexing elements, not nodes or leaves really)
16:17:23 <seriously_guest9> roger roger
16:17:41 <seriously_guest9> now it all makes sense, to me
16:17:48 <ski> great :)
16:24:19 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Ping timeout: 260 seconds)
16:24:41 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:33:39 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
16:34:11 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
16:36:46 wootehfoot joins (~wootehfoo@user/wootehfoot)
16:44:10 × perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
16:44:25 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:45:47 <[Leary]> ski: The alternate signatures with the right Kan extension are a little bit interesting. I'm not so sure about the arrow notation though; I've only glimpsed it rarely, so it's hard for me to parse. I'll have another look and make sense of it later. In the meantime, I've made some (mostly trivial) changes to the gist, with a bit extra on the end.
16:50:28 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 252 seconds)
16:52:51 polo joins (~polo@user/polo)
16:55:52 <ski> [Leary] : the difference between `(.. >---> ..) -> (.. >---> ..)' and `(.. -> ..) >---> (.. -> ..)' is the difference between `(forall a. ..a.. -> ..a..) -> (forall a. ..a.. -> ..a..)' and `forall a. ((..a.. -> ..a..) -> (..a..) -> (..a..)))
16:55:57 <ski> er
16:56:58 <ski> [Leary] : the difference between `(.. >---> ..) -> (.. >---> ..)' and `(.. -> ..) >---> (.. -> ..)' is the difference between `(forall a. ..a.. -> ..a..) -> (forall a. ..a.. -> ..a..)' and `forall a. ((..a.. -> ..a..) -> (..a.. -> ..a..))' .. the latter is more powerful, implies the former. but in these cases (`foldT',`recT'), the more powerful version also happens to work
16:57:48 <ski> in e.g.
16:57:50 <ski> foldT :: Functor f => (h f >---> f) -> (LFPF h >---> f)
16:58:01 <ski> foldT alg (| LFPF k ; a |) = (| k alg ; a |)
16:58:16 <ski> the relevant types are
16:58:29 <ski> alg :: h f >---> f
16:58:57 <ski> foldT alg :: LFPF h >---> f
16:59:09 <ski> er
16:59:28 <ski> hm, right
16:59:51 <ski> foldT alg @a :: LFPF h a -> f a
17:00:12 <ski> foldT alg @a (| LFPF k ; a |) :: f a
17:00:25 <ski> (| k alg ; a |) :: f a
17:00:45 <ski> (| LFPF k ; a |) :: LFPF h a
17:01:00 <ski> LFPF k :: LFPF h
17:01:02 <ski> a :: a
17:01:33 <ski> k :: forall f. Functor f => (h f >---> f) --> f
17:01:37 <ski> and since
17:01:47 <ski> Functor f
17:01:54 <ski> k :: (h f >---> f) --> f
17:02:01 <ski> so
17:02:13 <ski> k alg :: f
17:02:19 <ski> so that we get
17:02:24 <ski> (| k alg ; a |) :: f a
17:02:27 <ski> as required
17:06:01 <EvanR> bananas?
17:06:19 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 248 seconds)
17:10:53 <ski> (in the other example, `recT', we have `Pair (inLT (| h , lh |)) (alg hlhf) :: Pair (LFPF h) f', because `hlhf :: h (Pair (LFPF h) f)' and `h :: h',`lh :: LFPF h')
17:13:23 <ski> (oh, just noticed that the `,' in the "composition brackets" here should also be `;'. .. i use `(| t , u |) :: f . g' if `t :: f' and `u :: g'. otoh `(| t ; x |) :: f a' if `t :: f' and `x :: a'. in the `recT' case, we had an input of type `h (LFPF h)' to `inLT', not an input of type `h . LFPF h' .. `h' is not a (plain) functor, but a "functor-functor")
17:13:50 <ski> EvanR : not in the traditional recursion schemes / Squiggol sense
17:14:14 × justsomeguy quits (~justsomeg@user/justsomeguy) (Quit: WeeChat 3.6)
17:15:50 <[Leary]> ski: This too I'll have to postpone any sense-making hereof; I'm done for the day.
17:15:55 <ski> (it just happened to be the case that [Leary]'s example paste <https://gist.github.com/LSLeary/98763e62f6fe4a2d629f74b38b9f2e45> used recursion schemes (including the higher ones, which i commented on here). the notation i'm using doesn't have anything per se to do with recursion schemes (nor Ends), but rather has to do with functors, natural transformations, right (and left) Kan extensions)
17:16:02 ski nods to [Leary]
17:16:27 <ski> perhaps i should showcase a simpler example of the notation ..
17:16:54 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
17:19:26 <ski> well, consider the monad laws
17:20:01 <ski> return <=< ama = ama
17:20:07 <ski> ama = ama <=< return
17:20:35 <ski> (cmd <=< bmc) <=< amb = cmd <=< (bmc <=< amb)
17:20:37 × sameer quits (~sameer@2409:4070:4e83:879b::c049:d90c) (Quit: Quit)
17:20:47 <ski> but here rather in their alternate form
17:21:05 <ski> join . return = id
17:21:10 <ski> join . fmap return = id
17:21:26 <ski> join . join = join . fmap join
17:21:58 <ski> to be more specific, we could annotate them like
17:22:19 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
17:22:22 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
17:22:24 <ski> join @m @a . return @m @a = id @(m a)
17:22:47 <ski> oh, sorry, that should be
17:22:53 <ski> join @m @a . return @m @(m a) = id @(m a)
17:23:30 <ski> join @m @a . fmap @m @a @m (return @m @a) = id @(m a)
17:24:56 Sgeo joins (~Sgeo@user/sgeo)
17:25:41 <ski> join @m @a . join @m @(m a) = join @m @a . fmap @m @(m (m a)) @(m a) (join @m @a)
17:26:22 <ski> in a more CT-notation, this would be
17:26:56 <ski> join_a . return_{m a} = id_{m a}
17:27:34 <ski> join_a . m return_a = id_{m a}
17:28:07 <ski> join_a . join_{m a} = join_a . m join_a
17:28:45 <ski> (eliding the `m' indices to `return' and `join', taking them to be specific to a particular `m', rather than considering them overloaded over all `m's)
17:29:45 <ski> anyway, instead of composing components of the natural transformations here, we could compose the natural transformations themselves (pointwise composition on all components) :
17:29:47 titibandit joins (~titibandi@xdsl-87-79-250-160.nc.de)
17:30:30 × seriously_guest9 quits (~seriously@2001:1c06:2715:c200:7bea:e76a:62a0:5dcf) (Quit: Client closed)
17:30:35 statusfailed joins (~statusfai@statusfailed.com)
17:30:38 <ski> join . return_m = id_m
17:30:47 statusfailed parts (~statusfai@statusfailed.com) ()
17:30:50 <ski> join . m return = id_m
17:31:02 <ski> join . join_m = join . m join
17:33:06 <ski> where `eta_f : g0 . f >---> g1 . f' and `h eta : h . g0 >---> h . g1', given `f : C >---> D',`g0,g1 : D >---> E',`h : E >---> F' and `eta : g0 >---> g1'
17:34:25 <ski> now, what i'm doing is "squinting" and thinking of `g . f' as a product type, and there's a term `(| u , t |)' of this type, provided `t :: f' and `u :: g'
17:34:48 <ski> this gives the form
17:34:54 × sudden quits (~cat@user/sudden) (Ping timeout: 260 seconds)
17:35:29 perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
17:35:32 <ski> join (| return (||) , m |) = m
17:35:47 <ski> m = join (| m , return (||) |)
17:36:22 <ski> join (| join (| m0 , m1 |) , m2 |) = join (| m0 , join (| m1 , m2 |) |)
17:36:36 <ski> (with `m :: m' in the first two, and `m0,m1,m2 :: m' in the last one)
17:36:39 sudden joins (~cat@user/sudden)
17:37:10 <ski> which looks suspiciously like the first form of the monad laws that i mentioned, except now on a "higher level"
17:37:36 econo joins (uid147250@user/econo)
17:37:46 × razetime quits (~quassel@117.193.4.35) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
17:38:38 <ski> (instead of saying that `Hom_{Kleisli m}' is a category (categories are generalizations of monoids, hence the similar form of the laws), we say that `m' is a monoid object in the endofunctor category)
17:39:16 <ski> (of course, you don't have to take a generic monad `m' here. you could state the same laws, for `concat', and `sing = (: [])
17:39:19 <ski> '?
17:39:20 <ski> )
17:39:40 <ski> now, the other example
17:39:45 <ski> @type fold
17:39:46 <lambdabot> (Foldable t, Monoid m) => t m -> m
17:40:07 <ski> we have here also some laws
17:40:56 <ski> fold . return = id -- return = sing
17:41:54 <ski> fold . join = fold . fmap fold
17:42:57 <ski> similarly as before (but now instead using the slightly different notation that `(| t ; x |) :: f a' if `t :: f' and `x :: a'), we get
17:44:17 <ski> fold (| return (||) ; x |) = x
17:44:46 <ski> fold (| join (| t0 , t1 |) ; x |) = fold (| t0 ; fold (| t1 ; x |) |)
17:46:15 <ski> `x' here is (in the first law) a name for the (single) input element of type `a'. in the second, it's a name for the "doubly plural" elements of type `a' inside the two _structure layers_ `t0' and `t1' (of type `t')
17:47:00 <emmanuelux> Hi, I test profiler option with ghc -prof and get lot of missing library
17:47:09 troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua)
17:47:18 <ski> so, this `(| t ; x |)' allows us to talk about the structure/layer `t' separately from the elements `x' inside it. in `[2,3,5,7]', `t' stands for the `[..,..,..,..]' part, and `x' for the `2',`3',`5',`7' part
17:48:10 <ski> and similarly, the `(| u , t |)' notation allows us to talk about two layers `u' and `t', the latter nested inside the former (`t' composed from the right with `u'), without mentioning the elements at all !
17:48:45 <ski> (only makes sense when we're being polymorphic, we have a natural transformation. `fold' isn't an NT (over types. it's an NT over monoids, though ..))
17:49:09 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
17:49:22 <ski> (ok, i guess i'm done)
17:49:24 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
17:49:31 <geekosaur> emmanuelux, how did you install the compiler? if you used OS packages, the prof libs are usually packaged separately
17:50:11 intelligent_boat joins (~intellibo@user/intelligent-boat/x-3514795)
17:50:55 <geekosaur> if you used ghcup, you should have everything for the boot libraries, but may need to reinstall any libraries you installed yourself. at that point you're better off using cabal or stack which will keep track for you and install as needed
17:51:58 kenran joins (~user@user/kenran)
17:54:41 <emmanuelux> geekosaur, ok thx, rm -rf ~/.ghc did the trick
17:56:29 × xerox quits (~edi@user/edi) (Ping timeout: 260 seconds)
17:57:46 xerox joins (~edi@user/edi)
18:00:21 × kenran quits (~user@user/kenran) (Remote host closed the connection)
18:04:10 × jtomas quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 252 seconds)
18:04:55 <ski> [Leary] : changes to the paste makes sense (although i didn't check all the details of the implementations (especially not the CPS cases), neither now or before, mostly checking the signatures)
18:04:58 × polo quits (~polo@user/polo) (Quit: Textual IRC Client: www.textualapp.com)
18:06:17 Guest1158 is now known as money
18:08:11 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
18:12:23 × jonathanx_ quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Remote host closed the connection)
18:12:40 jonathanx_ joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
18:12:53 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
18:16:49 <ski> (hm, i forgot to add that the "algebra" laws (their latter form) for `fold' (`fold' being a `t'-algebra, assuming `t' is a monad) here are intended to look like the laws for a monoid action, acting on a set (or other richer structure). a simpler example is scaling a vector, we expect `1 * v = v' and `x * (y * v) = (x * y) * v', where `x',`y',`1',`x * y' are scalars (say real numbers), and `v' is a vector
18:16:51 jakalx joins (~jakalx@base.jakalx.net)
18:16:55 <ski> (here `*' is in fact a (multiplicative) group action (group being invertible scalars), acting on an (additive) group (vectors can be added, negated, there is a zero), so we also expect `x^-1 * v = (x *)^-1 v' ((multiplicative) group action), and in addition also have `x * 0 = 0',`x * -v = - (x * v)',`x * (u + v) = x * u + x * v' (acting on (additive) group)))
18:20:11 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Ping timeout: 255 seconds)
18:21:13 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 252 seconds)
18:21:46 wootehfoot joins (~wootehfoo@user/wootehfoot)
18:22:02 × perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
18:22:29 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:23:58 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
18:29:20 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:30:54 nate4 joins (~nate@98.45.169.16)
18:33:17 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
18:35:34 × nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
18:36:39 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Max SendQ exceeded)
18:38:54 × mjs2600 quits (~mjs2600@c-24-91-3-49.hsd1.vt.comcast.net) (Quit: ZNC 1.8.2 - https://znc.in)
18:40:29 mjs2600 joins (~mjs2600@c-24-91-3-49.hsd1.vt.comcast.net)
18:41:00 <derpadmin> can someone help me with the signatures of my functions? https://termbin.com/bisj
18:42:01 <derpadmin> I tried a bunch of different values... I was under the impression that the bind operator wanted an "m a" type as an input
18:42:42 <derpadmin> but no matter what I put, the compiler throws me a different error each time
18:42:44 acidjnk joins (~acidjnk@p200300d6e7137a34a83ca8648edd44e3.dip0.t-ipconnect.de)
18:43:18 <geekosaur> :t (*)
18:43:19 <lambdabot> Num a => a -> a -> a
18:43:34 <geekosaur> bind wants `m a`, but (*) doesn't
18:44:36 <geekosaur> (the `Num` doesn't count: it's a constraint, not a type)
18:47:57 <derpadmin> https://termbin.com/h1kz
18:48:13 <derpadmin> I am now down to one error in the compiler with this
18:48:26 <derpadmin> Occurs check: cannot construct the infinite type: a ~ m a
18:48:35 <derpadmin> but I am stuck on this for hours :)
18:48:54 <derpadmin> yes geekosaur, I tried the Num :)
18:48:55 <geekosaur> it's still not going to accept it, because (*) produces an `a`, not an `m a`. so it'll try hard to force an `a` to fit an `m a` and end up with that occurs check
18:49:10 <geekosaur> you can't make those types fit together that way
18:49:25 <derpadmin> aahh
18:49:26 <geekosaur> you use `let` in that case, not bind
18:49:46 <derpadmin> hmm, ok... I was trying to practice bind
18:49:57 <derpadmin> it works with let yes
18:50:27 <derpadmin> ok, so my problem is that my functA produce a a
18:50:39 <derpadmin> and the bind wants an "m a"
18:50:41 <derpadmin> correct?
18:50:45 <geekosaur> so to work with bind you need some `m` which has a `Monad` instance. IO is a good example
18:51:34 <derpadmin> I would make a function like \
18:51:49 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
18:51:53 <geekosaur> so `getline >>= print` works, but `2 + 3 >>= print` doesn't because (+) produces an `a`, not a `m a`
18:52:05 <geekosaur> er, `getLine`
18:52:25 <derpadmin> ok, that explains a lot
18:53:09 <derpadmin> what would be the correct operator if not a bind for this current code to work?
18:53:18 <geekosaur> `print (2 + 3)` works, but `print getLine` doesn't because `getLine` produces `IO String` (`m` ~ IO, `a` ~ String)
18:53:32 <derpadmin> (I tried the "." constructor with no luck either)
18:53:56 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
18:55:45 <geekosaur> you simply can't use bind there. you could lift it into IO with `functA :: Int -> Int -> IO Int; functA a b = pure (a * b)`, then bind can "extract" (not really, it's more like using a callback) the value into `x`. but then `functB` has to change as well to work with bind
18:56:08 <geekosaur> `functB :: Int -> Int -> IO Int; functB a b = pure (a + b)`
18:56:32 <geekosaur> we could also specify this for any `m` with a Monad instance, not just IO
18:56:52 <derpadmin> interresting
18:57:13 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
18:58:09 Guest7545 joins (~Guest75@178.141.177.81)
18:58:23 <derpadmin> any better way to do this without IO? we are dealing with ints...
18:59:00 <derpadmin> I don't mind not using a bind (will keep the example though)
18:59:09 <ski> `(*)' *could* produce an `m a' (assuming `Num (m a)') .. but is there any reason for you to want that, here ?
18:59:31 <ski> derpadmin : *why* are you using monadic bind here ? to practice bind ?
18:59:46 <derpadmin> no reasons whatsoever... just trying to get a grasp of the language
19:00:01 <derpadmin> ski : correct, to practice
19:00:02 <ski> most likely (there are exceptions), you don't want to put `show something' as the last command in a `do'-expression
19:00:23 <derpadmin> return is prefered?
19:00:39 <ski> your `do' doesn't contain any "binds" (`<-' commands), nor any "thens" (commands with neither `<-' nor `let'), just `let' commands
19:00:51 <ski> "preferred" is the wrong way to think about it
19:01:27 <ski> the last thing in a `do' is an expresion of type `m a', for some monad `m' and some type `a' (which becomes the "monadic result type")
19:01:39 <geekosaur> https://play-haskell.tomsmeding.com/saved/R9BC7Jl7
19:01:53 <geekosaur> you'll note I changed several `let`s to `<-`s
19:02:02 <geekosaur> which is what ski is talking about
19:02:03 <ski> you use `return' (or `pure', which is the same thing) there, if you already have a `something' of type `a', since `return' then converts that to the expected type `m a'
19:02:03 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds)
19:02:12 causal joins (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d)
19:02:14 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Ping timeout: 252 seconds)
19:02:36 <ski> but if `something' already had type `m a', you shouldn't use `return', since it's already of the right type. using `return' would give you something of type `m (m a)', which doesn't fit there
19:03:09 <ski> e.g., if you're in the `IO'-monad, and you have a `String', say `str', that you want to give as result, you'd use `return str'
19:04:12 farmfrmjakestate joins (~farmfrmja@user/farmfrmjakestate)
19:04:35 <ski> but if what you have already has type `IO String', e.g. `mapM processChar str' (where `processChar :: Char -> IO Char' is some function you defined, and `str :: String' is some string), then you shouldn't say `return (mapM processChar str)', but just `mapM processChar str', at the end
19:05:18 <ski> basically, either it's right to use `return' there (or `pure', if you prefer), or it's not right (and e.g. right to just skip it, instead)
19:05:25 <derpadmin> ok, type "m a" is usable directly
19:05:46 <ski> it's not a "preferred". use what you want/need, there is no "i prefer to use `return'" or "i prefer to not use `return'"
19:05:54 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 260 seconds)
19:06:12 <derpadmin> got it
19:06:20 <derpadmin> it is the right type or not
19:06:51 × causal quits (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d) (Ping timeout: 248 seconds)
19:06:53 <ski> anyway, if you're going to use `do', i suggest that you (almost always) use a "bind" or "then" command in it, not just `let's .. otherwise, what's the point ?
19:07:55 <ski> @undo do let {var1 = 2}; let {var2 = 5; var3 = 100}; let {bind_result = functA var1 var2 >>= \x -> functB x var3}; show bind_result
19:07:55 <lambdabot> let { var1 = 2} in let { var2 = 5; var3 = 100} in let { bind_result = functA var1 var2 >>= \ x -> functB x var3} in show bind_result
19:08:12 <geekosaur> `do` doesn'[t magically make your code monadic, it is a translation to monadic operations when you have them
19:08:15 <geekosaur> but
19:08:17 <geekosaur> > do 5
19:08:19 <lambdabot> 5
19:08:22 <geekosaur> :t do 5
19:08:23 <lambdabot> Num p => p
19:08:24 <ski> there is no point in using `do' here, since the desugaring of `do' doesn't introduce any `>>=' (bind) or `>>' (then)
19:08:33 <geekosaur> no monad, because we did nothing monadic
19:09:28 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
19:09:34 <ski> (for stylistic reasons, one might use `do foo' with a single expression `foo', in one defining equation, or one `case' branch, if all the others are using it as well .. but that's about the only reason i can come up with, where it'd not look weird to use `do' without it expanding to at least one `>>=' or `>>')
19:10:28 <ski> (hm, i guess maybe using `BlockArguments' to avoid some brackets might also be a reason .. but that sounds more weird, to me)
19:10:41 gmg joins (~user@user/gehmehgeh)
19:13:24 thblt joins (~thblt@user/thblt)
19:13:34 thblt parts (~thblt@user/thblt) (ERC 5.4.1 (IRC client for GNU Emacs 29.0.50))
19:13:36 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
19:14:45 <ski> derpadmin : anyway, as long as the type of `functB' isn't `.. -> .. -> M (..)' for some monad `M', it doesn't really make sense to say `functA var1 var2 >>= \x -> functB x var3' (and ditto for `functA')
19:15:22 <ski> (more specifically, it'll be a type error .. checking the type of `(>>=)' is the way to confirm this)
19:18:09 <ski> derpadmin : generally, don't use `do' just "whenever you feel like it". use it (a) when you have a monad that you want to use; and (b) when you actually want to *sequence* some monadic commands (more than one) after one another (`let' inside `do' isn't a proper monadic command (it fits the form, but not the spirit, it doesn't "do" anything, wrt the monad. it's just a convenience, to be able to mix monadic
19:18:15 <ski> bindings and effects, with ordinary non-monadic ones))
19:18:44 <derpadmin> so for dealing with Int, what would be the best way to send the output of a function into another one?
19:18:59 <ski> ordinary function call ?
19:19:06 <derpadmin> ok
19:19:16 <ski> functB (functA var1 var2) var3
19:19:20 <derpadmin> I made a gas factory, :)
19:19:30 <ski> or, you could name the result of the inner call, if you prefer
19:20:14 <ski> `>>=' and `>>' are for sequencing (monadic) *effects* .. if you don't have any (non-trivial) effects to sequence, there's no point to in using those (or `do')
19:20:53 causal joins (~user@50.35.83.177)
19:21:08 <ski> (hint, `return foo'/`pure foo' is also a trivial effect, doesn't actually *do* anything, apart from presenting `foo' back as "monadic result" of executing/performing/doing the action)
19:23:07 Guest2974 joins (~Guest29@p200300ef97252e755f43b6787fa94571.dip0.t-ipconnect.de)
19:23:56 Guest2974 parts (~Guest29@p200300ef97252e755f43b6787fa94571.dip0.t-ipconnect.de) ()
19:23:57 <ski> `return'/`pure' isn't very useful on its own, just like `0' isn't very useful on its own (when summing). however, they can be useful, in particular *contexts* .. e.g. rewriting an equation to a standard form, with `0' on one side. or using `return' in some branch(es) that's not supposed to do anything, while using `>>='/`>>' in the other branch(es)
19:25:25 Sgeo_ joins (~Sgeo@user/sgeo)
19:25:36 <ski> do stop <- checkStop; if stop then return result else do x <- somethingMore; loopAround x -- is a useful use of `return'
19:28:39 × Sgeo quits (~Sgeo@user/sgeo) (Ping timeout: 260 seconds)
19:30:15 wootehfoot joins (~wootehfoo@user/wootehfoot)
19:33:32 <derpadmin> https://termbin.com/rkcy
19:34:04 <ski> you could also use `where', in place of `let'-`in'
19:34:05 × Chai-T-Rex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 255 seconds)
19:34:10 <derpadmin> thanks ski... I always learn better when I tried to to something wrong for multiples hours... this is just how my brain is wired
19:34:40 <derpadmin> I will remember some stuff from it now for sure
19:34:50 <derpadmin> and I will try the when syntax...
19:35:17 <c_wraith> when is just a function. No special syntax required.
19:35:19 Chai-T-Rex joins (~ChaiTRex@user/chaitrex)
19:35:29 <monochrom> They mean "where".
19:35:35 <c_wraith> oh. ok then
19:35:38 <ski> (neither is "better" .. sometimes you prefer one, sometimes you prefer the other. also `let'-`in' is an expression, but `where' attaches to defining equations (and to `case'-`of' branches), so sometimes you don't have a choice of which to use, since you can only use one (`let'-`in'), unless you artificially introduce a `case' (like `case () of () -> ... where ...'))
19:36:12 ski . o O ( "Post-it note : Remember to do things wrong, for the sake of learning better !" )
19:37:39 <ski> derpadmin : and there's no need to use brackets with that call to `print', `print nestfuncts' works just fine
19:39:46 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
19:40:22 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 252 seconds)
19:53:05 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
19:53:09 × intelligent_boat quits (~intellibo@user/intelligent-boat/x-3514795) (Ping timeout: 260 seconds)
19:53:24 intelligent_boat joins (~intellibo@user/intelligent-boat/x-3514795)
19:53:41 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
19:57:14 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
19:57:32 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
19:59:45 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
19:59:52 sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
20:00:41 abhiroop_ joins (~abhiroop@217-209-157-8-no2000.tbcn.telia.com)
20:00:53 azimut joins (~azimut@gateway/tor-sasl/azimut)
20:01:19 × xerox quits (~edi@user/edi) (Ping timeout: 260 seconds)
20:01:52 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 252 seconds)
20:03:10 xerox joins (~edi@user/edi)
20:03:15 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
20:03:26 wootehfoot joins (~wootehfoo@user/wootehfoot)
20:14:43 <yin> what's an example of a situation where you can't replace a let in expression for a where clause?
20:17:37 <__monty__> The body of a lambda.
20:18:12 <c_wraith> inside a do block often. (technically that's the body of a lambda too, but it doesn't look like one)
20:18:18 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
20:22:46 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 252 seconds)
20:23:11 <ski> inside a list comprehension
20:23:19 zeenk joins (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494)
20:24:48 × mestre quits (~mestre@191.177.185.178) (Quit: Lost terminal)
20:27:43 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
20:28:30 × abhiroop_ quits (~abhiroop@217-209-157-8-no2000.tbcn.telia.com) (Ping timeout: 260 seconds)
20:30:12 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
20:31:01 × mmhat quits (~mmh@p200300f1c739c92cee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
20:32:28 <yin> ok so you can always get around it
20:33:17 <c_wraith> not with the same semantics
20:33:28 <mrianbloom> Is it possible to define implicit parameters with existential types such as f :: (?below :: forall i . a i -> p) => g i -> p ?
20:33:33 <yin> i ask because i avoid using let expressions as a stylistic choice and have never come across a situation where it would be impossible to avoid
20:35:23 × Guest7545 quits (~Guest75@178.141.177.81) (Ping timeout: 260 seconds)
20:36:11 <ski> mrianbloom : how's that existential ?
20:36:23 <ski> (it says `forall', not `exists')
20:36:48 <mrianbloom> Oh sorry. I need to improve my nomenclature.
20:37:30 <ski> (and those two `i's are different variables)
20:38:00 <mrianbloom> Basically the implicit function needs to work for all index types i.
20:38:17 <ski> yin : you can parameterize by the relevant non-locals, sure
20:38:25 <mrianbloom> You could write the example as: f :: (?below :: forall i . a i -> p) => g -> p
20:39:13 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
20:39:20 <ski> (or work-around by artificially introducing a defining equation (with `let') or a branch (`case'-`of'), that you can attach a `where' to .. but i assume this doesn't count for your purposes)
20:39:46 <mrianbloom> I'm trying to get the compdata-automata library to work with GADTs and he uses implicit parameters, and I'm checking if those have to be removed.
20:40:17 <ski> mrianbloom : well, hm. maybe i'm seeing what you're asking about (?) .. `?below :: forall i. a i -> p' itself is equivalent to `?below :: (exists i. a i) -> p' .. is this what you mean ?
20:41:20 <mrianbloom> I'm not familiar with that.
20:41:21 <ski> .. if so, you're asking about rank-2 possibly applying to implicit parameters, and not just ordinary parameters. (iow, "can i have a polymorphic / universal (not existential) implicit parameter ?")
20:41:35 <ski> not familiar with which ?
20:41:45 <ski> my use of `exists' ?
20:41:52 <mrianbloom> With 9exists i . a i)
20:42:01 <mrianbloom> Yes
20:42:06 ski idly wonders if it's that time again
20:42:58 <ski> so, if you want to, i could walk you through some stuff that i consider relevant to this topic, to have a well-rounded understanding of these things
20:43:02 <mrianbloom> It does appear to be possible to take the implicit parameters out. It just makes his api much uglier.
20:43:18 pavonia joins (~user@user/siracusa)
20:43:55 <ski> it would take some amount of time, though. probably at least half an hour, possibly more, depending (on how fast you can go, how much elaboration you need, how much related things you'd be interested in hearing about)
20:43:55 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 248 seconds)
20:44:29 <ski> for your particular question, about implicit parameters (whether they can be polymorphic) : i don't know the answer to this
20:44:44 mmhat joins (~mmh@p200300f1c739c9cbee086bfffe095315.dip0.t-ipconnect.de)
20:46:18 <ski> (basically, i'm talking about explaining the basics of existentials, at least (together with the notation i use to discuss that). and possibly also to talk a bit about polymorphism, and higher-rank stuff, since that's relevant to the picture)
20:46:38 <geekosaur> @where+ cis194 https://github.com/byorgey/haskell-course
20:46:39 <lambdabot> I will remember.
20:46:59 <ski> oh, it moved
20:47:18 abhiroop_ joins (~abhiroop@217-209-157-8-no2000.tbcn.telia.com)
20:47:59 <geekosaur> yes, byorgey just commented on it on -cafe
20:48:13 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
20:48:38 <geekosaur> (he can't update the upenn one)
20:48:40 <byorgey> it's not so much that it moved, it's just that I no longer have access to the version hosted at UPenn. It will slowly bitrot and might be taken down at any point.
20:48:52 <ski> okay
20:49:05 <ski> so, this is the latest year version ?
20:49:22 <geekosaur> yeh, that's why I submitted my lambdabot help file upstream instead of pointing people to my old account at C-MU
20:49:38 <geekosaur> no idea how long that'll continue to exist
20:49:44 <byorgey> the github repo linked above just has my materials, i.e. 'spring 13 cis194'
20:50:25 <byorgey> the downside of linking people to the github repo is that it is just source, it doesn't have any PDFs or nicely rendered markdown or anything like that
20:50:29 unlucy joins (sid572875@id-572875.tinside.irccloud.com)
20:52:08 <byorgey> It might be nice if someone wanted to set up a site hosting a nicely typeset/built version of whatever is in the github repo. I don't really have the time or inclination to do that myself.
20:52:23 <byorgey> but then we could point people at a nicely up-to-date version.
20:52:32 <ski> (fwiw, the <mailto:haskell-cafe@haskell.org> archived message is at <https://mail.haskell.org/pipermail/haskell-cafe/2022-November/135664.html>)
20:53:33 <geekosaur> someone could submit it to you as a site to be rendered on github.io, conceivably
20:54:10 × zeenk quits (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
20:54:27 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
20:55:49 johnw joins (~johnw@76-234-69-149.lightspeed.frokca.sbcglobal.net)
20:58:59 <ski> mrianbloom : would you like to use implicits, but don't know if you can (because of wanting to use some polymorphic ones) ? or would you prefer not to use them ?
20:59:12 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
20:59:14 <byorgey> sure, although I don't know how easy it is to have github.io sites automatically compile .tex documents to PDF
20:59:54 <geekosaur> if you can install tex from an OS distro (iirc it uses ubuntu lts by default for GHA) then you can run it in an action
21:00:27 <geekosaur> and have that deploy to the github.io site
21:01:24 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
21:01:32 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
21:03:59 <byorgey> ah, cool, makes sense
21:05:41 <geekosaur> we don't use tex but our xmonad-web repo deploys nightly haddock updates from git xmonad to https://xmonad.github.io/xmonad-docs
21:05:59 <cheater> using hedgehog, if i have a list of possible values, how do i create a random list of its elements, with repeats, of length between 1 and n?
21:06:03 <geekosaur> it used hakyll for a while but that wasn't packaged and building it in the action was a pain
21:06:30 <geekosaur> (iirc 40 minutes to build because of all the deps)
21:08:58 <ski> mrianbloom : ok, so i just tested, and it seems GHC simply doesn't allow `forall's after the `::' in the signature for implicits .. you could still use `PolymorphicComponents' (or `Rank2Types',`RankNTypes',`ImpredicativeTypes',`GADTs') to get around this, packing the polymorphic operation into a `data' type (or use `ExistentialQuantification' (or `GADTs'), to pack the argument of the implicit into a `data')
21:10:04 <geekosaur> not that surprised since it has to fit into a dictionary
21:10:25 <geekosaur> implicits are a bit of a hack
21:10:32 <mrianbloom> ski: I see. So I'd need to pack all of the implicit functions into a datatype and then unpack it where they are used.
21:11:05 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 260 seconds)
21:12:09 <mrianbloom> That seems reasonable. I've tried to get some feedback from professor Bahr but so far no response. If anybody knows him, I forked compdata-automata on github.
21:15:47 × sympt7 quits (~sympt@user/sympt) (Ping timeout: 246 seconds)
21:15:52 <ski> mrianbloom : oh, turns out that if you add brackets, then it "works" .. `?below :: (forall i. a i -> p)' is accepted, if you turn on `ImpredicativeTypes' .. but if you actually try to use (or locally define) that implicit parameter, that still doesn't work (for reasons i'm not sure, didn't stare at it too much yet. but quite possibly due to `ImpredicativeTypes' not being fully baked yet, at least not in this
21:15:58 <ski> version i tested on (pre-9))
21:16:09 × farmfrmjakestate quits (~farmfrmja@user/farmfrmjakestate) (Quit: Textual IRC Client: www.textualapp.com)
21:17:10 <ski> (when was the new approach to impredicative types introduced into GHC ?)
21:17:11 <mrianbloom> I see. I am also working in pre-9 ghc. Though another guy from my team has compdata compiling on 9.
21:17:52 ski hasn't been paying attention to that, too mcuh
21:18:33 <mrianbloom> Right, we don't really "need" the new features so we haven't changed over.
21:18:40 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 260 seconds)
21:18:54 <ski> still not sure if you actually want the implicits, or would prefer to not use them
21:19:27 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
21:19:29 × libertyprime quits (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz) (Ping timeout: 260 seconds)
21:19:57 <mrianbloom> I almost have it compiling without them.
21:20:23 ph88 joins (~ph88@2a02:8109:9e00:71d0:5eeb:df0e:8181:78db)
21:21:31 wootehfoot joins (~wootehfoo@user/wootehfoot)
21:21:31 <mrianbloom> Definitely makes the api more cluttered since you have to pass in those functions everywhere.
21:22:03 <ski> (perhaps implicits are supposed to interact well with higher-rank, and it's just that noone thought too much about the interaction, and so didn't notice breakage. or perhaps there is some issue. .. for some reason, i get type mismatches claiming to arise from functional dependencies between constraints .. i'm not sure how relevant that is to the interaction)
21:22:23 <ski> ok, mrianbloom
21:22:24 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Client Quit)
21:22:31 <ski> (meaning you'd prefer to be able to use implicits)
21:22:47 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
21:22:51 × titibandit quits (~titibandi@xdsl-87-79-250-160.nc.de) (Ping timeout: 248 seconds)
21:22:59 <mrianbloom> I think we are sort of in a "make it work mode"
21:23:45 <ski> yea, surely you'd be able to make it work with explicits .. it's just sometimes annoying, or too much ceremony
21:24:28 <ski> (or `PolymorphicComponents' or `ExistentialQuantification' would probably also work okay, although somewhat annoying)
21:24:46 <mrianbloom> It's pretty beautiful with them in.
21:24:54 <ski> (which you'd use would depend on how you're using `?below')
21:25:09 <mrianbloom> I can check out polymorphic components.
21:25:36 <ski> (and how you're defining the implicits)
21:28:55 <ski> (btw, iirc, `PolymorphicComponents' (and `Rank2Types') is (/ are) nowadays an alias for `RankNTypes' .. i'm just saying the first, for sake of precision)
21:28:59 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
21:29:11 <mrianbloom> Got it.
21:31:23 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
21:31:25 <ski> @type let ?f = \x -> x in ?f ()
21:31:26 <lambdabot> ()
21:31:27 <ski> @type let ?f x = x in ?f ()
21:31:28 <lambdabot> error: Expression syntax in pattern: ?f
21:31:56 <ski> (that's one part which may be annoying)
21:33:39 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
21:36:22 jakalx joins (~jakalx@base.jakalx.net)
21:36:57 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Read error: Connection reset by peer)
21:37:02 <ski> @type let f ?x = ?x in f ()
21:37:03 <lambdabot> error: Expression syntax in pattern: ?x
21:37:06 <ski> hmpf
21:38:09 <hpc> % :t let f ?x = ?x in f ()
21:38:09 <yahb2> <interactive>:1:12: error: parse error on input ‘?’
21:38:21 <ski> @type let Just ?x = Just () in ?x
21:38:22 <lambdabot> error: Expression syntax in pattern: ?x
21:38:24 <ski> @type let (?x,_) = ((),()) in ?x
21:38:25 <lambdabot> error: Expression syntax in pattern: ?x
21:38:39 <hpc> % :set -X ImplicitParameters
21:38:39 <yahb2> Some flags have not been recognized: -X, ImplicitParameters
21:38:48 <hpc> % :set -XImplicitParameters
21:38:48 <yahb2> Some flags have not been recognized: -XImplicitParameters
21:39:10 <hpc> % :set -XImplicitParams
21:39:10 <yahb2> <no output>
21:39:13 <hpc> % :t let f ?x = ?x in f ()
21:39:13 <yahb2> <interactive>:1:7: error: Expression syntax in pattern: ?x
21:39:32 <hpc> % :t let f = ?x in f ()
21:39:33 <yahb2> let f = ?x in f () :: (?x::() -> t) => t
21:40:04 <mrianbloom> ski: I seem to have it working with explicit parameters. Seems the library is pretty usable https://github.com/ianmbloom/compdata-automata
21:40:14 <ski> nice :)
21:41:39 × abhiroop_ quits (~abhiroop@217-209-157-8-no2000.tbcn.telia.com) (Ping timeout: 260 seconds)
21:42:18 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
21:43:22 ski was hoping to try some bananas use of implicits, in patterns, but seeing as how even a basic `f ?x = ...' doesn't work ..
21:43:49 <mrianbloom> Seems implicits are a fairly immature feature.
21:44:09 <ski> hm
21:44:15 <ski> @type let ?f :: () -> (); ?f = \x -> x in ?f ()
21:44:16 <lambdabot> error:
21:44:16 <lambdabot> Invalid type signature: ?f :: ...
21:44:16 <lambdabot> Should be of form <variable> :: <type>
21:44:32 × michalz quits (~michalz@185.246.207.221) (Remote host closed the connection)
21:44:32 <ski> even signatures doesn't work, at a definition site
21:44:46 <ski> mrianbloom : well .. they'ren't used *that* often
21:45:22 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
21:45:31 <mrianbloom> I had never seen them before a few weeks ago and I've been haskelling for 14+ years :)
21:45:32 <ski> @type let f = \ ?x -> ?x in f ()
21:45:33 <lambdabot> error: Expression syntax in pattern: ?x
21:46:22 <ski> at one point, we even had linear implicit parameters .. now those could be had some fun with :P
21:46:43 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
21:49:05 <ski> (not exactly in the sense of `LinearHaskell', more like implicitly "splittable" implicit parameters. it's automatically apply `split :: Split s => s -> (s,s)' to them, when you used them more than once .. main use case was to distribute random bit generator states down into a computation, without having to lift a finger .. however, it turned out that the exact placement of the implicitly introduced `split'
21:49:12 <ski> could change the semantics of the code, depending on where it was placed. and even simple refactorings that one'd expect to be equivalent could trigger the placement being different .. so, i presume because of this, they eventually got removed)
21:50:07 <mrianbloom> I see. We tried to use linear types at one point.
21:50:32 <mrianbloom> I think if they are integrated into the normal prelude we would try again.
21:51:20 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds)
21:51:31 <geekosaur> I will be surprised if that happens, since suddenly HOFs that "just worked" need an annotation
21:51:49 <mrianbloom> I see.
21:51:53 <ski> nonetheless, "Fun with Linear Implicit Parameters" (in The Monad Reader, issue 2) by TheHunter (aka Thomas Jäger) in 2005-05 at <https://wiki.haskell.org/The_Monad.Reader/Issue2/FunWithLinearImplicitParameters> shows one novel application of them (also employing `unsafePerformIO' and exceptions .. you've been warned)
21:52:59 <ski> mrianbloom : these were *way* long before linear types
21:53:06 <geekosaur> (you can't simply pass a %1-> function to something expecting a -> function, you need to promote it. ran into that the other day, forget details)
21:53:25 <ski> (and mostly unrelated. perhaps some slight relation to affine types, i suppose)
21:53:37 <mrianbloom> It's too bad, linear types would be incredibly useful for preventing space leaks, it just breaks too much stuff.
21:54:09 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
21:54:10 <geekosaur> https://hackage.haskell.org/package/linear-base-0.3.0/docs/Prelude-Linear.html#v:forget
21:55:02 <geekosaur> so if you just mark the "obvious" stuff as linear it'll break stuff unexpectedly
21:55:17 <ski> break, when ?
21:55:32 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
21:56:16 <geekosaur> if you have a function that Prelude marked as linear and use it in e.g. map, you have to `forget` its linear type
21:56:34 <geekosaur> because a ONE arrow won't match a MANY HOF parameter
21:56:45 <ski> you mean when transitioning to `linear-base' ?
21:57:05 <geekosaur> mrianbloom was suggesting that this would eventually migrate into the standard Prelude
21:57:05 <ski> or when something gets changed in `linear-base' ? or `base' (when using `LinearHaskell') ?
21:57:17 <geekosaur> I'm saying that's unlikely because of things like this
21:57:26 takuan joins (~takuan@178-116-218-225.access.telenet.be)
21:57:37 <geekosaur> so suddenly you need to care about linearity even in code that doesn't care otherwise
21:57:45 <ski> ah, non-linear usage of linear-enhanced/aware operations
21:57:57 × biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer)
21:58:44 <geekosaur> in linear-base this is a sunk cost, I suspect bring it back into base would be bad news though
21:58:50 <tomsmeding> % :set -XLinearTypes
21:58:50 <yahb2> <no output>
21:58:50 <geekosaur> *bringing
21:58:59 <tomsmeding> % :t map ((\x -> x) :: a %1 -> a)
21:58:59 <yahb2> <interactive>:1:6: error: ; • Couldn't match type ‘'One’ with ‘'Many’ ; Expected: b -> b ; Actual: b %1 -> b ; • In the first argument of ‘map’, namely ; ‘((\ x -> x) ...
21:59:13 <tomsmeding> sad
21:59:14 <geekosaur> right, that's the case `forget` is for
21:59:23 <ski> yea, contravariance is a reason for why we often can't have what we'd like ..
22:00:25 <ski> ah, `forget' is dereliction
22:01:23 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
22:01:53 <ski> (in linear logic terminology. dereliction allows you to treat a non-linear / unbounded hypothesis, as if it were linear (this is also what to point at, to explain that linearity is not uniqueness, that you can have a linear reference that still might not be unique, since it might've been duplicated/copied before dereliction was applied))
22:02:29 × hueso quits (~root@user/hueso) (Read error: Connection reset by peer)
22:02:38 biberu joins (~biberu@user/biberu)
22:03:38 hueso joins (~root@user/hueso)
22:04:40 kaskal- is now known as kaskal
22:07:19 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
22:10:51 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
22:13:27 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
22:14:03 × mixfix41 quits (~sdeny9ee@user/mixfix41) (Ping timeout: 248 seconds)
22:14:46 × jinsun quits (~jinsun@user/jinsun) (Read error: Connection reset by peer)
22:15:57 <yin> i just installed hls and started using it with neovim's native lsp. i'm having trouble finding where are all its functions documented
22:16:41 × epolanski quits (uid312403@id-312403.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
22:17:01 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
22:17:28 jinsun joins (~jinsun@user/jinsun)
22:18:02 <hyiltiz> tomsmeding: 3 academic papers YTD! Congrats!
22:18:46 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
22:18:58 <tomsmeding> hyiltiz: :D
22:19:04 <tomsmeding> (not sure what YTD means)
22:20:03 sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
22:21:19 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
22:21:45 <yin> "you tripping dawg" according to urban dictionary
22:22:16 <yin> usually used by legit and people qith swag
22:22:23 <hyiltiz> year to date? Is it not commonly used outside financial settings?
22:22:31 nate4 joins (~nate@98.45.169.16)
22:22:53 <hyiltiz> but ye trippin' dawg seems a better expansion
22:23:08 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
22:23:31 <yin> first time i've heard of it
22:24:05 <yin> hyiltiz: :D i thought so too
22:26:27 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
22:28:15 <hyiltiz> tomsmeding: dual-number reverse automatic-differential sounds cool and dandy, and reading abstract and diagrams, I kinda can imagine what it is trying to solve
22:28:30 <hyiltiz> got a bite sized elevator pitch?
22:29:24 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
22:30:08 <tomsmeding> hyiltiz: it's a programming-language theory perspective on reverse-mode automatic differentiation; we show how to optimise a very elegant and easily-proved-correct algorithm (but super slow, exponential complexity) to one that has the right complexity (constant overhead over the original program) using nice semantics-preserving optimisations
22:30:24 perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
22:30:34 <tomsmeding> TIL about YTD :)
22:31:14 × freeside quits (~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
22:31:24 <tomsmeding> hyiltiz: it doesn't claim to present a revolution in AD, but rather explains a perspective from which some of the stuff that goes on can be understood
22:31:33 <tomsmeding> under the assumption that we all like purely-functional things
22:32:30 <hyiltiz> by "right complexity", your proposal still has "exponential + constant" complexity, but is generalized tangents to functions?
22:36:11 caryhartline joins (~caryhartl@2600:1700:2d0:8d30:6cc5:fd4d:6712:aa2c)
22:42:49 × perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
22:45:18 pavonia_ joins (~user@user/siracusa)
22:46:37 <tomsmeding> hyiltiz: if you want to compute the gradient of a function that takes T time and M memory, you can do no better in the worst case than O(T) time and O(M+T) memory
22:46:59 × pavonia quits (~user@user/siracusa) (Ping timeout: 260 seconds)
22:47:12 pavonia_ is now known as pavonia
22:47:14 <tomsmeding> the final algorithm in that paper attains that worst case, and attains it always -- it's like mergesort, worst case is n log n, so let's be n log n always
22:47:23 perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
22:47:29 <tomsmeding> the initial algorithm gets O(2^T) time
22:47:33 <tomsmeding> which is kinda awful lol
22:47:55 <tomsmeding> (worst case -- it does better sometimes)
22:48:38 <tomsmeding> example where it gets that worst case is in the Key Ideas section
22:49:28 <tomsmeding> (let x1 = f(x,y) ; x2 = f(x1,x1) ; x3 = f(x2,x2) ; x4 = f(x3,x3) ; ... ; xn = f(x{n-1}, x{n-1}) in xn)
22:52:29 <tomsmeding> hyiltiz: ah, I missed the key contribution of the paper: the initial and final algorithms were known, but their relation was not
22:58:32 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
22:59:21 freeside joins (~mengwong@bb115-66-48-84.singnet.com.sg)
22:59:34 zeenk joins (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494)
23:02:44 × ec_ quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
23:02:50 mixfix41 joins (~sdeny9ee@user/mixfix41)
23:03:18 ec_ joins (~ec@gateway/tor-sasl/ec)
23:03:22 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
23:04:59 × perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
23:08:05 × acidjnk quits (~acidjnk@p200300d6e7137a34a83ca8648edd44e3.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
23:15:55 <Axman6> anyone know which parser combinator libraries have IsString instalces for their parsers?
23:16:21 × ec_ quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
23:16:44 ec_ joins (~ec@gateway/tor-sasl/ec)
23:17:11 <tomsmeding> (can't you write an orphan instance for any lib?)
23:17:40 perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
23:18:12 × mcglk quits (~mcglk@131.191.49.120) (Read error: Connection reset by peer)
23:19:39 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 248 seconds)
23:20:31 mcglk joins (~mcglk@131.191.49.120)
23:26:45 <jackdk> nooooooooo
23:27:37 × perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
23:28:07 × gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
23:31:28 <hyiltiz> tomsmeding: I see, thanks for the brief intro; now I think I can take a peek and attempt to understand
23:32:03 × thyriaen quits (~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1) (Remote host closed the connection)
23:37:40 × zeenk quits (~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
23:38:19 × libertyprime quits (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz) (Ping timeout: 248 seconds)
23:39:28 elevenkb joins (~elevenkb@105.184.125.168)
23:46:01 libertyprime joins (~libertypr@118-92-78-165.dsl.dyn.ihug.co.nz)
23:46:16 × elevenkb quits (~elevenkb@105.184.125.168) (Remote host closed the connection)
23:50:19 × ph88 quits (~ph88@2a02:8109:9e00:71d0:5eeb:df0e:8181:78db) (Quit: Leaving)
23:51:36 × simpleauthority quits (~simpleaut@user/simpleauthority) (Quit: ZNC 1.8.2 - https://znc.in)
23:52:07 simpleauthority joins (~simpleaut@user/simpleauthority)
23:54:59 × chomwitt quits (~chomwitt@2a02:587:7a0a:c00:1ac0:4dff:fedb:a3f1) (Ping timeout: 255 seconds)
23:55:34 perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
23:58:35 × Tuplanolla quits (~Tuplanoll@91-159-69-11.elisa-laajakaista.fi) (Ping timeout: 248 seconds)
23:58:47 × justache quits (~justache@user/justache) (Quit: ZNC 1.8.2 - https://znc.in)

All times are in UTC on 2022-11-06.