2022-05-08 00:00:42 +0200 | Topsi1 | (~Topsi@dyndsl-095-033-088-174.ewe-ip-backbone.de) |
2022-05-08 00:00:50 +0200 | coot | (~coot@213.134.190.95) (Quit: coot) |
2022-05-08 00:02:51 +0200 | abiss27 | (~abiss27@user/abiss) (Remote host closed the connection) |
2022-05-08 00:03:17 +0200 | kenran | (~kenran@200116b82b033700e957299332b778d2.dip.versatel-1u1.de) (Quit: WeeChat info:version) |
2022-05-08 00:03:19 +0200 | Topsi | (~Topsi@dyndsl-095-033-088-174.ewe-ip-backbone.de) (Ping timeout: 256 seconds) |
2022-05-08 00:08:58 +0200 | kimjetwav | (~user@2607:fea8:2362:b400:897f:4fc4:a1cd:a588) |
2022-05-08 00:09:32 +0200 | CiaoSen | (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Quit: CiaoSen) |
2022-05-08 00:10:30 +0200 | unit73e | (~emanuel@2001:818:e8dd:7c00:32b5:c2ff:fe6b:5291) |
2022-05-08 00:11:41 +0200 | ub | (~Thunderbi@p548c8d44.dip0.t-ipconnect.de) |
2022-05-08 00:11:41 +0200 | ubert | (~Thunderbi@p200300ecdf158805d084dc17279015c6.dip0.t-ipconnect.de) (Remote host closed the connection) |
2022-05-08 00:11:41 +0200 | ub | ubert |
2022-05-08 00:17:34 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 00:19:09 +0200 | __monty__ | (~toonn@user/toonn) (Quit: leaving) |
2022-05-08 00:22:24 +0200 | gehmehgeh | (~user@user/gehmehgeh) (Quit: Leaving) |
2022-05-08 00:23:21 +0200 | shailangsa_ | (~shailangs@host86-186-127-233.range86-186.btcentralplus.com) (Remote host closed the connection) |
2022-05-08 00:24:31 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Remote host closed the connection) |
2022-05-08 00:25:49 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 00:26:16 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) |
2022-05-08 00:40:19 +0200 | <seydar> | great news: built the blurhash decode and it appears to work perfectly! generated png is different from the C version and is literally half the size... but I assume that's because of the image libraries used |
2022-05-08 00:41:13 +0200 | jinsun__ | (~jinsun@user/jinsun) (Read error: Connection reset by peer) |
2022-05-08 00:41:54 +0200 | jinsun | (~jinsun@user/jinsun) |
2022-05-08 00:47:56 +0200 | seydar | (~seydar@154-27-113-252.starry-inc.net) (Quit: leaving) |
2022-05-08 00:49:19 +0200 | fendor_ | (~fendor@77.119.200.1.wireless.dyn.drei.com) |
2022-05-08 00:52:09 +0200 | fendor | (~fendor@178.165.198.115.wireless.dyn.drei.com) (Ping timeout: 256 seconds) |
2022-05-08 00:59:50 +0200 | zebrag | (~chris@user/zebrag) |
2022-05-08 01:01:00 +0200 | abiss27 | (~abiss27@user/abiss) |
2022-05-08 01:01:44 +0200 | <sm> | \o/ |
2022-05-08 01:01:48 +0200 | stackdroid18 | (~stackdroi@user/stackdroid) |
2022-05-08 01:01:59 +0200 | jgeerds | (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 240 seconds) |
2022-05-08 01:02:30 +0200 | Tuplanolla | (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi) (Quit: Leaving.) |
2022-05-08 01:04:48 +0200 | shailangsa | (~shailangs@host86-186-127-233.range86-186.btcentralplus.com) |
2022-05-08 01:26:42 +0200 | Feuermagier | (~Feuermagi@user/feuermagier) (Remote host closed the connection) |
2022-05-08 01:26:47 +0200 | Topsi1 | (~Topsi@dyndsl-095-033-088-174.ewe-ip-backbone.de) (Read error: Connection reset by peer) |
2022-05-08 01:30:44 +0200 | gpncarl | (~gpncarl@120.244.220.74) |
2022-05-08 01:31:34 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 250 seconds) |
2022-05-08 01:32:20 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds) |
2022-05-08 01:35:05 +0200 | stevenxl | (~stevenxl@174.128.182.150) (Quit: leaving) |
2022-05-08 01:35:21 +0200 | gpncarl | (~gpncarl@120.244.220.74) (Ping timeout: 276 seconds) |
2022-05-08 01:36:25 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 260 seconds) |
2022-05-08 01:37:43 +0200 | machinedgod | (~machinedg@24.105.81.50) (Ping timeout: 246 seconds) |
2022-05-08 01:38:04 +0200 | Techcable | (~Techcable@user/Techcable) (Remote host closed the connection) |
2022-05-08 01:39:37 +0200 | Techcable | (~Techcable@user/Techcable) |
2022-05-08 01:39:57 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) |
2022-05-08 01:45:57 +0200 | mmhat | (~mmh@2001:4090:a246:8072:ee08:6bff:fe09:5315) (Quit: WeeChat 3.5) |
2022-05-08 01:49:25 +0200 | unit73e | (~emanuel@2001:818:e8dd:7c00:32b5:c2ff:fe6b:5291) (Remote host closed the connection) |
2022-05-08 01:49:44 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
2022-05-08 01:51:53 +0200 | chomwitt | (~chomwitt@2a02:587:dc19:d600:88e2:8613:1b70:14d7) (Ping timeout: 248 seconds) |
2022-05-08 02:02:05 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Ping timeout: 260 seconds) |
2022-05-08 02:02:21 +0200 | king_gs | (~Thunderbi@187.201.220.53) |
2022-05-08 02:04:44 +0200 | zeenk | (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!) |
2022-05-08 02:06:23 +0200 | hueso | (~root@user/hueso) (Ping timeout: 256 seconds) |
2022-05-08 02:07:51 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 02:09:41 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) |
2022-05-08 02:09:41 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
2022-05-08 02:09:41 +0200 | wroathe | (~wroathe@user/wroathe) |
2022-05-08 02:10:51 +0200 | hueso | (~root@user/hueso) |
2022-05-08 02:14:12 +0200 | malinoskj290645 | (~malinoskj@c-69-138-223-33.hsd1.va.comcast.net) (Ping timeout: 240 seconds) |
2022-05-08 02:14:50 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
2022-05-08 02:14:59 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
2022-05-08 02:15:22 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 02:24:01 +0200 | Feuermagier | (~Feuermagi@user/feuermagier) |
2022-05-08 02:45:27 +0200 | srz | (~srz@181.228.49.93) (Ping timeout: 260 seconds) |
2022-05-08 02:47:39 +0200 | jargon | (~jargon@174-22-206-112.phnx.qwest.net) |
2022-05-08 02:51:50 +0200 | malinoskj290645 | (~malinoskj@c-69-138-223-33.hsd1.va.comcast.net) |
2022-05-08 02:53:47 +0200 | gurkenglas | (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 240 seconds) |
2022-05-08 02:56:27 +0200 | machinedgod | (~machinedg@24.105.81.50) |
2022-05-08 02:57:30 +0200 | king_gs | (~Thunderbi@187.201.220.53) (Ping timeout: 260 seconds) |
2022-05-08 02:57:31 +0200 | malinoskj290645 | (~malinoskj@c-69-138-223-33.hsd1.va.comcast.net) (Ping timeout: 246 seconds) |
2022-05-08 03:03:44 +0200 | stackdroid18 | (~stackdroi@user/stackdroid) (Quit: hasta la vista... tchau!) |
2022-05-08 03:04:00 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 03:07:39 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Client Quit) |
2022-05-08 03:07:40 +0200 | stackdroid18 | (14094@user/stackdroid) |
2022-05-08 03:08:35 +0200 | srz | (~srz@181.228.49.93) |
2022-05-08 03:09:45 +0200 | takuan | (~takuan@178-116-218-225.access.telenet.be) |
2022-05-08 03:22:11 +0200 | jollygood2 | (www-data@2607:5300:60:8be::1) (Quit: CGI:IRC) |
2022-05-08 03:32:06 +0200 | king_gs | (~Thunderbi@187.201.220.53) |
2022-05-08 03:35:29 +0200 | andrey__ | (~andrey@p200300dbcf3ea70066ff5d38847dda5c.dip0.t-ipconnect.de) |
2022-05-08 03:38:12 +0200 | andrey_ | (~andrey@p200300dbcf2f4300665626c49851c8d7.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
2022-05-08 03:42:20 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
2022-05-08 03:47:10 +0200 | srz_ | (~srz@179.36.126.172) |
2022-05-08 03:50:05 +0200 | srz | (~srz@181.228.49.93) (Ping timeout: 256 seconds) |
2022-05-08 03:51:07 +0200 | king_gs | (~Thunderbi@187.201.220.53) (Read error: Connection reset by peer) |
2022-05-08 03:52:24 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 03:54:32 +0200 | modnar | (~modnar@shell.sonic.net) (Ping timeout: 260 seconds) |
2022-05-08 03:57:06 +0200 | modnar | (~modnar@shell.sonic.net) |
2022-05-08 03:57:18 +0200 | kaph | (~kaph@net-2-42-128-205.cust.vodafonedsl.it) (Read error: Connection reset by peer) |
2022-05-08 03:57:42 +0200 | modnar | (~modnar@shell.sonic.net) (Remote host closed the connection) |
2022-05-08 04:12:53 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
2022-05-08 04:12:53 +0200 | finn_elija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 04:12:53 +0200 | finn_elija | FinnElija |
2022-05-08 04:17:32 +0200 | joo-_ | (~joo-_@fsf/member/joo--) (Ping timeout: 272 seconds) |
2022-05-08 04:18:14 +0200 | wroathe | (~wroathe@user/wroathe) (Read error: Connection reset by peer) |
2022-05-08 04:18:53 +0200 | joo-_ | (~joo-_@87-49-44-29-mobile.dk.customer.tdc.net) |
2022-05-08 04:18:53 +0200 | joo-_ | (~joo-_@87-49-44-29-mobile.dk.customer.tdc.net) (Changing host) |
2022-05-08 04:18:53 +0200 | joo-_ | (~joo-_@fsf/member/joo--) |
2022-05-08 04:19:04 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) |
2022-05-08 04:19:04 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
2022-05-08 04:19:04 +0200 | wroathe | (~wroathe@user/wroathe) |
2022-05-08 04:23:28 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 04:25:40 +0200 | waleee | (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 248 seconds) |
2022-05-08 04:26:55 +0200 | AlexNoo_ | (~AlexNoo@178.34.162.228) |
2022-05-08 04:28:41 +0200 | AlexZenon | (~alzenon@178.34.163.12) (Ping timeout: 248 seconds) |
2022-05-08 04:29:13 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 246 seconds) |
2022-05-08 04:29:55 +0200 | Alex_test | (~al_test@178.34.163.12) (Ping timeout: 246 seconds) |
2022-05-08 04:30:19 +0200 | AlexNoo | (~AlexNoo@178.34.163.12) (Ping timeout: 256 seconds) |
2022-05-08 04:31:21 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 252 seconds) |
2022-05-08 04:34:19 +0200 | Alex_test | (~al_test@178.34.162.228) |
2022-05-08 04:34:26 +0200 | AlexZenon | (~alzenon@178.34.162.228) |
2022-05-08 04:37:27 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Quit: king_gs) |
2022-05-08 04:53:33 +0200 | td_ | (~td@94.134.91.63) (Ping timeout: 256 seconds) |
2022-05-08 04:53:51 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
2022-05-08 04:54:15 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 04:55:08 +0200 | td_ | (~td@94.134.91.69) |
2022-05-08 05:00:00 +0200 | jao | (~jao@211.68.17.95.dynamic.jazztel.es) (Ping timeout: 260 seconds) |
2022-05-08 05:00:08 +0200 | stackdroid18 | (14094@user/stackdroid) (Quit: hasta la vista... tchau!) |
2022-05-08 05:04:15 +0200 | abiss27 | (~abiss27@user/abiss) (Quit: hasta la vista... tchau!) |
2022-05-08 05:05:42 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
2022-05-08 05:06:02 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 05:06:03 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
2022-05-08 05:06:26 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 05:07:30 +0200 | tommd | (~tommd@97-120-26-41.ptld.qwest.net) |
2022-05-08 05:08:12 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 252 seconds) |
2022-05-08 05:09:31 +0200 | khumba | (~khumba@user/khumba) |
2022-05-08 05:11:22 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 05:11:48 +0200 | russruss | (~russruss@my.russellmcc.com) (Ping timeout: 240 seconds) |
2022-05-08 05:13:45 +0200 | nate1 | (~nate@98.45.169.16) |
2022-05-08 05:14:15 +0200 | srz_ | (~srz@179.36.126.172) (Quit: Leaving) |
2022-05-08 05:16:21 +0200 | Codaraxis__ | (~Codaraxis@user/codaraxis) (Quit: Leaving) |
2022-05-08 05:17:48 +0200 | russruss | (~russruss@my.russellmcc.com) |
2022-05-08 05:21:47 +0200 | xkuru | (~xkuru@user/xkuru) (Read error: Connection reset by peer) |
2022-05-08 05:29:46 +0200 | machinedgod | (~machinedg@24.105.81.50) (Ping timeout: 246 seconds) |
2022-05-08 05:30:58 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 05:32:31 +0200 | zebrag | (~chris@user/zebrag) (Quit: Konversation terminated!) |
2022-05-08 05:33:00 +0200 | nattiestnate | (~nate@202.138.250.10) |
2022-05-08 05:33:29 +0200 | jargon | (~jargon@174-22-206-112.phnx.qwest.net) (Quit: Nini.. ZZzz...) |
2022-05-08 05:33:53 +0200 | wroathe | (~wroathe@user/wroathe) (Read error: Connection reset by peer) |
2022-05-08 05:34:18 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) |
2022-05-08 05:34:18 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
2022-05-08 05:34:18 +0200 | wroathe | (~wroathe@user/wroathe) |
2022-05-08 05:35:10 +0200 | khumba | (~khumba@user/khumba) () |
2022-05-08 05:44:33 +0200 | tommd | (~tommd@97-120-26-41.ptld.qwest.net) (Ping timeout: 256 seconds) |
2022-05-08 05:48:28 +0200 | zaquest | (~notzaques@5.130.79.72) (Remote host closed the connection) |
2022-05-08 05:50:20 +0200 | nattiestnate | (~nate@202.138.250.10) (Quit: WeeChat 3.5) |
2022-05-08 05:51:11 +0200 | zaquest | (~notzaques@5.130.79.72) |
2022-05-08 05:52:55 +0200 | kaph | (~kaph@net-2-42-128-205.cust.vodafonedsl.it) |
2022-05-08 05:55:19 +0200 | Kaiepi | (~Kaiepi@156.34.47.253) (Ping timeout: 246 seconds) |
2022-05-08 05:55:27 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Read error: Connection reset by peer) |
2022-05-08 05:59:31 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 246 seconds) |
2022-05-08 06:01:42 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 06:08:36 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 248 seconds) |
2022-05-08 06:11:34 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 06:19:20 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) |
2022-05-08 06:20:52 +0200 | nate1 | (~nate@98.45.169.16) (Ping timeout: 246 seconds) |
2022-05-08 06:27:30 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) (Remote host closed the connection) |
2022-05-08 06:30:28 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 248 seconds) |
2022-05-08 06:33:11 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) |
2022-05-08 06:36:25 +0200 | mbuf | (~Shakthi@122.174.202.44) |
2022-05-08 06:39:28 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) (Remote host closed the connection) |
2022-05-08 06:39:50 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) |
2022-05-08 06:45:07 +0200 | coot | (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
2022-05-08 06:46:38 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 06:46:57 +0200 | Unicorn_Princess | (~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Remote host closed the connection) |
2022-05-08 07:11:58 +0200 | wroathe | (~wroathe@user/wroathe) (Ping timeout: 246 seconds) |
2022-05-08 07:13:01 +0200 | melas | (~melas@172.77.31.247) (Ping timeout: 246 seconds) |
2022-05-08 07:16:07 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 07:25:15 +0200 | Guest61 | (~Guest61@14.173.62.239) |
2022-05-08 07:27:05 +0200 | <Guest61> | @help |
2022-05-08 07:27:11 +0200 | <Guest61> | list |
2022-05-08 07:27:15 +0200 | <Guest61> | @list |
2022-05-08 07:27:16 +0200 | <lambdabot> | What module? Try @listmodules for some ideas. |
2022-05-08 07:27:20 +0200 | <Guest61> | @listmodules |
2022-05-08 07:27:20 +0200 | <lambdabot> | activity base bf check compose dice dict djinn dummy elite eval filter free fresh haddock help hoogle instances irc karma localtime metar more oeis offlineRC pl pointful poll pretty quote search |
2022-05-08 07:27:20 +0200 | <lambdabot> | seen slap source spell system tell ticker todo topic type undo unlambda unmtl version where |
2022-05-08 07:27:41 +0200 | <Guest61> | @pl \xs n -> take n xs ==> flip take |
2022-05-08 07:27:42 +0200 | <lambdabot> | flip flip (flip take) . ((==>) .) . flip take |
2022-05-08 07:28:25 +0200 | Kaiepi | (~Kaiepi@156.34.47.253) |
2022-05-08 07:29:16 +0200 | <Guest61> | @pl \fn1 fn2 a1 a2 -> fn1 (fn2 a1) (fn2 a2) |
2022-05-08 07:29:16 +0200 | <lambdabot> | join . ((flip . ((.) .)) .) . (.) |
2022-05-08 07:29:53 +0200 | <Guest61> | @pl \fn2 a1 a2 -> (fn2 a1) (fn2 a2) |
2022-05-08 07:29:53 +0200 | <lambdabot> | flip =<< ((.) .) |
2022-05-08 07:30:30 +0200 | <elmyr> | @src (.) |
2022-05-08 07:30:30 +0200 | <lambdabot> | (f . g) x = f (g x) |
2022-05-08 07:30:49 +0200 | <elmyr> | Day 1 of checking if lambdabot is back to Caleskell. |
2022-05-08 07:31:08 +0200 | elmyr | (sid3438@user/dy) (Quit: Updating details, brb) |
2022-05-08 07:31:17 +0200 | elmyr | (sid3438@user/dy) |
2022-05-08 07:33:24 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Read error: Connection reset by peer) |
2022-05-08 07:40:45 +0200 | harveypwca | (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving) |
2022-05-08 07:45:33 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
2022-05-08 07:48:03 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Remote host closed the connection) |
2022-05-08 07:48:21 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 07:49:24 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 248 seconds) |
2022-05-08 07:49:45 +0200 | rekahsoft | (~rekahsoft@cpe001b21a2fd89-cm64777ddc63a0.cpe.net.cable.rogers.com) (Ping timeout: 276 seconds) |
2022-05-08 07:51:19 +0200 | Guest27 | (~Guest27@78.173.53.235) |
2022-05-08 07:51:31 +0200 | <Guest27> | hello |
2022-05-08 07:52:01 +0200 | Guest27 | (~Guest27@78.173.53.235) (Client Quit) |
2022-05-08 08:05:56 +0200 | Kaiepi | (~Kaiepi@156.34.47.253) (Ping timeout: 248 seconds) |
2022-05-08 08:06:04 +0200 | melas | (~melas@172.77.31.247) |
2022-05-08 08:09:03 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 08:09:21 +0200 | Kaiepi | (~Kaiepi@156.34.47.253) |
2022-05-08 08:17:06 +0200 | <ski> | elmyr : you should be checking `type' rather than `src', for that |
2022-05-08 08:18:51 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 08:20:51 +0200 | Pickchea | (~private@user/pickchea) |
2022-05-08 08:21:45 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 08:23:34 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
2022-05-08 08:29:57 +0200 | chomwitt | (~chomwitt@2a02:587:dc19:d600:24ae:3716:1088:6d4d) |
2022-05-08 08:37:55 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 08:39:17 +0200 | gehmehgeh | (~user@user/gehmehgeh) |
2022-05-08 08:40:54 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) |
2022-05-08 08:43:01 +0200 | img | (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in) |
2022-05-08 08:43:18 +0200 | img | (~img@user/img) |
2022-05-08 08:49:15 +0200 | jmdaemon | (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds) |
2022-05-08 08:50:24 +0200 | random-jellyfish | (~random-je@user/random-jellyfish) |
2022-05-08 08:54:03 +0200 | wootehfoot | (~wootehfoo@user/wootehfoot) |
2022-05-08 08:55:48 +0200 | kenran | (~kenran@200116b82be152003bcf840303205486.dip.versatel-1u1.de) |
2022-05-08 08:56:33 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Remote host closed the connection) |
2022-05-08 08:57:52 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 08:58:55 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 09:03:46 +0200 | <tomsmeding> | What was the deal with (.) earlier then |
2022-05-08 09:06:15 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 09:11:23 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
2022-05-08 09:14:24 +0200 | f-a | (f2a@f2a.jujube.ircnow.org) () |
2022-05-08 09:17:40 +0200 | wootehfoot | (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
2022-05-08 09:17:50 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 09:18:51 +0200 | kaph | (~kaph@net-2-42-128-205.cust.vodafonedsl.it) (Ping timeout: 260 seconds) |
2022-05-08 09:22:02 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) |
2022-05-08 09:23:37 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 248 seconds) |
2022-05-08 09:26:59 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Remote host closed the connection) |
2022-05-08 09:27:47 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 09:29:12 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 09:31:21 +0200 | wootehfoot | (~wootehfoo@user/wootehfoot) |
2022-05-08 09:33:06 +0200 | melas | (~melas@172.77.31.247) (Ping timeout: 276 seconds) |
2022-05-08 09:39:06 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 09:46:30 +0200 | <c_wraith> | :t (\f g -> pure f =<< g) `asTypeOf` (.) -- tomsmeding |
2022-05-08 09:46:31 +0200 | <lambdabot> | (a -> b) -> (a -> a) -> a -> b |
2022-05-08 09:47:05 +0200 | <tomsmeding> | c_wraith: so, fmap? |
2022-05-08 09:47:10 +0200 | <c_wraith> | I commented that `pure f =<< g' is a very long walk to reimplement (.) |
2022-05-08 09:47:30 +0200 | <tomsmeding> | Ah, now I remember people saying that lambdabot had (.) = fmap at some point :) |
2022-05-08 09:47:47 +0200 | <c_wraith> | yep. that was the "caleskell" being referred to |
2022-05-08 09:47:53 +0200 | <tomsmeding> | Right |
2022-05-08 09:50:01 +0200 | <tomsmeding> | So fmap and (<<<) both generalise (.), I wonder if those are incompatible |
2022-05-08 09:50:29 +0200 | MoC | (~moc@user/moc) |
2022-05-08 09:50:37 +0200 | <c_wraith> | :t (>>>) `asTypeOf` fmap |
2022-05-08 09:50:38 +0200 | <lambdabot> | (a -> a) -> (a -> a) -> a -> a |
2022-05-08 09:50:44 +0200 | <c_wraith> | err |
2022-05-08 09:50:48 +0200 | <c_wraith> | :t (<<<) `asTypeOf` fmap |
2022-05-08 09:50:50 +0200 | <lambdabot> | (b -> c) -> (a -> b) -> a -> c |
2022-05-08 09:51:10 +0200 | <c_wraith> | between the two of them, every polytypic variable in the other is monomorphized |
2022-05-08 09:51:11 +0200 | Hash | (~Hash@hey.howstoned.ru) (Read error: Connection reset by peer) |
2022-05-08 09:51:18 +0200 | <tomsmeding> | You'd need an fmap' that takes a 'cat a b' as the function argument |
2022-05-08 09:51:24 +0200 | <tomsmeding> | But that makes no sense for some functors |
2022-05-08 09:51:48 +0200 | <tomsmeding> | So they are indeed incompatible generalisations |
2022-05-08 09:52:55 +0200 | MoC | (~moc@user/moc) (Read error: Connection reset by peer) |
2022-05-08 09:52:59 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 240 seconds) |
2022-05-08 09:53:04 +0200 | MoC_ | (~moc@user/moc) |
2022-05-08 09:53:21 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer) |
2022-05-08 09:53:45 +0200 | <tomsmeding> | Hm, `class Category cat => CFunctor cat f where fmap :: cat a b -> cat (f a) (f b)` maybe, with `type Functor = CFunctor (->)` |
2022-05-08 09:53:47 +0200 | Hash | (~Hash@hey.howstoned.ru) |
2022-05-08 09:56:07 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 09:56:35 +0200 | <tomsmeding> | Hm, then you'd want `instance CFunctor cat (cat c)` but not sure whether that can work in general |
2022-05-08 09:58:40 +0200 | cigsender | (~cigsender@cpe5c7d7db831c8-cm5c7d7db831c6.cpe.net.cable.rogers.com) (Ping timeout: 260 seconds) |
2022-05-08 09:59:22 +0200 | MoC_ | MoC |
2022-05-08 10:01:04 +0200 | cigsender | (~cigsender@cpe5c7d7db831c8-cm5c7d7db831c6.cpe.net.cable.rogers.com) |
2022-05-08 10:05:27 +0200 | Tuplanolla | (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi) |
2022-05-08 10:07:20 +0200 | kmein | (~weechat@user/kmein) (Quit: ciao kakao) |
2022-05-08 10:07:53 +0200 | Pickchea | (~private@user/pickchea) (Ping timeout: 248 seconds) |
2022-05-08 10:07:57 +0200 | kmein | (~weechat@user/kmein) |
2022-05-08 10:08:00 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 260 seconds) |
2022-05-08 10:08:36 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Ping timeout: 248 seconds) |
2022-05-08 10:09:01 +0200 | qy | (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) (Quit: WeeChat 3.4) |
2022-05-08 10:10:07 +0200 | ix | (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) |
2022-05-08 10:10:36 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 10:11:10 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) |
2022-05-08 10:13:40 +0200 | _ht | (~quassel@231-169-21-31.ftth.glasoperator.nl) |
2022-05-08 10:15:57 +0200 | zeenk | (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) |
2022-05-08 10:25:40 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 10:29:01 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 246 seconds) |
2022-05-08 10:30:55 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 10:31:21 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 248 seconds) |
2022-05-08 10:33:14 +0200 | kimjetwav | (~user@2607:fea8:2362:b400:897f:4fc4:a1cd:a588) (Ping timeout: 250 seconds) |
2022-05-08 10:35:52 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
2022-05-08 10:39:17 +0200 | tzh | (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz) |
2022-05-08 10:43:25 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 10:48:40 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Remote host closed the connection) |
2022-05-08 10:49:32 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 10:53:15 +0200 | jakalx | (~jakalx@base.jakalx.net) () |
2022-05-08 10:53:57 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
2022-05-08 10:55:01 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Quit: king_gs) |
2022-05-08 10:55:38 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 11:02:34 +0200 | <mikoto-chan> | how do I install libmpd with cabal? |
2022-05-08 11:02:38 +0200 | <mikoto-chan> | I get a weird error |
2022-05-08 11:02:47 +0200 | <mikoto-chan> | Cannot build the executables in the package libmpd because it does not |
2022-05-08 11:02:50 +0200 | <mikoto-chan> | contain any executables |
2022-05-08 11:06:31 +0200 | <maerwald[m]> | mikoto-chan: the library? |
2022-05-08 11:10:34 +0200 | <mikoto-chan> | maerwald[m]: --lib :| |
2022-05-08 11:12:04 +0200 | <mikoto-chan> | can I ask questions about xmobar here? |
2022-05-08 11:12:26 +0200 | <mikoto-chan> | the mpd plugin isn't exactly working |
2022-05-08 11:12:33 +0200 | <mikoto-chan> | do I need to use the system-wide daemon? |
2022-05-08 11:13:14 +0200 | <mikoto-chan> | yes seems like it |
2022-05-08 11:13:22 +0200 | jakalx | (~jakalx@base.jakalx.net) |
2022-05-08 11:17:26 +0200 | gehmehgeh | (~user@user/gehmehgeh) (Remote host closed the connection) |
2022-05-08 11:17:26 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
2022-05-08 11:17:48 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2022-05-08 11:18:08 +0200 | gehmehgeh | (~user@user/gehmehgeh) |
2022-05-08 11:19:43 +0200 | gabriel_sevecek | (~gabriel@188-167-229-200.dynamic.chello.sk) (Quit: WeeChat 3.5) |
2022-05-08 11:20:22 +0200 | gabriel_sevecek | (~gabriel@188-167-229-200.dynamic.chello.sk) |
2022-05-08 11:26:40 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 11:29:47 +0200 | gabriel_sevecek | (~gabriel@188-167-229-200.dynamic.chello.sk) (Ping timeout: 240 seconds) |
2022-05-08 11:30:28 +0200 | <AndreasK> | I have a possible stupid question. Is `cabal install cabal-install` supposed to work? |
2022-05-08 11:31:06 +0200 | <AndreasK> | And if the answer is yes, which ghc versions are supposed to build the latest version that way? |
2022-05-08 11:32:35 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
2022-05-08 11:33:30 +0200 | <AndreasK> | I guess it just doesn'T support building with 9.2 yet |
2022-05-08 11:34:25 +0200 | jpds | (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection) |
2022-05-08 11:34:41 +0200 | econo | (uid147250@user/econo) (Quit: Connection closed for inactivity) |
2022-05-08 11:34:47 +0200 | jpds | (~jpds@gateway/tor-sasl/jpds) |
2022-05-08 11:37:08 +0200 | coot | (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
2022-05-08 11:39:10 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 11:49:25 +0200 | Sgeo | (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
2022-05-08 11:52:36 +0200 | jespada | (~jespada@146.70.119.114) (Ping timeout: 248 seconds) |
2022-05-08 11:53:34 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
2022-05-08 11:54:18 +0200 | jespada | (~jespada@cpc121022-nmal24-2-0-cust171.19-2.cable.virginm.net) |
2022-05-08 11:58:23 +0200 | <AndreasK> | Or 9.0 |
2022-05-08 12:10:22 +0200 | flupe | (~baboum@radon.sbi.re) |
2022-05-08 12:11:42 +0200 | coot | (~coot@213.134.190.95) |
2022-05-08 12:16:57 +0200 | wootehfoot | (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
2022-05-08 12:22:10 +0200 | Vajb | (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
2022-05-08 12:22:56 +0200 | Vajb | (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56) |
2022-05-08 12:24:28 +0200 | AlexNoo_ | AlexNoo |
2022-05-08 12:24:43 +0200 | oxide | (~lambda@user/oxide) |
2022-05-08 12:25:38 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Remote host closed the connection) |
2022-05-08 12:26:50 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 12:28:35 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Read error: Connection reset by peer) |
2022-05-08 12:29:15 +0200 | oxide | (~lambda@user/oxide) (Ping timeout: 276 seconds) |
2022-05-08 12:31:08 +0200 | oxide | (~lambda@user/oxide) |
2022-05-08 12:31:59 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
2022-05-08 12:35:25 +0200 | <maerwald> | AndreasK: it works sometimes |
2022-05-08 12:36:15 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
2022-05-08 12:37:00 +0200 | <AndreasK> | As far as I can tell it should work with 8.10 but on this box my oldest GHC is 9.0.1 |
2022-05-08 12:38:54 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 12:39:56 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) |
2022-05-08 12:41:14 +0200 | zeenk | (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!) |
2022-05-08 12:42:01 +0200 | Guest61 | (~Guest61@14.173.62.239) (Quit: Client closed) |
2022-05-08 12:43:41 +0200 | melas | (~melas@172.77.31.247) |
2022-05-08 12:44:06 +0200 | gurkenglas | (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) |
2022-05-08 12:45:52 +0200 | frost | (~frost@user/frost) |
2022-05-08 12:48:36 +0200 | cyphase | (~cyphase@user/cyphase) (Ping timeout: 248 seconds) |
2022-05-08 12:50:06 +0200 | Lord_of_Life_ | (~Lord@user/lord-of-life/x-2819915) |
2022-05-08 12:50:27 +0200 | cyphase | (~cyphase@user/cyphase) |
2022-05-08 12:50:35 +0200 | Lord_of_Life | (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds) |
2022-05-08 12:50:59 +0200 | <maerwald> | AndreasK: can you install 8.10? |
2022-05-08 12:52:19 +0200 | <AndreasK> | Yes. But I think I will just download a 3.6 binary instead. |
2022-05-08 12:52:50 +0200 | Lord_of_Life_ | Lord_of_Life |
2022-05-08 12:53:53 +0200 | MoC | (~moc@user/moc) (Quit: Konversation terminated!) |
2022-05-08 13:00:12 +0200 | MajorBiscuit | (~MajorBisc@c-001-007-017.client.tudelft.eduvpn.nl) |
2022-05-08 13:05:47 +0200 | kaph | (~kaph@net-2-42-128-205.cust.vodafonedsl.it) |
2022-05-08 13:05:55 +0200 | jakalx | (~jakalx@base.jakalx.net) (Disconnected: Replaced by new connection) |
2022-05-08 13:05:56 +0200 | jakalx | (~jakalx@base.jakalx.net) |
2022-05-08 13:08:47 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
2022-05-08 13:18:16 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
2022-05-08 13:27:07 +0200 | fendor_ | (~fendor@77.119.200.1.wireless.dyn.drei.com) (Remote host closed the connection) |
2022-05-08 13:28:30 +0200 | asivitz | (uid178348@id-178348.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
2022-05-08 13:28:39 +0200 | ubert1 | (~Thunderbi@p200300ecdf158841296f298839ed6584.dip0.t-ipconnect.de) |
2022-05-08 13:40:07 +0200 | <dminuoso> | I have a bunch of `IO T` where T has Monoid, is some shorter version of `fmap mconcat <$> sequence [a, b, c]`? |
2022-05-08 13:40:17 +0200 | xaotuk | (~sasha@net234-32-245-109.mbb.telenor.rs) |
2022-05-08 13:40:45 +0200 | oxide | (~lambda@user/oxide) (Ping timeout: 276 seconds) |
2022-05-08 13:46:23 +0200 | <[exa]> | dminuoso: `fold` with Ap? https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Monoid.html#g:6 |
2022-05-08 13:47:28 +0200 | oxide | (~lambda@user/oxide) |
2022-05-08 13:49:40 +0200 | <dminuoso> | [exa]: Mmm ah yes, I think thats what I was looking for. Not convinced this is better. |
2022-05-08 13:50:42 +0200 | <[exa]> | :t getAp . fold . fmap Ap |
2022-05-08 13:50:44 +0200 | <lambdabot> | forall k (t :: * -> *) (f :: k -> *) (a :: k). (Foldable t, Monoid (Ap f a), Functor t) => t (f a) -> f a |
2022-05-08 13:51:20 +0200 | <[exa]> | would get competitive if there'd be some kind of `foldVia Ap` :D |
2022-05-08 13:51:33 +0200 | <dminuoso> | Well that' |
2022-05-08 13:51:37 +0200 | <dminuoso> | Well that's `ala` territory. |
2022-05-08 13:51:53 +0200 | <dminuoso> | :t ala |
2022-05-08 13:51:54 +0200 | <lambdabot> | (Functor f, Rewrapped s t, Rewrapped t s) => (Unwrapped s -> s) -> ((Unwrapped t -> t) -> f s) -> f (Unwrapped s) |
2022-05-08 13:51:57 +0200 | <[exa]> | true |
2022-05-08 13:52:22 +0200 | <[exa]> | is there a rewrapper? |
2022-05-08 13:52:39 +0200 | <dminuoso> | rewrapper? |
2022-05-08 13:53:28 +0200 | <dminuoso> | :t overF |
2022-05-08 13:53:29 +0200 | <lambdabot> | error: |
2022-05-08 13:53:30 +0200 | <lambdabot> | • Variable not in scope: overF |
2022-05-08 13:53:30 +0200 | <lambdabot> | • Perhaps you meant one of these: |
2022-05-08 13:55:39 +0200 | <[exa]> | :t al Ap foldMap |
2022-05-08 13:55:40 +0200 | <lambdabot> | error: |
2022-05-08 13:55:40 +0200 | <lambdabot> | • Variable not in scope: |
2022-05-08 13:55:40 +0200 | <lambdabot> | al :: (f0 a0 -> Ap f0 a0) -> ((a1 -> m0) -> t0 a1 -> m0) -> t |
2022-05-08 13:55:45 +0200 | <[exa]> | too much `a` |
2022-05-08 13:55:59 +0200 | <[exa]> | :t ala Ap foldMap |
2022-05-08 13:56:01 +0200 | <lambdabot> | forall k1 (t :: * -> *) (g :: k1 -> *) (b :: k1). (Foldable t, Monoid (Ap g b)) => t (g b) -> g b |
2022-05-08 13:56:27 +0200 | <[exa]> | still I like the sequence one better :] |
2022-05-08 13:56:31 +0200 | <dminuoso> | > ala Ap foldMap [pure [1,2] :: IO [Int], pure [3,4]] |
2022-05-08 13:56:33 +0200 | <lambdabot> | <IO [Int]> |
2022-05-08 13:56:47 +0200 | <dminuoso> | You use this if you have your coworkers. |
2022-05-08 13:56:50 +0200 | <dminuoso> | s/have/hate/ |
2022-05-08 13:57:07 +0200 | <dminuoso> | And ideally you use not `newtypes` but `lens` for it. |
2022-05-08 13:57:22 +0200 | <dminuoso> | (definitely not coercible-utils) |
2022-05-08 13:58:01 +0200 | <[exa]> | :] |
2022-05-08 13:58:34 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
2022-05-08 14:00:04 +0200 | melas | (~melas@172.77.31.247) (Ping timeout: 246 seconds) |
2022-05-08 14:01:23 +0200 | <[Leary]> | dminuoso: Isn't it just "fold"? We have Monoid a => Monoid (IO a). |
2022-05-08 14:04:42 +0200 | juri__ | juri_ |
2022-05-08 14:08:36 +0200 | ubert1 | (~Thunderbi@p200300ecdf158841296f298839ed6584.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
2022-05-08 14:09:29 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
2022-05-08 14:12:48 +0200 | <[exa]> | [Leary]: something needs to tell it how to fold the applicatives |
2022-05-08 14:13:22 +0200 | <[exa]> | ah for IO that could work, yes |
2022-05-08 14:13:35 +0200 | <[exa]> | cool. |
2022-05-08 14:14:15 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 260 seconds) |
2022-05-08 14:14:49 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 14:15:53 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) |
2022-05-08 14:20:06 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 14:20:36 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) (Ping timeout: 240 seconds) |
2022-05-08 14:21:24 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 14:22:45 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) |
2022-05-08 14:30:04 +0200 | coot | (~coot@213.134.190.95) (Quit: coot) |
2022-05-08 14:30:14 +0200 | coot | (~coot@213.134.190.95) |
2022-05-08 14:39:16 +0200 | gurkenglas | (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 246 seconds) |
2022-05-08 14:40:48 +0200 | xkuru | (~xkuru@user/xkuru) |
2022-05-08 14:45:31 +0200 | dextaa4 | (~dextaa@user/dextaa) |
2022-05-08 14:56:43 +0200 | machinedgod | (~machinedg@24.105.81.50) |
2022-05-08 14:59:30 +0200 | Lycurgus | (~juan@user/Lycurgus) |
2022-05-08 15:01:28 +0200 | raym | (~raym@user/raym) (Ping timeout: 250 seconds) |
2022-05-08 15:02:10 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) (Remote host closed the connection) |
2022-05-08 15:02:15 +0200 | raym | (~raym@user/raym) |
2022-05-08 15:02:35 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) |
2022-05-08 15:04:07 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Ping timeout: 246 seconds) |
2022-05-08 15:05:55 +0200 | waleee | (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) |
2022-05-08 15:06:14 +0200 | AlexZenon | (~alzenon@178.34.162.228) (Ping timeout: 250 seconds) |
2022-05-08 15:07:22 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) |
2022-05-08 15:10:30 +0200 | AlexZenon | (~alzenon@178.34.162.228) |
2022-05-08 15:27:35 +0200 | MoC | (~moc@user/moc) |
2022-05-08 15:29:07 +0200 | waleee | (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 240 seconds) |
2022-05-08 15:29:34 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 15:33:54 +0200 | shapr | (~user@pool-173-73-44-186.washdc.fios.verizon.net) |
2022-05-08 15:39:29 +0200 | tochicool | (~tochicool@user/tochicool) |
2022-05-08 15:40:13 +0200 | Simon98 | (~Simon@ipbcc036f5.dynamic.kabel-deutschland.de) |
2022-05-08 15:40:29 +0200 | <Simon98> | Hello there! Is there a list of adjustments that I can make with :set in GHCI? |
2022-05-08 15:41:12 +0200 | <Simon98> | Also im looking for a :set action that was called something with ...morpho... or so and I think it would specify the :t outputs and not always just say "Num". Do you know how it is called? |
2022-05-08 15:41:12 +0200 | <geekosaur> | https://downloads.haskell.org/ghc/9.0.2/docs/html/users_guide/ghci.html#the-set-and-seti-commands |
2022-05-08 15:41:37 +0200 | <Simon98> | Ahh I think it was XNoMonomorphismRestriction |
2022-05-08 15:41:42 +0200 | <Simon98> | Thanks geekosaur |
2022-05-08 15:42:08 +0200 | <geekosaur> | you may be thinking of :set -XMonomorphismRestriction, but it won't affect :t directly like that |
2022-05-08 15:42:26 +0200 | <geekosaur> | types donb't get defaulted until applied |
2022-05-08 15:42:59 +0200 | <Simon98> | what do you mean by that last line? |
2022-05-08 15:43:16 +0200 | <geekosaur> | you need a fully applied expression for monomorphization to happen |
2022-05-08 15:43:36 +0200 | <Simon98> | And also the link: There are indeed some things that work with :set, but it doesn't look like a complete list or so. Or is there simply no complete list since there can be new :set specifications added or so? |
2022-05-08 15:44:03 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
2022-05-08 15:44:24 +0200 | <geekosaur> | :set also allows any ghc option at https://downloads.haskell.org/ghc/9.0.2/docs/html/users_guide/flags.html that is marked Dynamic |
2022-05-08 15:45:08 +0200 | <geekosaur> | and any extension selectable with -X, of which I don't think there's a single compact list |
2022-05-08 15:45:10 +0200 | <Simon98> | what does marked Dynamic mean? |
2022-05-08 15:45:29 +0200 | <Simon98> | I see, no -X list |
2022-05-08 15:45:42 +0200 | <geekosaur> | the link I gave you is a table of options, whether an option is dynamic or not is listed in the third column of the table |
2022-05-08 15:46:47 +0200 | <geekosaur> | you can get a full list of -X options with `ghc --supported-extensions` |
2022-05-08 15:47:05 +0200 | <geekosaur> | (sadly, with no documentation. but you can then search the manual) |
2022-05-08 15:47:33 +0200 | <Simon98> | Wow, there are a lot |
2022-05-08 15:47:45 +0200 | <Simon98> | I wonder what all of them do haha |
2022-05-08 15:47:57 +0200 | <Simon98> | Another question: |
2022-05-08 15:50:24 +0200 | <Simon98> | I'm new to Haskell and there just seem to be some huge differences to other, more common languages like Java or JavaScript. Not just regarding the programming paradigma but also with things like this :set and so on. |
2022-05-08 15:50:25 +0200 | <Simon98> | Do you know if there are big software branches or industries out there where Haskell is used a lot or where it might even be the standard or are most of the problems that occur in the major branches just solved more easily with other languages? |
2022-05-08 15:51:00 +0200 | <Lycurgus> | yes |
2022-05-08 15:51:15 +0200 | <Simon98> | Ok, great that you know it! What would it be? |
2022-05-08 15:52:23 +0200 | <Lycurgus> | it? |
2022-05-08 15:52:48 +0200 | <Lycurgus> | TIOBE might be what ur lookin for |
2022-05-08 15:53:39 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
2022-05-08 15:53:44 +0200 | <Simon98> | Yeah so Haskell is pretty low there. But still, are there branches where it is de facto standard? Due to whatever reason? |
2022-05-08 15:54:16 +0200 | <Lycurgus> | No |
2022-05-08 15:54:22 +0200 | <maerwald[m]> | Most of industry doesn't solve problems, but needs just another iteration of the same thing |
2022-05-08 15:54:35 +0200 | <maerwald[m]> | Languages don't matter to them, but engineers do |
2022-05-08 15:54:49 +0200 | <Lycurgus> | although it's cachet in academe was very high, but peaked in the last decade imo |
2022-05-08 15:54:56 +0200 | <Simon98> | What do you mean by your first line mearwald? |
2022-05-08 15:55:09 +0200 | <maerwald[m]> | And engineers think everything is about programming languages |
2022-05-08 15:55:29 +0200 | <Lycurgus> | this channel for example has about half its population of a decade ago |
2022-05-08 15:56:01 +0200 | <Simon98> | Why would you say is it popular in academia? (at least at my uni) |
2022-05-08 15:56:01 +0200 | <hpc> | that's not a very good measure, that entire population loss is explained by the freenode debacle |
2022-05-08 15:56:22 +0200 | <Lycurgus> | what maerwald[m] is referring to is a character of modern IT that is different from it's youth |
2022-05-08 15:56:44 +0200 | <Lycurgus> | which is that IT became competent but dull |
2022-05-08 15:56:53 +0200 | <Lycurgus> | real innovation dried up |
2022-05-08 15:56:56 +0200 | <Simon98> | But why another iteration of the same thing? |
2022-05-08 15:57:15 +0200 | <maerwald[m]> | To me, engineering would spend 60% of the time on specifications, then come up with the most constrained language (or DSL) possible that can be checked against the spec and doesn't require overly smart programmers. |
2022-05-08 15:58:02 +0200 | <Lycurgus> | mostly because IT became a multi trillion dollar industry |
2022-05-08 15:58:02 +0200 | <Simon98> | This is how you would like it to be or how you think it currently is? |
2022-05-08 15:58:56 +0200 | <Lycurgus> | Simon98, you should address individuals as such when using first person |
2022-05-08 15:58:56 +0200 | <Simon98> | Isn't IT one of the biggest innovators currently? Yet alone due to its size as Lycurgus says |
2022-05-08 15:59:13 +0200 | <maerwald[m]> | But currently everyone likes turing complete general purpose languages and is interested in more expressivity, not less. |
2022-05-08 15:59:14 +0200 | <Lycurgus> | i just said it wasn't |
2022-05-08 16:00:26 +0200 | causal | (~user@50.35.83.177) (Quit: WeeChat 3.5) |
2022-05-08 16:00:31 +0200 | <Simon98> | Yeah, you're right. Maybe I'm surprised that it's not |
2022-05-08 16:00:40 +0200 | <ProofTechnique> | Is there an established name for `f :: Functor f => f (a -> b, c -> d) -> f (a -> c -> (b, d)) = fmap (curry . uncurry bimap)`? |
2022-05-08 16:02:39 +0200 | <ProofTechnique> | IT is incredibly stagnant. It's just "here are all the business problems of decades ago, but now do it on someone else's infrastructure and bigger". All the "new" work is in crypto and that's literally worse than nothing. |
2022-05-08 16:03:07 +0200 | <Simon98> | Interesting, now I get it |
2022-05-08 16:03:16 +0200 | <Simon98> | But why is crypto a problem in your opinion? |
2022-05-08 16:03:30 +0200 | <darkling> | Yeah, I'm fed up of different ways to do RPC. |
2022-05-08 16:03:58 +0200 | <maerwald[m]> | Crypto is (technically) one of the biggest challenges. But no one knows what business problems it sovles |
2022-05-08 16:04:08 +0200 | <ProofTechnique> | Environmental impact, governance, lack of utility. |
2022-05-08 16:04:26 +0200 | <maerwald[m]> | ProofTechnique: environmental impact? |
2022-05-08 16:04:34 +0200 | <ProofTechnique> | It's just a very fancy way to create private currency, which has always been bad |
2022-05-08 16:05:00 +0200 | <maerwald[m]> | You're aware that proof of stake has basically no significant environmental impact? |
2022-05-08 16:05:22 +0200 | <ProofTechnique> | Cool, let me know when _anyone_ that matters is using PoS |
2022-05-08 16:05:29 +0200 | <maerwald[m]> | Cardano |
2022-05-08 16:05:31 +0200 | <ProofTechnique> | I'm sure ETH will do it any day now |
2022-05-08 16:05:48 +0200 | Lycurgus | (~juan@user/Lycurgus) (Quit: Exeunt) |
2022-05-08 16:05:51 +0200 | <tochicool> | any way to get GHC to deduce the right constraint without pattern matching on the constructor? https://paste.tomsmeding.com/hxyLAkke |
2022-05-08 16:06:01 +0200 | <maerwald[m]> | The biggest blockchain written in Haskell |
2022-05-08 16:06:08 +0200 | <Simon98> | Cardano? |
2022-05-08 16:06:09 +0200 | <ProofTechnique> | It's a fancy way to make private money, which is actively corrosive to democratic control of society |
2022-05-08 16:06:10 +0200 | <maerwald[m]> | Seems you're not informed |
2022-05-08 16:06:36 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 16:06:40 +0200 | <ProofTechnique> | I'm incredibly aware of Cardano |
2022-05-08 16:06:43 +0200 | <maerwald[m]> | I think that's as much BS as anything else about money and banks |
2022-05-08 16:07:02 +0200 | <ProofTechnique> | I'm so excited to see how the neocolonialism in Africa pans out |
2022-05-08 16:07:10 +0200 | <ski> | tochicool : i think, no |
2022-05-08 16:07:25 +0200 | <tochicool> | :( why not? |
2022-05-08 16:08:05 +0200 | <maerwald[m]> | ProofTechnique: I'm not into crypto, I just think most of the criticism is hypocritical |
2022-05-08 16:08:29 +0200 | <ski> | i don't think there's any "you've exhausted all other cases, so it must correspond to the remaining case", while not matching on a GADT data constructor |
2022-05-08 16:08:38 +0200 | <ProofTechnique> | Crypto does not solve any problem except how to part fools from their money and how to make the already exploitative relations of capitalism _even less regulated_ |
2022-05-08 16:09:42 +0200 | <ProofTechnique> | To be clear, I'm also against banks, but my preferred solution is to dismantle banks, not create dozens of hyper-exploitative bank-fiefs |
2022-05-08 16:11:02 +0200 | <Simon98> | ProofTechnique Can you think of at least one major usecase for crypto? |
2022-05-08 16:11:05 +0200 | <maerwald[m]> | Seems all very shallow critique to me, but you have some sympathies with https://github.com/sdiehl/popping-the-crypto-bubble |
2022-05-08 16:11:07 +0200 | <ProofTechnique> | There are none |
2022-05-08 16:11:37 +0200 | <tochicool> | ski: i see, thanks. i hoped it might be possible as ghc can do smarter things than that. would be really helpful if you had a lot of constructors with the same index. |
2022-05-08 16:11:42 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
2022-05-08 16:12:18 +0200 | <maerwald[m]> | People also thought the radio or TV is going to end the world as we know it |
2022-05-08 16:12:32 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 250 seconds) |
2022-05-08 16:12:46 +0200 | <ProofTechnique> | Radio didn't use the entire electrical output of the Netherlands |
2022-05-08 16:13:35 +0200 | <tochicool> | it's harder to see the benefits of bitcoin from the first world |
2022-05-08 16:13:37 +0200 | <maerwald[m]> | Neither does proof of stake |
2022-05-08 16:13:47 +0200 | <maerwald[m]> | You're being deliberately imprecise |
2022-05-08 16:15:03 +0200 | <ski> | tochicool : a somewhat similar example to this would be `Right x >>= k = k x; e >>= _ = e', where we'd like `e' to bound to have type `forall a. Either e a' (where `k :: a -> Either e b'), so that it can be used at type `Either e b' |
2022-05-08 16:15:48 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds) |
2022-05-08 16:16:10 +0200 | <ski> | @src Either (>>=) |
2022-05-08 16:16:10 +0200 | <lambdabot> | Left l >>= _ = Left l |
2022-05-08 16:16:10 +0200 | <lambdabot> | Right r >>= k = k r |
2022-05-08 16:16:25 +0200 | <ski> | (note the annoying code repetition) |
2022-05-08 16:16:58 +0200 | <ProofTechnique> | Then make an actual point instead of just complaining that I'm not sufficiently deferential to the claims of known con artists |
2022-05-08 16:17:24 +0200 | hpc | . o O ( are lisp programmers... cons artists? ) |
2022-05-08 16:17:48 +0200 | ccntrq | (~Thunderbi@2a01:c22:8c0e:ad00:ca80:eae8:cb5b:57af) |
2022-05-08 16:17:55 +0200 | <ProofTechnique> | More of a used `car` salesperson |
2022-05-08 16:18:28 +0200 | <hpc> | never bring a lisp programmer to a party, they'll defun it |
2022-05-08 16:19:41 +0200 | <tochicool> | ski : yes that is annoying. are there any planned extensions the type system to help with this or is there some fundamental reason why this isn't supported? |
2022-05-08 16:20:49 +0200 | <ski> | neither, afai aware |
2022-05-08 16:21:42 +0200 | ccntrq1 | (~Thunderbi@dynamic-095-112-198-016.95.112.pool.telefonica.de) |
2022-05-08 16:21:48 +0200 | ccntrq | (~Thunderbi@2a01:c22:8c0e:ad00:ca80:eae8:cb5b:57af) (Ping timeout: 240 seconds) |
2022-05-08 16:21:49 +0200 | ccntrq1 | ccntrq |
2022-05-08 16:21:56 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) |
2022-05-08 16:21:56 +0200 | wroathe | (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
2022-05-08 16:21:56 +0200 | wroathe | (~wroathe@user/wroathe) |
2022-05-08 16:22:49 +0200 | <ski> | (i think the problem i sketched, at least, could probably be speced and implemented without *too* much trouble (although it might turn out to be more involved than expected, of course) .. but, in any case, it would be a complication, and so people would be asking whether it's worth it, compared to how much/often people would benefit from it) |
2022-05-08 16:23:00 +0200 | hiredman | (~hiredman@frontier1.downey.family) (Ping timeout: 248 seconds) |
2022-05-08 16:23:40 +0200 | <ski> | (for the GADT one, it's not as clear to me how one'd want this to behave, systematically. but then i've not pondered this before, either) |
2022-05-08 16:24:02 +0200 | Unicorn_Princess | (~Unicorn_P@93-103-228-248.dynamic.t-2.net) |
2022-05-08 16:24:07 +0200 | hiredman | (~hiredman@frontier1.downey.family) |
2022-05-08 16:27:16 +0200 | Guest9113 | (~Guest91@84-75-254-89.dclient.hispeed.ch) |
2022-05-08 16:28:27 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Remote host closed the connection) |
2022-05-08 16:28:45 +0200 | <Simon98> | If I have a function like: allSame a b c = (a==b && a==c) && (c==b) with allSame :: Eq a => a -> a -> a -> Bool |
2022-05-08 16:28:45 +0200 | <Simon98> | Can someone explain to me what each arrow exactly stands for? |
2022-05-08 16:29:03 +0200 | <Simon98> | Ahhh |
2022-05-08 16:29:27 +0200 | <Simon98> | No |
2022-05-08 16:29:33 +0200 | <Simon98> | But the a stands for Bool |
2022-05-08 16:29:51 +0200 | <ski> | no |
2022-05-08 16:30:01 +0200 | <Simon98> | Crap |
2022-05-08 16:30:03 +0200 | <Simon98> | Right |
2022-05-08 16:30:33 +0200 | <Simon98> | A stands for the type that my a b c have. But if they have different types? |
2022-05-08 16:30:39 +0200 | <Simon98> | a* |
2022-05-08 16:31:44 +0200 | <hpc> | if they have different types, you can't use (==) with them |
2022-05-08 16:31:48 +0200 | <geekosaur> | they can't |
2022-05-08 16:31:49 +0200 | <ski> | allSame :: Eq a => a -> a -> a -> Bool |
2022-05-08 16:31:51 +0200 | <ski> | -- params&result ^ a ^ b ^ c ^ result |
2022-05-08 16:31:59 +0200 | <hpc> | > "five" == 5 -- not valid |
2022-05-08 16:32:00 +0200 | <lambdabot> | error: |
2022-05-08 16:32:00 +0200 | <lambdabot> | • No instance for (Num [Char]) arising from the literal ‘5’ |
2022-05-08 16:32:00 +0200 | <lambdabot> | • In the second argument of ‘(==)’, namely ‘5’ |
2022-05-08 16:32:32 +0200 | <ski> | also, `(==)' ought to be symmetric and transitive, so you should be able to remove one of the equality checks |
2022-05-08 16:32:49 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 16:33:20 +0200 | <ski> | `a' is the type of the three values that are being compared for equality. the `->'s come after each parameter/argument type. the result type comes last |
2022-05-08 16:34:25 +0200 | bontaq | (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 256 seconds) |
2022-05-08 16:34:30 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
2022-05-08 16:34:40 +0200 | <Simon98> | So e. g. allSame 1 2 3 |
2022-05-08 16:34:41 +0200 | <Simon98> | is basically |
2022-05-08 16:34:41 +0200 | <Simon98> | Eq a => 1 -> 2 -> 3 -> false |
2022-05-08 16:34:42 +0200 | <Simon98> | ? |
2022-05-08 16:34:52 +0200 | <ski> | the `=>' arrow separates the constraint context (to the left) from the usual (parameter and result types) signature. `Eq a' is a constraint that says that you can only use this operation (`allSame'), in case the argument type `a' is an instance of the type class `Eq', which is the case if it supports equality (checking) (`(==)' and `(/=)') |
2022-05-08 16:34:57 +0200 | <ski> | no |
2022-05-08 16:35:15 +0200 | <ski> | if `1',`2',`3' there have type `Integer', then, for this call to `allSame', `a' becomes `Integer' |
2022-05-08 16:35:18 +0200 | <ski> | iow |
2022-05-08 16:35:20 +0200 | <Simon98> | What do i use for the first a? And where does the "Eq" come from? Is it like "Eq a => a -> a -> a -> Bool" is the description for each "==" comparison? |
2022-05-08 16:35:21 +0200 | <ski> | allSame :: Eq a => a -> a -> a -> Bool |
2022-05-08 16:35:22 +0200 | <ski> | becomes |
2022-05-08 16:35:33 +0200 | <ski> | allSame :: Eq Integer => Integer -> Integer -> Integer -> Bool |
2022-05-08 16:35:47 +0200 | <ski> | but since `Eq Integer' holds, it's a known fact, this simplifies to just |
2022-05-08 16:35:52 +0200 | <ski> | allSame :: Integer -> Integer -> Integer -> Bool |
2022-05-08 16:36:21 +0200 | <ski> | (which then gives the actual type used for this call to `allSame') |
2022-05-08 16:36:52 +0200 | <ski> | the `Eq a' constraint comes because you're calling `(==)', which has type `Eq a => a -> a -> Bool' |
2022-05-08 16:37:24 +0200 | <ski> | you can only do equality checking on values of a type that supports equality checking (a type that is an instance of `Eq') |
2022-05-08 16:38:03 +0200 | <Simon98> | very interesting |
2022-05-08 16:38:10 +0200 | <Simon98> | but wait |
2022-05-08 16:38:10 +0200 | <tomsmeding> | Read `Eq a => a -> a -> Bool` like "if `Eq a` holds, then this has type `a -> a -> Bool`" |
2022-05-08 16:38:31 +0200 | <tomsmeding> | Or, well, that's one way to read it, at least |
2022-05-08 16:38:47 +0200 | <ski> | so, for that to work, either (a) you need to use some particular type (that is known to be an instance of `Eq'), like `Integer', or `[(String,Bool)]' or something; or (b) you can delegate the responsibility for ensuring that `a' is in `Eq', which is what your current `allSame' does (because it has `Eq a' as a constraint in *its* type signature) |
2022-05-08 16:39:03 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 256 seconds) |
2022-05-08 16:39:13 +0200 | <Simon98> | But what do you mean with "if `Eq a` holds"? Holds what? |
2022-05-08 16:39:26 +0200 | <geekosaur> | different usage of "holds" |
2022-05-08 16:39:37 +0200 | <geekosaur> | try "if a is a type that has an Eq instance" |
2022-05-08 16:39:44 +0200 | <ski> | "`Eq a' holds" is a brief way to say "`a' is an instance of `Eq'" or "there is an `Eq a' instance" |
2022-05-08 16:40:23 +0200 | <ski> | `Eq Integer' holds, because, somewhere in the base library, there is a declaration |
2022-05-08 16:40:29 +0200 | <ski> | instance Eq Integer |
2022-05-08 16:40:29 +0200 | <ski> | where |
2022-05-08 16:40:36 +0200 | <ski> | ... == ... = ... |
2022-05-08 16:40:39 +0200 | <ski> | ... /= ... = ... |
2022-05-08 16:40:39 +0200 | <geekosaur> | importantly, only *types* are typeclass instances, not values |
2022-05-08 16:40:52 +0200 | <Simon98> | Instead of "is an instance of" could also be said: "a is an object of something that inherits from the class Eq" or so? |
2022-05-08 16:41:15 +0200 | <ski> | that declaration gives the actual implementation (the code) that will be run, when calling `(==)' and `(/=)' on `Integer's |
2022-05-08 16:41:22 +0200 | <geekosaur> | typeclasses are not OOP |
2022-05-08 16:41:29 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 248 seconds) |
2022-05-08 16:41:31 +0200 | <Simon98> | Ah right |
2022-05-08 16:41:38 +0200 | <ski> | Simon98 : no, `a' is not an object (objects are values). `a' is a type |
2022-05-08 16:41:48 +0200 | wroathe | (~wroathe@user/wroathe) (Ping timeout: 260 seconds) |
2022-05-08 16:41:50 +0200 | <ski> | `a' doesn't exist at run-time |
2022-05-08 16:42:02 +0200 | <ski> | (instances do, though) |
2022-05-08 16:42:56 +0200 | <Simon98> | Ohhh, but ´a` (lets say, it's Integer in our example) is not just in instance of Eq but also of many other classes (?) like Num, right? |
2022-05-08 16:43:03 +0200 | <Simon98> | or maybe not "many" but still |
2022-05-08 16:43:05 +0200 | <[exa]> | Simon98: the intuition from OOP "traits" is kinda useful, but there are significant differences from the common OOP use. Most notably, typeclasses aren't objects but actual predicates, a bit more like c++ concepts |
2022-05-08 16:43:08 +0200 | <tomsmeding> | Simon98: don't get confused by the _type_ `a` being called the same as the first _argument_ to the function, also called `a` |
2022-05-08 16:43:15 +0200 | <tomsmeding> | They're completely different things |
2022-05-08 16:43:21 +0200 | <ski> | Simon98 : sure, yes |
2022-05-08 16:44:11 +0200 | <ski> | (it might be helpful to rename the parameters to say `x',`y',`z', to avoid confusing them with the type variables in the type signature) |
2022-05-08 16:44:43 +0200 | <Simon98> | tomsmeding Ohhh, right |
2022-05-08 16:45:01 +0200 | <Simon98> | ski Ohh, I'll try that |
2022-05-08 16:45:08 +0200 | <Simon98> | So helpful all of you guys, thanks a lot ! |
2022-05-08 16:45:17 +0200 | <Simon98> | So: |
2022-05-08 16:45:23 +0200 | <ski> | (eventually, you get used to the distinction, and then the name-punning can be useful) |
2022-05-08 16:45:59 +0200 | ski | still doesn't like punning a type constructor with a data constructor, though |
2022-05-08 16:46:00 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 276 seconds) |
2022-05-08 16:46:19 +0200 | <ski> | (i guess, partially, because the scope of those are not local) |
2022-05-08 16:47:21 +0200 | <Simon98> | If I understand correctly now, "allSame :: Eq a => a -> a -> a -> Bool" is not an description of what the function "allSame" actually does (you could just guess that it does comparation) but it is just an description (or a guideline?) of the Types used and part of that function? |
2022-05-08 16:47:43 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) |
2022-05-08 16:49:34 +0200 | <Simon98> | ski Hmm, the renaming didn't work as expected: Prelude> allSame x y z = (x==y && y==z) |
2022-05-08 16:49:35 +0200 | <Simon98> | allSame :: Eq a => a -> a -> a -> Bool |
2022-05-08 16:50:14 +0200 | <[exa]> | Simon98: yes, a "description of the admissible types" would work. If you know C++, in C++ it would be something like `template<typename a> bool allSame(a, a, a);` |
2022-05-08 16:51:33 +0200 | <[exa]> | Simon98: btw try removing the `&& y==z` part from the comparison and see what happens with the type. |
2022-05-08 16:52:13 +0200 | <ski> | Simon98 : why didn't you expect that ? |
2022-05-08 16:52:27 +0200 | ccntrq | (~Thunderbi@dynamic-095-112-198-016.95.112.pool.telefonica.de) (Remote host closed the connection) |
2022-05-08 16:52:29 +0200 | <ski> | (it looks like the result you got would be what i would expect ..) |
2022-05-08 16:52:47 +0200 | <ski> | the parameter (values) are `x',`y',`z'. their common type is `a' |
2022-05-08 16:52:59 +0200 | <[exa]> | Simon98: for comparison again, c++ version for your unexpected result is: `template<typename a> allSame(a x, a y, a z) {...}` |
2022-05-08 16:53:20 +0200 | ski | idly wonders whether Simon98 even has seen C++ |
2022-05-08 16:53:33 +0200 | <[exa]> | ah. |
2022-05-08 16:54:04 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
2022-05-08 16:54:25 +0200 | <ski> | (asking, not insinuating) |
2022-05-08 16:55:05 +0200 | <[exa]> | as usual, I didn't really read much of scrollback. :] |
2022-05-08 16:55:51 +0200 | nate1 | (~nate@98.45.169.16) |
2022-05-08 16:59:41 +0200 | ski | . o O (: hindsight, what's that ? :) |
2022-05-08 16:59:42 +0200 | <Simon98> | [exa] I'm not familiar with C++ but your notation reminds me of Java Generics |
2022-05-08 17:00:20 +0200 | <ski> | yea, in Java, it'd be `<a> allSame(a x,a y,a z) { ... }', iirc |
2022-05-08 17:00:21 +0200 | <Simon98> | Why is there sometimes a * before your name ski and your Name is not before the time? |
2022-05-08 17:00:23 +0200 | <Simon98> | in the chat |
2022-05-08 17:00:31 +0200 | <Simon98> | Ohhhhhhhhhhhhh |
2022-05-08 17:00:33 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 17:00:36 +0200 | ski | glances around nervously |
2022-05-08 17:00:41 +0200 | <ski> | it's called an ACTION |
2022-05-08 17:00:44 +0200 | <Simon98> | So it can somehow be compared to Java Generics? |
2022-05-08 17:00:47 +0200 | <ski> | try entering the following : |
2022-05-08 17:00:52 +0200 | nate1 | (~nate@98.45.169.16) (Ping timeout: 260 seconds) |
2022-05-08 17:00:57 +0200 | <ski> | /me nods and smiles |
2022-05-08 17:01:39 +0200 | <Simon98> | ski it confused me because of what you said here "(it might be helpful to rename the parameters to say `x',`y',`z', to avoid confusing them with the type variables in the type signature)", but now I get it (was thinking in a wrong way |
2022-05-08 17:01:43 +0200 | <Simon98> | ) |
2022-05-08 17:01:53 +0200 | Simon98 | nods and smiles |
2022-05-08 17:01:56 +0200 | <Simon98> | hahahaha |
2022-05-08 17:02:05 +0200 | Simon98 | finds that nice |
2022-05-08 17:02:13 +0200 | <ski> | it's typically used to describe something you're doing, or else describe some property of yourself (in *third* person, mind !) .. i also often use it for various associations i get and things i'm reminded of |
2022-05-08 17:03:42 +0200 | <Simon98> | [exa] I tried it and look what happened: allSameX :: Eq a => a -> a -> p -> Bool |
2022-05-08 17:03:43 +0200 | <Simon98> | So p can be z different type then x and y? But doesn't that disagree with the Eq restriction of only comparing same types? |
2022-05-08 17:04:11 +0200 | <ski> | anyway, using type variables (begins with lower case (or `_')) in a type signature, indicates parametric polymorphism (which is called "generics", in e.g. Java). the initial `<typename a>' / `<a>' part can (usually) be elided in Haskell, but you can also spell it out explicitly as `forall a. ' |
2022-05-08 17:04:21 +0200 | <ski> | allSame :: forall a. Eq a => a -> a -> a -> Bool |
2022-05-08 17:05:56 +0200 | <ski> | (you'll need to enable at least `ExplicitForAll' to be able to do that. there are a couple of more extensions that actually let you do *more* with `forall' than merely being explicit, rather than eliding a `forall' (letting the implementation implicitly insert it at the start, right after the `::')) |
2022-05-08 17:07:22 +0200 | <ski> | Simon98 : yes, the type of `x' is `a' and the type of `y' is also `a', in that signature. but the type of `z' is `p', which is a distinct type variable, because `z' is not compared (for equality) with `x' nor `y', and so there's no need to assume it needs to have the same type, and so the implementation inferred a distinct type variable as its type (and for some reason happened to call that `p') |
2022-05-08 17:07:58 +0200 | <ski> | "So p can be z different type then x and y?" -- right. "But doesn't that disagree with the Eq restriction of only comparing same types?" -- no, because you removed the comparision of `z' with one of `x' and `y' |
2022-05-08 17:08:22 +0200 | <ski> | (specifically `y', i see above) |
2022-05-08 17:09:36 +0200 | <Simon98> | I see, thank you! |
2022-05-08 17:09:46 +0200 | <Simon98> | Why do you think the letter "p" was used? |
2022-05-08 17:09:51 +0200 | <ski> | @type (==) |
2022-05-08 17:09:53 +0200 | <lambdabot> | Eq a => a -> a -> Bool |
2022-05-08 17:09:57 +0200 | <ski> | hm |
2022-05-08 17:10:03 +0200 | <ski> | dunno |
2022-05-08 17:10:40 +0200 | <geekosaur> | that has to do with the guts of the typechecker, which generally aren't introspectable |
2022-05-08 17:11:01 +0200 | <geekosaur> | it tends to pick "t" or "p" in recent versions |
2022-05-08 17:11:20 +0200 | <ski> | (sometimes it picks up a type variable name from a particular type variable name in an explicit type signature of an operation that is used, involving the type variable with it) |
2022-05-08 17:12:25 +0200 | random-jellyfish | (~random-je@user/random-jellyfish) (Quit: Client closed) |
2022-05-08 17:12:39 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) |
2022-05-08 17:14:02 +0200 | uam | (uid360535@id-360535.hampstead.irccloud.com) |
2022-05-08 17:14:49 +0200 | <[exa]> | Simon98: a _p_arameter type, perhaps. The names of the variables don't really matter. |
2022-05-08 17:15:12 +0200 | Pickchea | (~private@user/pickchea) |
2022-05-08 17:15:20 +0200 | <Simon98> | And another thing: Let's stay with " allSameX :: Eq a => a -> a -> p -> Bool" |
2022-05-08 17:15:20 +0200 | <Simon98> | Are the arrows also actually meaning "flow" or something? Because that would not make sense. |
2022-05-08 17:15:21 +0200 | <Simon98> | With the "allSame :: Eq a(0) => a(1) -> a(2) -> a(3) -> Bool" [I added the numbers] I could have imagined that we do one comparison and then the a(1) yet again will be type a(2) and with the next comparison it will stlil be a(3). |
2022-05-08 17:15:21 +0200 | <Simon98> | But actually not even that makes sense since after one comparison they would already be Booleans instead of Integers |
2022-05-08 17:15:51 +0200 | <Simon98> | [exa] how do you do the underlining? |
2022-05-08 17:16:09 +0200 | <[exa]> | put underscores around, many clients will render it right |
2022-05-08 17:16:14 +0200 | <[exa]> | (mine does not tbh... :D ) |
2022-05-08 17:16:16 +0200 | <Simon98> | I don't know why the name linking does not work sometimes. I typed "[e" then pressed tab and then enter or so |
2022-05-08 17:16:31 +0200 | <Simon98> | _p_ |
2022-05-08 17:16:43 +0200 | <[exa]> | also the [ in my nick is not very popular with client software. I should get rid of it. :D |
2022-05-08 17:17:02 +0200 | <Simon98> | Ahh. In my case it looks like doubleUnderline then p underlined then another double underline |
2022-05-08 17:17:06 +0200 | agumonkey | (~user@88.163.231.79) |
2022-05-08 17:17:20 +0200 | <[exa]> | anyway, regarding the "flow" -- (->) is the actual type of a haskell function, and we technically only have 1-parameter functions |
2022-05-08 17:17:40 +0200 | <[exa]> | so if you'd really print the allSame type as-is, you'd get something like: |
2022-05-08 17:17:59 +0200 | <[exa]> | `a -> (a -> (a -> Bool))` |
2022-05-08 17:18:10 +0200 | <[exa]> | (I omitted the Eq) |
2022-05-08 17:18:15 +0200 | <yushyin> | with decent clients you can write ex<tab> and it will become [exa] |
2022-05-08 17:19:11 +0200 | <[exa]> | Simon98: the logic behind the parenthesization is that basically you feed the function parameters, and it becomes to something simpler and simpler, until it eventually becomes the Bool (which is not a function type, so you can't feed it parameters) |
2022-05-08 17:19:34 +0200 | <Simon98> | So in practice it could be `Integer -> (Integer -> (Integer -> Bool))` |
2022-05-08 17:19:37 +0200 | <[exa]> | yes |
2022-05-08 17:19:47 +0200 | <Simon98> | waaaaaaait |
2022-05-08 17:20:01 +0200 | <Simon98> | could you please also formulate it as math functions? with f(a) ? |
2022-05-08 17:20:01 +0200 | <[exa]> | Illustration: |
2022-05-08 17:20:30 +0200 | <hpc> | in that notation it'd be like saying f(a)(b)(c) |
2022-05-08 17:20:39 +0200 | <[exa]> | ah yes, in the usual prefix notation, you'd write a single-parameter function not as `a->b` but as `(->) a b` |
2022-05-08 17:21:08 +0200 | <[exa]> | (compare with `1+2` vs `(+) 1 2` vs `plus(1,2)` from other languages) |
2022-05-08 17:21:20 +0200 | <hpc> | and in fact it's that exact notation in a lot of other languages where you can attempt such things |
2022-05-08 17:21:52 +0200 | <hpc> | although then it's really tedious, you have to write stuff like f = function(a){return function(b){return function(c){...}}} |
2022-05-08 17:22:53 +0200 | <hpc> | ^ is javascript, if you want to pop into an f12 console and try it out |
2022-05-08 17:22:54 +0200 | <[exa]> | :t let allSame a b c = a==b && b==c in (allSame, allSame 1, allSame 1 2, allSame 1 2 3) |
2022-05-08 17:22:56 +0200 | <lambdabot> | (Eq a1, Eq a2, Eq a3, Num a2, Num a3) => (a1 -> a1 -> a1 -> Bool, a2 -> a2 -> Bool, a3 -> Bool, Bool) |
2022-05-08 17:23:36 +0200 | <Simon98> | what is the prefix notation again in "allSame a b c = a==b && b==c"? |
2022-05-08 17:23:51 +0200 | agumonkey | (~user@88.163.231.79) (Remote host closed the connection) |
2022-05-08 17:23:52 +0200 | <Simon98> | and hpc |
2022-05-08 17:24:18 +0200 | <Simon98> | and hpc why would you put a type class (=a) in a function and not the actual value? (f(a)(b)(c)) |
2022-05-08 17:25:16 +0200 | hgolden | (~hgolden2@cpe-172-251-233-141.socal.res.rr.com) |
2022-05-08 17:25:20 +0200 | frost | (~frost@user/frost) (Ping timeout: 252 seconds) |
2022-05-08 17:26:23 +0200 | <[exa]> | Simon98: where's the typeclass? |
2022-05-08 17:26:24 +0200 | <geekosaur> | > let allSame a b c = a == b && b == c in allSame "foo" "foo" "foo" -- works for any type with an Eq instance, not just Integer |
2022-05-08 17:26:25 +0200 | <lambdabot> | True |
2022-05-08 17:26:44 +0200 | <hpc> | those were the values |
2022-05-08 17:26:47 +0200 | pavonia | (~user@user/siracusa) (Quit: Bye!) |
2022-05-08 17:26:49 +0200 | <hpc> | pretend i wrote f(x)(y)(z) :P |
2022-05-08 17:27:34 +0200 | <Simon98> | can this _function_ *in* _function applications_ be paraphrased to *use* _function_ *with* _function applications_ for me to better understand it? |
2022-05-08 17:30:11 +0200 | <Simon98> | I get the latter parenthesis (good example!) but why are there 5 elements in the first parenthesis? |
2022-05-08 17:30:12 +0200 | <Simon98> | (Eq a1, Eq a2, Eq a3, Num a2, Num a3) => (a1 -> a1 -> a1 -> Bool, a2 -> a2 -> Bool, a3 -> Bool, Bool) |
2022-05-08 17:30:47 +0200 | coot | (~coot@213.134.190.95) (Quit: coot) |
2022-05-08 17:30:54 +0200 | <[exa]> | Simon98: it actually needs to describe a lot of constraints in the returned types, so there they are: |
2022-05-08 17:30:54 +0200 | <geekosaur> | because each call is considered separately |
2022-05-08 17:30:55 +0200 | haskell_apprenti | (~haskell_a@cpe-74-71-248-39.nyc.res.rr.com) |
2022-05-08 17:32:00 +0200 | <[exa]> | in order, `Eq a1` ensures that the types of the parameters of the first `allSame` are comparable, similarly for `Eq a2` and `Eq a3`. Fully applied `allSame 1 2 3` doesn't need any constraint because it just returns Bool, no matter what. |
2022-05-08 17:32:10 +0200 | <Simon98> | hpc but what should " f(x)(y)(z) " mean? |
2022-05-08 17:32:11 +0200 | <Simon98> | Like f(x,y,z) or h(g(f(x))) with f(x) = y and g(y) = z would make sense for me but your notation not |
2022-05-08 17:32:46 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
2022-05-08 17:32:54 +0200 | <[exa]> | Then `Num a2` is there because I already put `1` into `allSame 1`, and `1` can stand as any numeric type. So it tells you an extra information that you must put in other arguments as numeric too -- for example you couldn't do `allSame 1 "whatevs"` |
2022-05-08 17:33:06 +0200 | <[exa]> | (similar for Num a3) |
2022-05-08 17:33:36 +0200 | <Simon98> | ahh, thanks [exa] |
2022-05-08 17:33:52 +0200 | <Simon98> | and how would you paraphrase the "=>" here? |
2022-05-08 17:33:58 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 17:34:08 +0200 | <[exa]> | haha, tricky |
2022-05-08 17:35:14 +0200 | <Simon98> | :) |
2022-05-08 17:35:38 +0200 | <haskell_apprenti> | question: I'm going through Haskell programming from first principles, in the book they say a function with the signature blahFunc :: b -> String totally throws away its first argument and is effectively a constant value of type String. Can't we define a toString method that works for every type? I find it hard to reason about saying a function has |
2022-05-08 17:35:39 +0200 | <haskell_apprenti> | to be a particular function due to its type signature |
2022-05-08 17:35:44 +0200 | <[exa]> | it's an actual implication, given you have an `a` that satisfies the `Eq`, you can assume that your type is a->a->... |
2022-05-08 17:36:34 +0200 | <geekosaur> | haskell_apprenti, what would toString be for a function? |
2022-05-08 17:36:42 +0200 | <Simon98> | wow |
2022-05-08 17:36:58 +0200 | <Simon98> | Is the "=>" in Haskell syntax always an actual implication? |
2022-05-08 17:37:00 +0200 | <geekosaur> | remember, Haskell is compiled, it does not have the source code available, especially for a typeclass method like (+) |
2022-05-08 17:37:01 +0200 | <[exa]> | haskell_apprenti: "for every type" is hard. Do you know what custom-defined type am I going to send you in 5 minutes from now? |
2022-05-08 17:37:47 +0200 | <haskell_apprenti> | doesn't all data need some kind of text representation to be viewed on a screen though? |
2022-05-08 17:38:15 +0200 | <[exa]> | haskell_apprenti: that implies that you already know something about the type. That would be `blahFunc :: HasBitRepresentation b => b->String` |
2022-05-08 17:39:04 +0200 | <haskell_apprenti> | don't all types need a data declaration though? so theoretically you can print that, since that's common to all types. just for the sake of argument |
2022-05-08 17:39:20 +0200 | <Simon98> | And is one implication here sufficient ((Eq a1, Eq a2, Eq a3, Num a2, Num a3) => (a1 -> a1 -> a1 -> Bool, a2 -> a2 -> Bool, a3 -> Bool, Bool)) because you put the function applications all in one parenthesis ((allSame, allSame 1, allSame 1 2, allSame 1 2 3)) and therefore to make it work everything has to meet the requirements at a time? |
2022-05-08 17:39:42 +0200 | <[exa]> | haskell_apprenti: yes, there's actually a typeclass for that too (Generic). But still if you use it, you have to declare it. |
2022-05-08 17:40:24 +0200 | <[exa]> | Simon98: yes, it's 1 big type with 1 big sets of "conditions", so only a single => is required in between |
2022-05-08 17:40:29 +0200 | Guest9113 | (~Guest91@84-75-254-89.dclient.hispeed.ch) (Quit: Client closed) |
2022-05-08 17:40:40 +0200 | ski | . o O ( no underscores ) |
2022-05-08 17:41:01 +0200 | <ski> | haskell_apprenti : types that are primitive doesn't need `data' or `newtype' declarations |
2022-05-08 17:41:20 +0200 | <[exa]> | Simon98: you can definitely try for isolated (partial) calls of allSame in your ghci, with different argument types. It should become quite intuitive once you play with it for some time |
2022-05-08 17:41:58 +0200 | <ski> | e.g. `(->)' .. or, an implementation could have `Char',`Int',`Integer',`Float',`Double',`Array',`IO',`IORef' all be primitive, as well |
2022-05-08 17:43:55 +0200 | <ski> | @type let foo x = (typeOf x,cast x :: Maybe String) in foo |
2022-05-08 17:43:57 +0200 | <lambdabot> | Typeable a => a -> (TypeRep, Maybe String) |
2022-05-08 17:43:59 +0200 | <ski> | > let foo x = (typeOf x,cast x :: Maybe String) in foo False |
2022-05-08 17:44:01 +0200 | <lambdabot> | (Bool,Nothing) |
2022-05-08 17:44:06 +0200 | <ski> | > let foo x = (typeOf x,cast x :: Maybe String) in foo "True" |
2022-05-08 17:44:08 +0200 | <lambdabot> | ([Char],Just "True") |
2022-05-08 17:44:51 +0200 | <haskell_apprenti> | [exa] geekosaur I think I understand thinking about it more, thanks |
2022-05-08 17:45:24 +0200 | <geekosaur> | now, we do have a typeclass for what you've been talking about: Show |
2022-05-08 17:45:30 +0200 | Simon98 | (~Simon@ipbcc036f5.dynamic.kabel-deutschland.de) (Quit: Client closed) |
2022-05-08 17:45:31 +0200 | <geekosaur> | and your toString is show |
2022-05-08 17:45:51 +0200 | <[exa]> | haskell_apprenti: btw the "some kind of representation exists" doesn't really hold in haskell programs. Stuff may be easily erased before it reaches runtime, and there are actual definition-less types (`data Void`) |
2022-05-08 17:45:53 +0200 | <geekosaur> | but again you must declare that you're using it |
2022-05-08 17:46:42 +0200 | <ski> | haskell_apprenti : you can use `Typeable', if you want to do type casting stuff. `Generic' to actually do introspect stuff on how the type was declared |
2022-05-08 17:47:03 +0200 | xff0x | (~xff0x@om126254226100.33.openmobile.ne.jp) (Ping timeout: 256 seconds) |
2022-05-08 17:47:34 +0200 | <ski> | (well, i'd rather say that `Void' has a collection of data constructors .. it just happens to be the empty collection) |
2022-05-08 17:49:03 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 276 seconds) |
2022-05-08 17:49:04 +0200 | Vajb | (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56) (Read error: Connection reset by peer) |
2022-05-08 17:49:14 +0200 | Vajb | (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
2022-05-08 17:49:35 +0200 | <ski> | haskell_apprenti : anyway .. what you might see as an annoyance here is actually a boon, in the sense that it allows one to reason about, infer stronger properties (things an operation definitely *can't* do), solely by inspecting its type signature. this is called "parametricity". parametric polymorphism in Haskell enjoys this. parametric polymorphism (called "generics") in e.g. Jave doesn't, because of |
2022-05-08 17:49:41 +0200 | <ski> | `instanceof' and up-casting (and methods on `Object') |
2022-05-08 17:51:00 +0200 | <haskell_apprenti> | I don't find it annoying, I'm just interested in the theory of why its definitely true that a particular type signature must have a certain type implentation |
2022-05-08 17:51:26 +0200 | <haskell_apprenti> | like id be interested if there are proofs about it written somewhere if anyone could point me to that |
2022-05-08 17:51:36 +0200 | <ski> | e.g. if you see `foo :: (a -> Maybe b) -> [a] -> [b]', you *know* that `foo' can't itself inspect the `a' elements of the list, but can only pass them on to the callback, which is also the only place where the `b' elements in the output could possibly come from (apart from using `undefined' & `error' & `Control.Exception.throw', or infinite loops) |
2022-05-08 17:51:45 +0200 | <haskell_apprenti> | sorry not type implementation, concrete function implemenetation |
2022-05-08 17:52:18 +0200 | <ski> | @free bar :: Int -> [a] -> [a] |
2022-05-08 17:52:18 +0200 | <lambdabot> | $map f . bar x = bar x . $map f |
2022-05-08 17:52:54 +0200 | <ski> | this is a "free theorem", that says that it doesn't matter if you map some function `f' to the elements of the list, before or after you call `bar', since `bar' definitely won't look at, or change, the elements |
2022-05-08 17:53:20 +0200 | <ski> | (and this relies on parametricity) |
2022-05-08 17:53:31 +0200 | <ski> | @help free |
2022-05-08 17:53:31 +0200 | <lambdabot> | free <ident>. Generate theorems for free |
2022-05-08 17:54:01 +0200 | <ski> | @free transpose |
2022-05-08 17:54:03 +0200 | <lambdabot> | $map ($map f) . transpose = transpose . $map ($map f) |
2022-05-08 17:54:11 +0200 | <ski> | @free concat :: [[a]] -> [a] |
2022-05-08 17:54:12 +0200 | <lambdabot> | $map f . concat = concat . $map ($map f) |
2022-05-08 17:55:49 +0200 | <haskell_apprenti> | ski don't understand the @ free thing |
2022-05-08 17:56:30 +0200 | <ski> | @free reverse |
2022-05-08 17:56:31 +0200 | <lambdabot> | $map f . reverse = reverse . $map f |
2022-05-08 17:56:34 +0200 | <haskell_apprenti> | I feel like what you're saying though is since its parametrically polymorphic, the only thing we could do that will work with all types is pass it through eg identity |
2022-05-08 17:56:54 +0200 | <haskell_apprenti> | and the extension of that eg with list of types, pass through list of types |
2022-05-08 17:57:14 +0200 | <ski> | it says `$map' instead of `map', since it's assuming a generic mapping. but they should be the same. so read that as claiming |
2022-05-08 17:57:23 +0200 | <ski> | map f . reverse = reverse . map f |
2022-05-08 17:57:39 +0200 | <ski> | is a true law/equality/equation (for every function `f') |
2022-05-08 17:57:57 +0200 | <ski> | or, expanding (putting in an explicit argument), this says that |
2022-05-08 17:58:05 +0200 | <ski> | (map f . reverse) xs = (reverse . map f) xs |
2022-05-08 17:58:11 +0200 | <ski> | (for every `f' and every list `xs') |
2022-05-08 17:58:28 +0200 | <ski> | which is the same (by the definition of function composition, `(.)') |
2022-05-08 17:58:40 +0200 | <ski> | map f (reverse xs) = reverse (map f xs) |
2022-05-08 17:58:49 +0200 | <[exa]> | haskell_apprenti: that's true, the only non-crashing function with type `a->a` is id. The only other thing you can do in haskell is to crash it with `undefined`. |
2022-05-08 17:58:57 +0200 | <haskell_apprenti> | ski think i need the ELI5 version |
2022-05-08 17:59:21 +0200 | <ski> | and now this is explicitly saying that if you reverse `xs', and then `map' `f' on every element of the reversed list, then that's the same as first mapping `f' on `xs', and then reversing the mapped list |
2022-05-08 17:59:27 +0200 | <haskell_apprenti> | [exa] is that proven formally somewhere |
2022-05-08 17:59:53 +0200 | <[exa]> | yes |
2022-05-08 18:00:10 +0200 | <ski> | haskell_apprenti : do you understand the last version of the equation, above ? |
2022-05-08 18:00:21 +0200 | <ski> | (with my attempted elucidation of it) |
2022-05-08 18:00:45 +0200 | <ski> | btw, you could perhaps try checking "Theorems for free!" by Philip Wadler in 1989-09 at <https://homepages.inf.ed.ac.uk/wadler/topics/parametricity.html#free> |
2022-05-08 18:01:23 +0200 | <haskell_apprenti> | [exa] can you point me to where that is proven |
2022-05-08 18:01:35 +0200 | <haskell_apprenti> | ski yes I think I understand that last version thanks |
2022-05-08 18:01:41 +0200 | <[exa]> | yes, trying to find it written somewhere |
2022-05-08 18:02:01 +0200 | <[exa]> | (likely the Wadler's paper above will contain the intuition too) |
2022-05-08 18:02:02 +0200 | <haskell_apprenti> | ski I understand the statement of the theorem, but how do we know its true |
2022-05-08 18:02:28 +0200 | <ski> | the previous versions are merely fancy (so-called, "pointless") ways to express the same thing (using composition / function pipeline, instead) |
2022-05-08 18:03:50 +0200 | <haskell_apprenti> | ahh ok that wadler "theorems for free" looks like what I want to look at |
2022-05-08 18:03:54 +0200 | <haskell_apprenti> | looks dense thuogh |
2022-05-08 18:03:59 +0200 | <haskell_apprenti> | thanks for the help! |
2022-05-08 18:06:33 +0200 | <ski> | haskell_apprenti : we know it holds for an idealized calculus (second-order polymorphic lambda calculus (F2), in the papers mentioning Reynolds in the abstract, at the link i gave you), because of the abstraction theorem. the "theorems for free" is about deriving an immediate result/law, from a `forall'-type (a universal type), using that theorem |
2022-05-08 18:08:39 +0200 | <ski> | i'm not sure if someone has attempted to prove the corresponding thing, for a system that looks more like Haskell (including various stuff like partiality, nontermination, and possibly a bunch of fancy type system features making it more powerful than F2) .. but we're basically treating it like it behaves similarly |
2022-05-08 18:08:57 +0200 | <[exa]> | haskell_apprenti: btw it's useful to read about curry-howard correspondence; by dragging in logic it paints a much cleaner image of stuff that can't be done. E.g. here: https://en.wikibooks.org/wiki/Haskell/The_Curry%E2%80%93Howard_isomorphism#Intuitionistic_vs_class… |
2022-05-08 18:09:20 +0200 | <ski> | (don't worry, the "full abstraction" stuff by Reynolds is denser) |
2022-05-08 18:11:05 +0200 | <ski> | for Curry-Howard, it can also be neat if one knows a little about basic set theory (cardinality, cartesian product, disjoint union, exponential set (function set)) |
2022-05-08 18:13:18 +0200 | <ski> | haskell_apprenti : "but how do we know its true" -- from an appeal to intuition standpoint, there is no way that `reverse' could inspect or interact with the elements (apart from forcing them, and the worst that may do is give nontermination or partiality). .. so, the only thing it can do is return some of the input elements, as output elements (possibly reordering, and possibly duplicating (and dropping |
2022-05-08 18:13:24 +0200 | <ski> | others)) |
2022-05-08 18:13:49 +0200 | <ski> | but its behaviour can't depend on the innards of the elements, it can only depend on the length of the input list |
2022-05-08 18:14:22 +0200 | Simon91 | (~Simon@ipbcc036f5.dynamic.kabel-deutschland.de) |
2022-05-08 18:14:26 +0200 | <Simon91> | Hello again |
2022-05-08 18:14:52 +0200 | <ski> | (the only way to depend on the innards would be to either pass off an element to a callback (but there's no such, in this case), or to use a typeclass-overloaded operation on them (but there's no class constraints in the type signature, so that's not going to happen, either)) |
2022-05-08 18:15:34 +0200 | <Simon91> | GHCI coming up with "funktionB :: Integral a => [a] -> [a]" for "funktionB x = [ if (y `mod` 2 /= 0) then (2 * y) else y | y <- x]" is due to GHCI being smart and knowing that you need Integers for the operations in brackets? |
2022-05-08 18:16:33 +0200 | <c_wraith> | It's inference from the way the elements are used. |
2022-05-08 18:16:34 +0200 | <ski> | if you do `foo :: Eq a => Int -> [a] -> [a]', then `foo' can pass off elements to `(==)' and `(/=)' (and other operations with an `Eq' constraint, like e.g. `allDistinct :: Eq a => [a] -> Bool') |
2022-05-08 18:16:52 +0200 | <c_wraith> | You're using (/=), (*), and mod. |
2022-05-08 18:17:03 +0200 | <ski> | @type mod |
2022-05-08 18:17:04 +0200 | <lambdabot> | Integral a => a -> a -> a |
2022-05-08 18:17:14 +0200 | <ski> | @type (*) |
2022-05-08 18:17:17 +0200 | <lambdabot> | Num a => a -> a -> a |
2022-05-08 18:17:19 +0200 | <ski> | @type (/=) |
2022-05-08 18:17:20 +0200 | <lambdabot> | Eq a => a -> a -> Bool |
2022-05-08 18:17:28 +0200 | <ski> | `Num' and `Eq' are superclasses of `Integral' |
2022-05-08 18:17:31 +0200 | <c_wraith> | from that, it derives Eq, Num, and Integral - but it turns out Integral requires Eq and Num, so it reduces the display set |
2022-05-08 18:18:02 +0200 | <ski> | Simon91 : also, your (round) brackets there are redundant |
2022-05-08 18:20:04 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
2022-05-08 18:20:28 +0200 | <c_wraith> | Oh, there's one other thing contributing to inference there - the 0 literal. It also implies a Num constraint. It's redundant in this case, but worth knowing |
2022-05-08 18:20:46 +0200 | <c_wraith> | Err. the 0 and 2 literals. |
2022-05-08 18:20:49 +0200 | <Simon91> | c_wraith and it chooses Integral because it always chooses the most sub subclass from all classes involved? |
2022-05-08 18:20:53 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
2022-05-08 18:21:13 +0200 | <c_wraith> | Simon91: no, doesn't show Eq or Num because they're implied by Integral |
2022-05-08 18:21:36 +0200 | <ski> | haskell_apprenti : so, anyway. the only way to do type introspection stuff, and being able to look "inside" an input whose type is a type variable (apart from passing it off to a callback that accepts it, but then the callback comes from the caller, not the callee/implementor of the operation) is to explicitly opt-in to it, by using a `Typable' or `Generic' constraint, or so, on the type variable |
2022-05-08 18:21:58 +0200 | <ski> | (well, there's also GADTs ..) |
2022-05-08 18:22:05 +0200 | <Simon91> | ski yeah I thought so, but it felt weird and error-prone not putting them (even though it's probably the other way round) |
2022-05-08 18:22:06 +0200 | <c_wraith> | Simon91: that may sound like the same thing, but classes aren't all in a single hierarchy |
2022-05-08 18:22:44 +0200 | <c_wraith> | Simon91: so there's no guarantee there is such a thing as a single most-sub subclass. |
2022-05-08 18:22:45 +0200 | <Simon91> | c_wraith I see. Very interesting. |
2022-05-08 18:22:54 +0200 | <ski> | Simon91 : pointing out redundant brackets (when it's likely they weren't put in consciously for an explicit reason), is a pet peeve of mine ;) |
2022-05-08 18:23:17 +0200 | Pickchea | (~private@user/pickchea) (Quit: Leaving) |
2022-05-08 18:23:19 +0200 | <Simon91> | hahah |
2022-05-08 18:23:42 +0200 | <c_wraith> | ski: parse error, unmatched closing ')' at end of input |
2022-05-08 18:24:22 +0200 | <ski> | example of a consciously inserted pair of brackets : |
2022-05-08 18:24:28 +0200 | <ski> | map :: ( a -> b ) |
2022-05-08 18:24:31 +0200 | <ski> | -> ([a] -> [b]) |
2022-05-08 18:24:37 +0200 | <ski> | (the second pair of round brackets) |
2022-05-08 18:24:51 +0200 | <ski> | @type map . map . map |
2022-05-08 18:24:53 +0200 | <lambdabot> | (a -> b) -> [[[a]]] -> [[[b]]] |
2022-05-08 18:25:01 +0200 | machinedgod | (~machinedg@24.105.81.50) (Ping timeout: 256 seconds) |
2022-05-08 18:25:11 +0200 | <ski> | @type zipWith . zipWith |
2022-05-08 18:25:14 +0200 | <lambdabot> | (a -> b -> c) -> [[a]] -> [[b]] -> [[c]] |
2022-05-08 18:25:59 +0200 | <c_wraith> | that doesn't look useful! :P |
2022-05-08 18:26:32 +0200 | <c_wraith> | (I'm sure it's come up once or twice in history) |
2022-05-08 18:27:06 +0200 | <ski> | @let foldL :: (s -> a -> s) -> (s -> [a] -> s); foldL = foldl |
2022-05-08 18:27:07 +0200 | <lambdabot> | Defined. |
2022-05-08 18:27:13 +0200 | <ski> | @type foldL . foldL |
2022-05-08 18:27:14 +0200 | <lambdabot> | (s -> a -> s) -> s -> [[a]] -> s |
2022-05-08 18:28:54 +0200 | <ski> | (the types of the fold right function in OCaml also allows this. but, alas, the signature of the Haskell one prevents this, without interleaving a `flip') |
2022-05-08 18:29:45 +0200 | <ski> | Simon91 : anyway, you'll get used to it (hopefully) |
2022-05-08 18:31:24 +0200 | <ski> | (for some reason, it seems that many people who've been using Haskell for years still don't know that the brackets in `(Foo ...) == ... = ...' and in `case ... of (x:xs) -> ...; ...' or `... where (x:xs) = ...' are redundant ..) |
2022-05-08 18:32:05 +0200 | <ski> | (hm, and there's also `foo :: (Eq a) => ..a..') |
2022-05-08 18:34:13 +0200 | <geekosaur> | I know it but I generally go for consistency |
2022-05-08 18:34:51 +0200 | <ski> | yea, i figure some do (and several don't know) |
2022-05-08 18:35:16 +0200 | tzh | (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) |
2022-05-08 18:36:34 +0200 | romesrf | (~romes@185.5.8.134) |
2022-05-08 18:44:07 +0200 | <haskell_apprenti> | ski will check out the wiki books thing you sent |
2022-05-08 18:45:01 +0200 | <haskell_apprenti> | also nice intuition thanks |
2022-05-08 18:45:56 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds) |
2022-05-08 18:46:48 +0200 | <elmyr> | @type (.) |
2022-05-08 18:46:49 +0200 | <lambdabot> | (b -> c) -> (a -> b) -> a -> c |
2022-05-08 18:47:02 +0200 | <elmyr> | ski: doesn't look like Caleskell there either |
2022-05-08 18:49:36 +0200 | __monty__ | (~toonn@user/toonn) |
2022-05-08 18:54:38 +0200 | alp_ | (~alp@user/alp) |
2022-05-08 18:55:46 +0200 | gurkenglas | (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) |
2022-05-08 18:55:49 +0200 | <dminuoso> | [Leary]: Oh wow, thanks. Yes! |
2022-05-08 18:58:11 +0200 | haskell_apprenti | (~haskell_a@cpe-74-71-248-39.nyc.res.rr.com) (Quit: Client closed) |
2022-05-08 19:00:24 +0200 | ski | nods to elmyr |
2022-05-08 19:00:28 +0200 | nate1 | (~nate@98.45.169.16) |
2022-05-08 19:05:37 +0200 | econo | (uid147250@user/econo) |
2022-05-08 19:08:40 +0200 | Simon91 | (~Simon@ipbcc036f5.dynamic.kabel-deutschland.de) (Quit: Client closed) |
2022-05-08 19:10:59 +0200 | bahamas | (~lucian@84.232.141.55) |
2022-05-08 19:11:32 +0200 | nate1 | (~nate@98.45.169.16) (Ping timeout: 248 seconds) |
2022-05-08 19:20:21 +0200 | xaotuk | (~sasha@net234-32-245-109.mbb.telenor.rs) (Read error: Connection reset by peer) |
2022-05-08 19:20:44 +0200 | mbuf | (~Shakthi@122.174.202.44) (Quit: Leaving) |
2022-05-08 19:23:08 +0200 | jlamothe | (~jlamothe@198.251.61.229) (Quit: leaving) |
2022-05-08 19:25:37 +0200 | xaotuk | (~sasha@87.116.177.12) |
2022-05-08 19:26:06 +0200 | jakalx | (~jakalx@base.jakalx.net) () |
2022-05-08 19:28:13 +0200 | jakalx | (~jakalx@base.jakalx.net) |
2022-05-08 19:32:32 +0200 | haskell_apprenti | (~haskell_a@2603-7000-9900-04ba-0000-0000-0000-16e3.res6.spectrum.com) |
2022-05-08 19:32:41 +0200 | haskell_apprenti | (~haskell_a@2603-7000-9900-04ba-0000-0000-0000-16e3.res6.spectrum.com) (Client Quit) |
2022-05-08 19:36:36 +0200 | xaotuk | (~sasha@87.116.177.12) (Ping timeout: 240 seconds) |
2022-05-08 19:40:34 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
2022-05-08 19:41:39 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
2022-05-08 19:43:41 +0200 | lambdap2 | (~lambdap@static.167.190.119.168.clients.your-server.de) (Quit: lambdap2) |
2022-05-08 19:44:13 +0200 | lambdap2 | (~lambdap@static.167.190.119.168.clients.your-server.de) |
2022-05-08 19:44:45 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) |
2022-05-08 19:45:35 +0200 | zeenk | (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) |
2022-05-08 19:49:34 +0200 | dcompoze | (~dcompoze@5E98D6D9.static.tld.pl) |
2022-05-08 19:49:51 +0200 | dcompoze | (~dcompoze@5E98D6D9.static.tld.pl) (Client Quit) |
2022-05-08 19:52:49 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer) |
2022-05-08 19:58:23 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) |
2022-05-08 19:59:32 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 20:12:10 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 250 seconds) |
2022-05-08 20:16:23 +0200 | jakalx | (~jakalx@base.jakalx.net) () |
2022-05-08 20:16:28 +0200 | melas | (~melas@172.77.31.247) |
2022-05-08 20:18:30 +0200 | jakalx | (~jakalx@base.jakalx.net) |
2022-05-08 20:20:50 +0200 | notzmv | (~zmv@user/notzmv) |
2022-05-08 20:21:36 +0200 | oxide | (~lambda@user/oxide) (Quit: oxide) |
2022-05-08 20:21:47 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 20:33:42 +0200 | uam | (uid360535@id-360535.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
2022-05-08 20:34:27 +0200 | coot | (~coot@213.134.190.95) |
2022-05-08 20:43:06 +0200 | <maerwald> | does haskell CPP on windows need anything special? I'm getting massive errors that I don't get on unix |
2022-05-08 20:45:32 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
2022-05-08 20:46:07 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
2022-05-08 20:46:09 +0200 | dextaa45 | (~dextaa@user/dextaa) |
2022-05-08 20:46:50 +0200 | dextaa4 | (~dextaa@user/dextaa) (Ping timeout: 250 seconds) |
2022-05-08 20:46:51 +0200 | dextaa45 | dextaa4 |
2022-05-08 20:47:18 +0200 | <hpc> | probably something to do with how it picks what cpp command to run? |
2022-05-08 20:49:39 +0200 | dextaa49 | (~dextaa@user/dextaa) |
2022-05-08 20:51:36 +0200 | dextaa4 | (~dextaa@user/dextaa) (Ping timeout: 250 seconds) |
2022-05-08 20:51:37 +0200 | dextaa49 | dextaa4 |
2022-05-08 20:54:25 +0200 | machinedgod | (~machinedg@24.105.81.50) |
2022-05-08 21:08:45 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) |
2022-05-08 21:09:42 +0200 | Sgeo | (~Sgeo@user/sgeo) |
2022-05-08 21:10:20 +0200 | inversed_ | (~inversed@176.248.27.211) |
2022-05-08 21:11:50 +0200 | bahamas | (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
2022-05-08 21:13:48 +0200 | yauhsien | (~yauhsien@61-231-26-70.dynamic-ip.hinet.net) (Ping timeout: 276 seconds) |
2022-05-08 21:14:02 +0200 | inversed | (~inversed@176.248.27.211) (Ping timeout: 272 seconds) |
2022-05-08 21:16:38 +0200 | waleee | (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) |
2022-05-08 21:22:42 +0200 | acidjnk | (~acidjnk@p200300d0c7068b132c0a169992321cdc.dip0.t-ipconnect.de) |
2022-05-08 21:27:47 +0200 | jollygood2 | (~bc8147f2@199.204.85.195) |
2022-05-08 21:30:00 +0200 | <dminuoso> | Okay so Im writing a hardware library, that exposes a bunch of `init/finalize` or `open/close` functions. Im debating whether to provide `with` CPS helpers - and the reason Im debating this is because I dont want to make a choice for `bracket`. |
2022-05-08 21:30:07 +0200 | <dminuoso> | i.e. do I use base or safe-exceptions bracket |
2022-05-08 21:30:49 +0200 | <dminuoso> | My thinking is: just expose the manual functions, defer writing a bracket'ed helper to the user who can then chose whatever library they want |
2022-05-08 21:30:52 +0200 | <dminuoso> | Is this a sane choice? |
2022-05-08 21:33:25 +0200 | melas | (~melas@172.77.31.247) (Ping timeout: 260 seconds) |
2022-05-08 21:33:43 +0200 | <hpc> | presumably you aren't already depending on safe-exceptions |
2022-05-08 21:33:47 +0200 | <monochrom> | base itself takes the approach of providing both, with the latter hardwired to IO. |
2022-05-08 21:33:49 +0200 | <hpc> | but you're certainly already depending on base |
2022-05-08 21:34:03 +0200 | <hpc> | so provide the base functions and a with-function for base bracket |
2022-05-08 21:34:15 +0200 | <hpc> | the user can write a safe-exceptions with-function |
2022-05-08 21:34:19 +0200 | <dminuoso> | monochrom: both |
2022-05-08 21:34:21 +0200 | <dminuoso> | ? |
2022-05-08 21:34:31 +0200 | <dminuoso> | hpc: Mmm, I guess I can do that. |
2022-05-08 21:34:44 +0200 | <monochrom> | base has both openFile+hClose and withFile. |
2022-05-08 21:34:50 +0200 | <dminuoso> | Ahh, I see |
2022-05-08 21:36:36 +0200 | <monochrom> | But everyone knows how to use bracket. If you don't provide a "with", it's OK. |
2022-05-08 21:37:31 +0200 | <monochrom> | I haven't needed safe-exceptions. |
2022-05-08 21:38:06 +0200 | <dminuoso> | "needed" is a bit strong, in case of bracket its rather about a rare edge case that is really hard to trigger |
2022-05-08 21:39:01 +0200 | <dminuoso> | I sincerely believe that defaulting to `mask` instead of `uninterruptibleMask` inside the implementation is a dangerous mistake that leads to false assumptions. |
2022-05-08 21:39:15 +0200 | <dminuoso> | And it goes into "everyone thinks they know how to use bracket" rather than "everyone knows" |
2022-05-08 21:42:46 +0200 | takuan | (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
2022-05-08 21:46:04 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 240 seconds) |
2022-05-08 21:46:46 +0200 | <mxs> | would this be a candidate for base? elemIndex :: (Traversable t, Eq a, Num b) => a -> t a -> Maybe b |
2022-05-08 21:47:45 +0200 | Pickchea | (~private@user/pickchea) |
2022-05-08 21:47:56 +0200 | <dminuoso> | The Num polymorphism is a bit weird |
2022-05-08 21:48:22 +0200 | <mxs> | can be Int. I just like the generic* functions |
2022-05-08 21:48:24 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
2022-05-08 21:49:08 +0200 | <mxs> | it's about the Traversable elemIndex, I find myself using it a lot |
2022-05-08 21:49:48 +0200 | <dminuoso> | Traversable is way too strong |
2022-05-08 21:49:51 +0200 | <dminuoso> | You only need Foldable |
2022-05-08 21:51:12 +0200 | <mxs> | mhm yeah I suppose, even better. I wrote it with mapAccum for efficiency that's why |
2022-05-08 21:51:15 +0200 | melas | (~melas@172.77.31.247) |
2022-05-08 21:52:20 +0200 | <dminuoso> | Not sure how mapAccum would help make it more efficient |
2022-05-08 21:52:40 +0200 | <mxs> | how would you write it? |
2022-05-08 21:52:42 +0200 | <dminuoso> | elemIndex' e = elemIndex e . toList |
2022-05-08 21:53:59 +0200 | <dminuoso> | Im not sure this combinator would cross the Fairbairn threshold |
2022-05-08 21:54:06 +0200 | vorpuni | (~pvorp@2001:861:3881:c690:5de2:29c5:e469:d4b5) |
2022-05-08 21:54:08 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) |
2022-05-08 21:54:25 +0200 | <dminuoso> | If you find yourself needing this a lot, it might be an indicator of working with the wrong data types |
2022-05-08 21:54:53 +0200 | <Bulby[m]> | it's always traverse! |
2022-05-08 21:55:04 +0200 | <Bulby[m]> | what is Fairbairn |
2022-05-08 21:55:11 +0200 | <dminuoso> | I guess the thing is, in a Foldable this is generally not useful since you have no guarantee to do random access on that |
2022-05-08 21:55:38 +0200 | <dminuoso> | Finding the index of an arbitrary foldable structure seems like an awkward information if you cant say manipulate the structure on that index |
2022-05-08 21:56:36 +0200 | <dminuoso> | On lists at least this has clear meaning, but what does "index in a tree" mean exactly? |
2022-05-08 21:56:55 +0200 | <dminuoso> | Bulby[m]: https://wiki.haskell.org/Fairbairn_threshold |
2022-05-08 21:57:49 +0200 | <mxs> | elemIndex a = msum . snd . mapAccumL fn 0 where fn s x = (s+1, guard(a == x) >> Just s) |
2022-05-08 21:58:06 +0200 | <mxs> | without toList, but I'm not sure how much that saves on second thought |
2022-05-08 21:58:15 +0200 | <dminuoso> | Im confident `elemIndex' e = elemIndex e . toList` is going to be cheaper. |
2022-05-08 21:58:39 +0200 | <dminuoso> | Recall that in non-strict semantics the list is being generated lazily |
2022-05-08 21:58:57 +0200 | <dminuoso> | But really, all this boils down to the same problem: |
2022-05-08 21:59:12 +0200 | <dminuoso> | Your code does semantically the same: turn it into a list in sequencing order, and find the index inside that list. |
2022-05-08 21:59:19 +0200 | <dminuoso> | Is this a generally useful operation on arbitrary foldable structures? |
2022-05-08 22:00:59 +0200 | <dminuoso> | mxs: btw, the above is going to use findIndices internally , which has some carefully crafted code to trigger deforestation |
2022-05-08 22:01:17 +0200 | <dminuoso> | https://hackage.haskell.org/package/base-4.16.1.0/docs/src/Data-OldList.html#findIndices |
2022-05-08 22:02:03 +0200 | <dminuoso> | So depending on how the structure is made, this can be quite efficient |
2022-05-08 22:04:01 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
2022-05-08 22:04:39 +0200 | <kaol> | Today I learned that it pays to sometimes think a bit and not just hammer at the types until they match. |
2022-05-08 22:05:11 +0200 | <monochrom> | Intelligent Design > Evolution |
2022-05-08 22:05:12 +0200 | <kaol> | join . listToMaybe was too easy, I needed getFirst . mconcat . fmap First instead. |
2022-05-08 22:06:07 +0200 | eggplantade | (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
2022-05-08 22:08:33 +0200 | MajorBiscuit | (~MajorBisc@c-001-007-017.client.tudelft.eduvpn.nl) (Quit: WeeChat 3.4) |
2022-05-08 22:08:34 +0200 | <tomsmeding> | kaol: isn't that `catMaybes` |
2022-05-08 22:11:18 +0200 | <kaol> | listToMaybe . catMaybes actually. |
2022-05-08 22:11:26 +0200 | _ht | (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection) |
2022-05-08 22:11:30 +0200 | <tomsmeding> | Ah right |
2022-05-08 22:12:10 +0200 | <tomsmeding> | kaol: hmm, so isn't it `asum` |
2022-05-08 22:12:32 +0200 | <tomsmeding> | The Alternative instance for Maybe picks the leftmost Just |
2022-05-08 22:12:37 +0200 | mmhat | (~mmh@2001:4090:a243:8070:ee08:6bff:fe09:5315) |
2022-05-08 22:12:39 +0200 | mmhat | (~mmh@2001:4090:a243:8070:ee08:6bff:fe09:5315) (Client Quit) |
2022-05-08 22:14:47 +0200 | <kaol> | Well I'll be. I think I have reached par on this golf journey. |
2022-05-08 22:15:31 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
2022-05-08 22:15:53 +0200 | <mxs> | dminuoso: thanks for the insight, you're probably right - I avoided toList but now that I think about it, there's no reason |
2022-05-08 22:16:33 +0200 | <tomsmeding> | kaol: knowing the variety of utility functions that happen to do useful things on Maybe is more learning/experience than art :p |
2022-05-08 22:21:24 +0200 | nut | (~haskellfi@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 276 seconds) |
2022-05-08 22:27:39 +0200 | tromp | (~textual@dhcp-077-249-230-040.chello.nl) |
2022-05-08 22:30:05 +0200 | wgl | (~wgl@75-161-32-115.albq.qwest.net) |
2022-05-08 22:33:35 +0200 | <dminuoso> | mxs: https://gist.github.com/dminuoso/e285f19e9dac2de2300a52e74ca82279 |
2022-05-08 22:34:43 +0200 | <dminuoso> | What is interesting is that fusion did not trigger, and even despite that its still a lot less code. |
2022-05-08 22:35:35 +0200 | <dminuoso> | Part of that is because findIndices then ends up being a simple fold, but mapAccumL is a traverse over simplified State transformer |
2022-05-08 22:36:50 +0200 | <dminuoso> | Ah, turns out that according to #15426 the fusion is broken currently for findIndex |
2022-05-08 22:38:09 +0200 | CiaoSen | (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
2022-05-08 22:39:04 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds) |
2022-05-08 22:42:33 +0200 | littlebobeep | (~alMalsamo@gateway/tor-sasl/almalsamo) |
2022-05-08 22:42:39 +0200 | raehik | (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
2022-05-08 22:44:19 +0200 | <energizer> | can i use hoogle or something to find a bunch of interesting examples of Monoid? |
2022-05-08 22:46:08 +0200 | <dsal> | energizer: You can find a bunch just by looking at haddock. |
2022-05-08 22:46:15 +0200 | <geekosaur> | @instances Monoid |
2022-05-08 22:46:17 +0200 | <lambdabot> | (), (a -> b), (a, b), All, Any, Dual a, IO a, Maybe a, Ordering, Product a, ST s a, Sum a |
2022-05-08 22:46:33 +0200 | <dsal> | https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Monoid.html#t:Monoid |
2022-05-08 22:46:36 +0200 | <geekosaur> | and those are just the ones in Prelude iirc |
2022-05-08 22:46:48 +0200 | <geekosaur> | @instances-importing Data.Monoid Monoid |
2022-05-08 22:46:50 +0200 | <lambdabot> | (), (a -> b), (a, b), All, Any, Dual a, IO a, Maybe a, Ordering, Product a, ST s a, Sum a |
2022-05-08 22:47:25 +0200 | <dsal> | (a->b) and Ordering are pretty interesting ones together. |
2022-05-08 22:48:44 +0200 | <dsal> | I use the tuple ones sometimes, but for that type of thing, often just make a new product type. |
2022-05-08 22:51:16 +0200 | dextaa4 | (~dextaa@user/dextaa) (Quit: The Lounge - https://thelounge.chat) |
2022-05-08 22:51:24 +0200 | wgl | (~wgl@75-161-32-115.albq.qwest.net) (Quit: wgl) |
2022-05-08 22:53:57 +0200 | jmdaemon | (~jmdaemon@user/jmdaemon) |
2022-05-08 22:59:10 +0200 | jgeerds | (~jgeerds@d53604b0.access.ecotel.net) |
2022-05-08 22:59:13 +0200 | coot | (~coot@213.134.190.95) (Quit: coot) |
2022-05-08 23:05:14 +0200 | Pickchea | (~private@user/pickchea) (Quit: Leaving) |
2022-05-08 23:05:15 +0200 | julian | (~julian@20.83.116.49) (Remote host closed the connection) |
2022-05-08 23:05:37 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) |
2022-05-08 23:05:43 +0200 | king_gs | (~Thunderbi@2806:103e:29:99f9:ca77:e08e:3816:239e) (Client Quit) |
2022-05-08 23:07:08 +0200 | julian | (~julian@20.83.116.49) |
2022-05-08 23:07:40 +0200 | jonathanx | (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 250 seconds) |
2022-05-08 23:09:26 +0200 | kenran | (~kenran@200116b82be152003bcf840303205486.dip.versatel-1u1.de) (Quit: WeeChat info:version) |
2022-05-08 23:09:38 +0200 | julian | (~julian@20.83.116.49) (Remote host closed the connection) |
2022-05-08 23:11:06 +0200 | julian | (~julian@20.83.116.49) |
2022-05-08 23:18:20 +0200 | zer0bitz | (~zer0bitz@2001:2003:f444:8f00:740b:2afc:d306:1083) (Read error: Connection reset by peer) |
2022-05-08 23:19:41 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 256 seconds) |
2022-05-08 23:19:51 +0200 | __monty__ | (~toonn@user/toonn) (Quit: leaving) |
2022-05-08 23:20:47 +0200 | werneta | (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
2022-05-08 23:25:45 +0200 | mikoto-chan | (~mikoto-ch@213.177.151.239) (Ping timeout: 276 seconds) |
2022-05-08 23:37:32 +0200 | harveypwca | (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) |
2022-05-08 23:39:04 +0200 | king_gs | (~Thunderbi@187.201.141.165) |
2022-05-08 23:40:30 +0200 | andrey_ | (~andrey@p508d43ec.dip0.t-ipconnect.de) |
2022-05-08 23:43:28 +0200 | andrey | (~andrey@p200300dbcf48ce00934437bb39b09cba.dip0.t-ipconnect.de) |
2022-05-08 23:43:30 +0200 | andrey__ | (~andrey@p200300dbcf3ea70066ff5d38847dda5c.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
2022-05-08 23:45:07 +0200 | tabemann | (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Remote host closed the connection) |
2022-05-08 23:45:08 +0200 | alp_ | (~alp@user/alp) (Ping timeout: 248 seconds) |
2022-05-08 23:45:22 +0200 | AkechiShiro | (~licht@user/akechishiro) (Ping timeout: 250 seconds) |
2022-05-08 23:46:31 +0200 | AkechiShiro | (~licht@user/akechishiro) |
2022-05-08 23:46:33 +0200 | andrey_ | (~andrey@p508d43ec.dip0.t-ipconnect.de) (Ping timeout: 276 seconds) |
2022-05-08 23:48:30 +0200 | king_gs | (~Thunderbi@187.201.141.165) (Ping timeout: 276 seconds) |
2022-05-08 23:48:31 +0200 | wgl | (~wgl@75-161-32-115.albq.qwest.net) |
2022-05-08 23:49:06 +0200 | king_gs | (~Thunderbi@187.201.105.54) |
2022-05-08 23:49:49 +0200 | machinedgod | (~machinedg@24.105.81.50) (Ping timeout: 246 seconds) |
2022-05-08 23:51:50 +0200 | tabemann | (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) |
2022-05-08 23:56:18 +0200 | liz | (~liz@host109-151-128-120.range109-151.btcentralplus.com) (Quit: Lost terminal) |
2022-05-08 23:56:51 +0200 | vorpuni | (~pvorp@2001:861:3881:c690:5de2:29c5:e469:d4b5) (Remote host closed the connection) |