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.