2023-10-18 00:05:41 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 260 seconds) |
2023-10-18 00:06:39 +0200 | azimut | (~azimut@gateway/tor-sasl/azimut) |
2023-10-18 00:14:48 +0200 | malte | (~malte@mal.tc) (Remote host closed the connection) |
2023-10-18 00:15:58 +0200 | malte | (~malte@mal.tc) |
2023-10-18 00:21:28 +0200 | __monty__ | (~toonn@user/toonn) (Quit: leaving) |
2023-10-18 00:22:19 +0200 | fweht | (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 00:22:41 +0200 | tzh_ | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) |
2023-10-18 00:25:02 +0200 | tzh | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Ping timeout: 258 seconds) |
2023-10-18 00:25:22 +0200 | lisbeths | (uid135845@id-135845.lymington.irccloud.com) |
2023-10-18 00:25:54 +0200 | malte | (~malte@mal.tc) (Remote host closed the connection) |
2023-10-18 00:26:05 +0200 | gmg | (~user@user/gehmehgeh) (Quit: Leaving) |
2023-10-18 00:27:08 +0200 | malte | (~malte@mal.tc) |
2023-10-18 00:32:44 +0200 | waleee | (~waleee@2001:9b0:21c:e600:f2f3:f744:435d:137c) (Ping timeout: 248 seconds) |
2023-10-18 00:33:10 +0200 | waleee | (~waleee@h-176-10-137-138.na.cust.bahnhof.se) |
2023-10-18 00:39:21 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) |
2023-10-18 00:41:35 +0200 | tzh_ | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Ping timeout: 240 seconds) |
2023-10-18 00:46:21 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 00:49:45 +0200 | zmt01 | (~zmt00@user/zmt00) (Quit: Leaving) |
2023-10-18 00:51:40 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 272 seconds) |
2023-10-18 00:56:39 +0200 | tzh | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) |
2023-10-18 01:02:15 +0200 | Pozyomka | (~pyon@user/pyon) |
2023-10-18 01:03:04 +0200 | waleee | (~waleee@h-176-10-137-138.na.cust.bahnhof.se) (Ping timeout: 272 seconds) |
2023-10-18 01:04:01 +0200 | edwtjo | (~edwtjo@h-46-59-62-248.A213.priv.bahnhof.se) |
2023-10-18 01:04:01 +0200 | edwtjo | (~edwtjo@h-46-59-62-248.A213.priv.bahnhof.se) (Changing host) |
2023-10-18 01:04:01 +0200 | edwtjo | (~edwtjo@fsf/member/edwtjo) |
2023-10-18 01:14:13 +0200 | Inst | (~Inst@120.244.192.250) (Ping timeout: 252 seconds) |
2023-10-18 01:22:04 +0200 | xff0x | (~xff0x@ai101218.d.east.v6connect.net) (Ping timeout: 272 seconds) |
2023-10-18 01:22:45 +0200 | <EvanR> | githubs syntax coloring for haskell is annoying because it colors stuff like Char and Bool one color but "user defined data types" another color. Except Char and Bool are defined the same way |
2023-10-18 01:23:39 +0200 | xff0x | (~xff0x@ai101218.d.east.v6connect.net) |
2023-10-18 01:29:53 +0200 | thegeekinside | (~thegeekin@189.180.124.118) (Remote host closed the connection) |
2023-10-18 01:32:07 +0200 | chomwitt | (~chomwitt@ppp-94-67-206-212.home.otenet.gr) (Ping timeout: 264 seconds) |
2023-10-18 01:32:17 +0200 | Inst | (~Inst@120.244.192.250) |
2023-10-18 01:33:43 +0200 | <EvanR> | which makes those definitions in GHC.Base look extra funny |
2023-10-18 01:35:32 +0200 | harveypwca | (~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db) (Quit: Leaving) |
2023-10-18 01:43:53 +0200 | adanwan_ | (~adanwan@gateway/tor-sasl/adanwan) |
2023-10-18 01:44:27 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) |
2023-10-18 01:44:39 +0200 | adanwan | (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 252 seconds) |
2023-10-18 01:44:51 +0200 | Luj | (~Luj@2a01:e0a:5f9:9681:c367:ba44:42cf:91d7) (Quit: Ping timeout (120 seconds)) |
2023-10-18 01:45:09 +0200 | Luj | (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb) |
2023-10-18 01:45:32 +0200 | aforemny_ | (~aforemny@2001:9e8:6cf3:2200:78b4:c4c0:dc3:eb14) (Ping timeout: 258 seconds) |
2023-10-18 01:45:32 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds) |
2023-10-18 01:46:06 +0200 | aforemny | (~aforemny@i59F516F9.versanet.de) |
2023-10-18 01:47:29 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) |
2023-10-18 01:48:03 +0200 | Alleria | (~JohnGalt@user/alleria) |
2023-10-18 01:49:25 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 252 seconds) |
2023-10-18 01:51:38 +0200 | Tuplanolla | (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 255 seconds) |
2023-10-18 02:07:21 +0200 | zmt00 | (~zmt00@user/zmt00) |
2023-10-18 02:15:52 +0200 | emmanuelux | (~emmanuelu@user/emmanuelux) (Quit: au revoir) |
2023-10-18 02:19:59 +0200 | thegeekinside | (~thegeekin@189.180.124.118) |
2023-10-18 02:29:27 +0200 | jrm | (~jrm@user/jrm) (Quit: ciao) |
2023-10-18 02:30:21 +0200 | jespada | (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Ping timeout: 260 seconds) |
2023-10-18 02:33:16 +0200 | jespada | (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) |
2023-10-18 02:35:31 +0200 | jrm | (~jrm@user/jrm) |
2023-10-18 02:44:02 +0200 | danza | (~francesco@ge-19-118-207.service.infuturo.it) |
2023-10-18 02:44:28 +0200 | ddellacosta | (~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 248 seconds) |
2023-10-18 02:45:10 +0200 | ddellacosta | (~ddellacos@ool-44c738de.dyn.optonline.net) |
2023-10-18 02:49:30 +0200 | Sciencentistguy6 | (~sciencent@hacksoc/ordinary-member) |
2023-10-18 02:51:45 +0200 | Sciencentistguy | (~sciencent@hacksoc/ordinary-member) (Ping timeout: 255 seconds) |
2023-10-18 02:51:46 +0200 | Sciencentistguy6 | Sciencentistguy |
2023-10-18 02:53:14 +0200 | thyriaen | (~thyriaen@2a01:aea0:dd4:7157:6245:cbff:fe9f:48b1) |
2023-10-18 02:53:55 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) |
2023-10-18 02:55:59 +0200 | Lord_of_Life | (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 255 seconds) |
2023-10-18 02:56:45 +0200 | Lord_of_Life | (~Lord@user/lord-of-life/x-2819915) |
2023-10-18 02:57:58 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 02:58:45 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed) |
2023-10-18 03:01:01 +0200 | phma_ | (phma@2001:5b0:211b:9d88:b368:1baa:7a2:22b7) |
2023-10-18 03:04:32 +0200 | phma | (~phma@host-67-44-208-18.hnremote.net) (Ping timeout: 255 seconds) |
2023-10-18 03:05:20 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 03:07:14 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) |
2023-10-18 03:07:36 +0200 | hiyori | (~hiyori@user/hiyori) (Quit: Client closed) |
2023-10-18 03:08:05 +0200 | danza | (~francesco@ge-19-118-207.service.infuturo.it) (Ping timeout: 240 seconds) |
2023-10-18 03:37:04 +0200 | otto_s | (~user@p5b0445cd.dip0.t-ipconnect.de) (Ping timeout: 255 seconds) |
2023-10-18 03:38:41 +0200 | chexum | (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 252 seconds) |
2023-10-18 03:38:45 +0200 | otto_s | (~user@p5b044495.dip0.t-ipconnect.de) |
2023-10-18 03:39:09 +0200 | chexum | (~quassel@gateway/tor-sasl/chexum) |
2023-10-18 03:39:39 +0200 | thyriaen | (~thyriaen@2a01:aea0:dd4:7157:6245:cbff:fe9f:48b1) (Quit: Leaving) |
2023-10-18 03:44:26 +0200 | solrize | (~solrize@2601:644:8501:aaf0::86ea) (Ping timeout: 260 seconds) |
2023-10-18 03:52:07 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection) |
2023-10-18 03:56:26 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) (Remote host closed the connection) |
2023-10-18 03:56:49 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) |
2023-10-18 04:11:16 +0200 | td_ | (~td@i53870913.versanet.de) (Ping timeout: 255 seconds) |
2023-10-18 04:13:04 +0200 | td_ | (~td@i5387093F.versanet.de) |
2023-10-18 04:16:34 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 04:16:50 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 04:26:58 +0200 | chexum | (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
2023-10-18 04:27:06 +0200 | chexum | (~quassel@gateway/tor-sasl/chexum) |
2023-10-18 04:29:02 +0200 | xff0x | (~xff0x@ai101218.d.east.v6connect.net) (Ping timeout: 255 seconds) |
2023-10-18 04:30:06 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
2023-10-18 04:30:06 +0200 | finn_elija | (~finn_elij@user/finn-elija/x-0085643) |
2023-10-18 04:30:06 +0200 | finn_elija | FinnElija |
2023-10-18 04:38:44 +0200 | phma_ | phma |
2023-10-18 04:43:21 +0200 | aforemny | (~aforemny@i59F516F9.versanet.de) (Ping timeout: 260 seconds) |
2023-10-18 04:44:07 +0200 | thegeekinside | (~thegeekin@189.180.124.118) (Ping timeout: 255 seconds) |
2023-10-18 04:47:51 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 04:50:35 +0200 | aforemny | (~aforemny@i59F516FB.versanet.de) |
2023-10-18 04:50:37 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) (Remote host closed the connection) |
2023-10-18 04:51:00 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) |
2023-10-18 04:51:31 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 260 seconds) |
2023-10-18 04:52:21 +0200 | Square | (~Square@user/square) |
2023-10-18 04:52:36 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 258 seconds) |
2023-10-18 05:02:16 +0200 | zer0bitz_ | (~zer0bitz@user/zer0bitz) |
2023-10-18 05:03:00 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 05:05:15 +0200 | zer0bitz | (~zer0bitz@user/zer0bitz) (Ping timeout: 258 seconds) |
2023-10-18 05:06:32 +0200 | Inst | (~Inst@120.244.192.250) (Ping timeout: 246 seconds) |
2023-10-18 05:10:17 +0200 | hiyori | (~hiyori@user/hiyori) |
2023-10-18 05:13:48 +0200 | Vajb | (~Vajb@207.61.167.122) (Ping timeout: 248 seconds) |
2023-10-18 05:17:53 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5) |
2023-10-18 05:20:32 +0200 | xff0x | (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
2023-10-18 05:24:04 +0200 | Square3 | (~Square4@user/square) |
2023-10-18 05:26:02 +0200 | danse-nr3__ | (~francesco@151.57.110.75) |
2023-10-18 05:26:56 +0200 | danse-nr3_ | (~francesco@ge-19-118-207.service.infuturo.it) (Read error: Connection reset by peer) |
2023-10-18 05:27:06 +0200 | aforemny | (~aforemny@i59F516FB.versanet.de) (Ping timeout: 258 seconds) |
2023-10-18 05:27:26 +0200 | aforemny | (~aforemny@i59F516ED.versanet.de) |
2023-10-18 05:29:00 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 05:29:30 +0200 | andydude | (~andrewr@151.200.15.160) |
2023-10-18 05:29:34 +0200 | ddellacosta | (~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 255 seconds) |
2023-10-18 05:31:24 +0200 | ddellacosta | (~ddellacos@ool-44c738de.dyn.optonline.net) |
2023-10-18 05:45:54 +0200 | Vajb | (~Vajb@207.61.167.122) (Ping timeout: 245 seconds) |
2023-10-18 05:54:07 +0200 | Alleria | (~JohnGalt@user/alleria) (Quit: Textual IRC Client: www.textualapp.com) |
2023-10-18 05:54:42 +0200 | gdown | (~gavin@h69-11-149-109.kndrid.broadband.dynamic.tds.net) (Ping timeout: 258 seconds) |
2023-10-18 06:04:53 +0200 | euleritian | (~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 06:05:11 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 06:06:35 +0200 | _ht | (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
2023-10-18 06:07:11 +0200 | sabino | (~sabino@user/sabino) (Quit: Lambda _ -> x) |
2023-10-18 06:10:52 +0200 | gabiruh | (~gabiruh@vps19177.publiccloud.com.br) (Ping timeout: 272 seconds) |
2023-10-18 06:11:38 +0200 | gabiruh | (~gabiruh@vps19177.publiccloud.com.br) |
2023-10-18 06:21:27 +0200 | danse-nr3__ | (~francesco@151.57.110.75) (Ping timeout: 255 seconds) |
2023-10-18 06:33:58 +0200 | rosco | (~rosco@yp-150-69.tm.net.my) |
2023-10-18 06:40:13 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds) |
2023-10-18 06:42:26 +0200 | danse-nr3 | (~francesco@151.57.110.75) |
2023-10-18 06:45:20 +0200 | euleritian | (~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) |
2023-10-18 06:47:25 +0200 | qqq | (~qqq@92.43.167.61) |
2023-10-18 06:53:43 +0200 | Square3 | (~Square4@user/square) (Ping timeout: 255 seconds) |
2023-10-18 06:55:35 +0200 | johnw | (~johnw@69.62.242.138) (Quit: ZNC - http://znc.in) |
2023-10-18 06:55:54 +0200 | euleritian | (~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Ping timeout: 245 seconds) |
2023-10-18 06:55:56 +0200 | sm | (~sm@plaintextaccounting/sm) (Quit: sm) |
2023-10-18 07:00:22 +0200 | euleritian | (~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) |
2023-10-18 07:03:53 +0200 | Unicorn_Princess | (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
2023-10-18 07:04:44 +0200 | euleritian | (~euleritia@dynamic-046-114-200-236.46.114.pool.telefonica.de) (Ping timeout: 248 seconds) |
2023-10-18 07:05:52 +0200 | euleritian | (~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) |
2023-10-18 07:09:08 +0200 | vglfr | (~vglfr@88.155.159.184) |
2023-10-18 07:09:12 +0200 | andydude | (~andrewr@151.200.15.160) () |
2023-10-18 07:14:39 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 07:19:13 +0200 | euleritian | (~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 07:19:15 +0200 | takuan | (~takuan@178-116-218-225.access.telenet.be) |
2023-10-18 07:19:25 +0200 | sm | (~sm@plaintextaccounting/sm) (Ping timeout: 258 seconds) |
2023-10-18 07:19:30 +0200 | euleritian | (~euleritia@77.22.252.56) |
2023-10-18 07:24:12 +0200 | vglfr | (~vglfr@88.155.159.184) (Read error: Connection reset by peer) |
2023-10-18 07:24:34 +0200 | vglfr | (vglfr@gateway/vpn/protonvpn/vglfr) |
2023-10-18 07:25:23 +0200 | chomwitt | (~chomwitt@2a02:587:7a17:8900:1ac0:4dff:fedb:a3f1) |
2023-10-18 07:26:33 +0200 | rgw | (~R@2605:a601:a0df:5600:88:c751:f921:bfac) (Read error: Connection reset by peer) |
2023-10-18 07:28:54 +0200 | michalz | (~michalz@185.246.207.221) |
2023-10-18 07:37:09 +0200 | _ht | (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht) |
2023-10-18 07:38:19 +0200 | johnw | (~johnw@69.62.242.138) |
2023-10-18 07:40:44 +0200 | rosco | (~rosco@yp-150-69.tm.net.my) (Read error: Connection reset by peer) |
2023-10-18 07:42:11 +0200 | euleritian | (~euleritia@77.22.252.56) (Ping timeout: 255 seconds) |
2023-10-18 07:42:34 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds) |
2023-10-18 07:42:38 +0200 | vglfr | (vglfr@gateway/vpn/protonvpn/vglfr) (Ping timeout: 255 seconds) |
2023-10-18 07:42:54 +0200 | rosco | (~rosco@193.138.218.161) |
2023-10-18 07:42:59 +0200 | vglfr | (~vglfr@88.155.159.184) |
2023-10-18 07:47:55 +0200 | euleritian | (~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) |
2023-10-18 07:48:46 +0200 | whatsupdoc | (uid509081@id-509081.hampstead.irccloud.com) |
2023-10-18 07:50:38 +0200 | Inst | (~Inst@120.244.192.250) |
2023-10-18 07:52:33 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 07:54:56 +0200 | lisbeths | (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 07:55:31 +0200 | shriekingnoise | (~shrieking@186.137.175.87) (Ping timeout: 255 seconds) |
2023-10-18 07:56:56 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 07:57:40 +0200 | <dminuoso> | The only annoying part here is that it is not customizable. |
2023-10-18 07:57:57 +0200 | <dminuoso> | So you are subject to someone elses opinion, as with any syntax highlighter or formatter. |
2023-10-18 07:58:38 +0200 | Square3 | (~Square4@user/square) |
2023-10-18 08:05:25 +0200 | sm | (~sm@plaintextaccounting/sm) (Ping timeout: 258 seconds) |
2023-10-18 08:06:41 +0200 | acidjnk_new | (~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) |
2023-10-18 08:17:35 +0200 | bradparker | (sid262931@id-262931.uxbridge.irccloud.com) (Ping timeout: 240 seconds) |
2023-10-18 08:18:15 +0200 | rosco | (~rosco@193.138.218.161) (Ping timeout: 240 seconds) |
2023-10-18 08:20:07 +0200 | gooba | (~gooba@90-231-13-185-no3430.tbcn.telia.com) (Ping timeout: 255 seconds) |
2023-10-18 08:20:18 +0200 | rosco | (~rosco@193.138.218.161) |
2023-10-18 08:20:50 +0200 | bradparker | (sid262931@id-262931.uxbridge.irccloud.com) |
2023-10-18 08:24:43 +0200 | idgaen | (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
2023-10-18 08:31:58 +0200 | friendshipaka | (~Friendshi@user/Friendship) (Read error: Connection reset by peer) |
2023-10-18 08:32:18 +0200 | friendshipaka | (~Friendshi@user/Friendship) |
2023-10-18 08:33:37 +0200 | td_ | (~td@i5387093F.versanet.de) (Ping timeout: 255 seconds) |
2023-10-18 08:43:50 +0200 | gooba | (~gooba@90-231-13-185-no3430.tbcn.telia.com) |
2023-10-18 08:43:50 +0200 | td_ | (~td@i5387091B.versanet.de) |
2023-10-18 08:45:36 +0200 | p3n_ | (~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1) (Quit: ZNC 1.8.2 - https://znc.in) |
2023-10-18 08:46:31 +0200 | euleritian | (~euleritia@dynamic-046-114-200-044.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 08:46:48 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 08:49:04 +0200 | p3n | (~p3n@2a00:19a0:3:7c:0:d9c6:7cf6:1) |
2023-10-18 08:49:21 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 08:53:51 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds) |
2023-10-18 08:57:56 +0200 | fendor | (~fendor@2a02:8388:1640:be00:aab:1226:f274:5021) |
2023-10-18 09:03:56 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) |
2023-10-18 09:04:24 +0200 | idgaen | (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.5) |
2023-10-18 09:04:42 +0200 | lottaquestions | (~nick@2607:fa49:503d:b200:641c:fc5a:8196:c097) |
2023-10-18 09:05:54 +0200 | lottaquestions_ | (~nick@2607:fa49:503d:b200:aeea:7f35:a3ca:4b4a) (Ping timeout: 245 seconds) |
2023-10-18 09:09:04 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 09:09:28 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 272 seconds) |
2023-10-18 09:10:14 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) |
2023-10-18 09:15:30 +0200 | gmg | (~user@user/gehmehgeh) |
2023-10-18 09:25:43 +0200 | danse-nr3 | (~francesco@151.57.110.75) (Read error: Connection reset by peer) |
2023-10-18 09:25:53 +0200 | danse-nr3 | (~francesco@151.47.117.140) |
2023-10-18 09:32:55 +0200 | CiaoSen | (~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) |
2023-10-18 09:33:24 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds) |
2023-10-18 09:35:03 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) |
2023-10-18 09:38:43 +0200 | mc47 | (~mc47@xmonad/TheMC47) |
2023-10-18 09:40:33 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 09:40:34 +0200 | Pickchea | (~private@user/pickchea) |
2023-10-18 09:40:54 +0200 | Jackneill | (~Jackneill@20014C4E1E0E6F00DA1379EF70CDB149.dsl.pool.telekom.hu) |
2023-10-18 09:43:28 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 09:44:05 +0200 | danse-nr3 | (~francesco@151.47.117.140) (Ping timeout: 246 seconds) |
2023-10-18 09:47:11 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 255 seconds) |
2023-10-18 09:50:33 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Ping timeout: 245 seconds) |
2023-10-18 09:52:58 +0200 | danse-nr3 | (~francesco@151.47.117.140) |
2023-10-18 09:56:12 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) |
2023-10-18 09:56:36 +0200 | chele | (~chele@user/chele) |
2023-10-18 10:00:32 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) (Ping timeout: 246 seconds) |
2023-10-18 10:02:13 +0200 | remexre | (~remexre@user/remexre) (Ping timeout: 252 seconds) |
2023-10-18 10:10:47 +0200 | econo_ | (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 10:11:51 +0200 | remexre | (~remexre@user/remexre) |
2023-10-18 10:14:54 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 10:22:26 +0200 | <danse-nr3> | NonNull seems interesting hackage.haskell.org/package/mono-traversable-1.0.15.3/docs/Data-NonNull.html, wondering why it seems to exist only within mono-traversable |
2023-10-18 10:24:51 +0200 | __monty__ | (~toonn@user/toonn) |
2023-10-18 10:34:19 +0200 | dsrt^ | (~cd@76.145.193.217) (Remote host closed the connection) |
2023-10-18 10:34:19 +0200 | cuiltb^ | (~cd@76.145.193.217) (Remote host closed the connection) |
2023-10-18 10:34:37 +0200 | dsrt^ | (~cd@76.145.193.217) |
2023-10-18 10:34:37 +0200 | cuiltb^ | (~cd@76.145.193.217) |
2023-10-18 10:35:55 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 10:36:34 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) |
2023-10-18 10:39:01 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) |
2023-10-18 10:42:55 +0200 | billchenchina | (~billchenc@2a0c:b641:7a2:230::10) (Ping timeout: 264 seconds) |
2023-10-18 10:46:31 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) (Ping timeout: 255 seconds) |
2023-10-18 10:49:23 +0200 | zer0bitz_ | zer0bitz |
2023-10-18 10:52:14 +0200 | zer0bitz | (~zer0bitz@user/zer0bitz) () |
2023-10-18 10:54:45 +0200 | kuribas | (~user@ip-188-118-57-242.reverse.destiny.be) |
2023-10-18 10:58:07 +0200 | zer0bitz | (~zer0bitz@user/zer0bitz) |
2023-10-18 10:58:46 +0200 | <Athas> | How do you install Accelerate nowadays? Which versions of GHC is it compatible with? Is there a shell.nix somewhere that just does everything for me? |
2023-10-18 11:01:22 +0200 | Sgeo | (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
2023-10-18 11:03:49 +0200 | azimut | (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds) |
2023-10-18 11:07:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds) |
2023-10-18 11:09:36 +0200 | <tomsmeding> | Athas: No explicit nix support (yet). The master branch versions (of accelerate{,-llvm{,-native,-ptx}}) are compatible with, I believe, 8.10 through 9.4 |
2023-10-18 11:09:45 +0200 | <tomsmeding> | you'll need LLVM <= 14 |
2023-10-18 11:09:48 +0200 | <tomsmeding> | er, <= 15 |
2023-10-18 11:09:48 +0200 | Guest97 | (~Guest97@163.116.195.115) |
2023-10-18 11:09:52 +0200 | lortabac | (~lortabac@89.207.171.151) |
2023-10-18 11:10:17 +0200 | euleritian | (~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) |
2023-10-18 11:10:34 +0200 | Guest97 | (~Guest97@163.116.195.115) (Client Quit) |
2023-10-18 11:10:53 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) |
2023-10-18 11:11:17 +0200 | <tomsmeding> | (note that if you build 'accelerate' master with -fdebug, you'll need to add 'post-checkout-command: git submodule update --init --recursive' to the 'source-repository-package' cabal.project stanza) |
2023-10-18 11:11:28 +0200 | <tomsmeding> | (the default is -f-debug) |
2023-10-18 11:11:55 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 11:12:34 +0200 | sm | (~sm@plaintextaccounting/sm) (Quit: sm) |
2023-10-18 11:14:19 +0200 | <tomsmeding> | the hackage 1.3 versions still work, but require LLVM <= 12 (iirc) |
2023-10-18 11:15:01 +0200 | <tomsmeding> | for GPU you'll need cuda <= 11, due to issues with c2hs/language-c |
2023-10-18 11:15:51 +0200 | vglfr | (~vglfr@88.155.159.184) (Ping timeout: 240 seconds) |
2023-10-18 11:16:52 +0200 | lortabac | (~lortabac@89.207.171.151) (Remote host closed the connection) |
2023-10-18 11:17:14 +0200 | lortabac | (~lortabac@89.207.171.151) |
2023-10-18 11:19:04 +0200 | ubert | (~Thunderbi@178.165.203.252.wireless.dyn.drei.com) |
2023-10-18 11:21:37 +0200 | <Athas> | tomsmeding: what about the released versions? I always found it a bit difficult to figure out how to put together the half dozen different Accelerate repositories I need. |
2023-10-18 11:21:55 +0200 | qqq | (~qqq@92.43.167.61) (Ping timeout: 255 seconds) |
2023-10-18 11:23:32 +0200 | <Athas> | Hm, the releases look three years old, so I suppose they are not representative anymore. |
2023-10-18 11:25:57 +0200 | <tomsmeding> | Athas: the released versions work fine if you are okay with installing LLVM 12 :p |
2023-10-18 11:26:21 +0200 | <tomsmeding> | 'accelerate' is the surface language plus the interpreter; the compiled backends are accelerate-llvm-native and accelerate-llvm-ptx |
2023-10-18 11:27:13 +0200 | lortabac | (~lortabac@89.207.171.151) (Remote host closed the connection) |
2023-10-18 11:27:27 +0200 | tzh | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Quit: zzz) |
2023-10-18 11:27:38 +0200 | lortabac | (~lortabac@89.207.171.151) |
2023-10-18 11:28:56 +0200 | <tomsmeding> | for the master branch versions, the package names are the same and live under github.com/AccelerateHS/ |
2023-10-18 11:29:21 +0200 | rosco | (~rosco@193.138.218.161) (Ping timeout: 258 seconds) |
2023-10-18 11:31:14 +0200 | vglfr | (~vglfr@88.155.159.184) |
2023-10-18 11:34:01 +0200 | lortabac | (~lortabac@89.207.171.151) (Ping timeout: 260 seconds) |
2023-10-18 11:34:11 +0200 | <haskellbridge> | <Aquas> How does accelerate work? It interpretes its surface syntax to cuda C code via LLVM? |
2023-10-18 11:34:31 +0200 | <tomsmeding> | basically |
2023-10-18 11:34:48 +0200 | <tomsmeding> | the "interprets" is a reasonably complicated process, but yet : |
2023-10-18 11:34:49 +0200 | <tomsmeding> | * :p |
2023-10-18 11:34:55 +0200 | lortabac | (~lortabac@89.207.171.151) |
2023-10-18 11:35:07 +0200 | aforemny | (~aforemny@i59F516ED.versanet.de) (Ping timeout: 255 seconds) |
2023-10-18 11:36:28 +0200 | aforemny | (~aforemny@i59F516FA.versanet.de) |
2023-10-18 11:36:49 +0200 | <haskellbridge> | <Aquas> This sounds to be tweaking the GHC's compilation process. How does this work? |
2023-10-18 11:37:00 +0200 | euleritian | (~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 11:37:17 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 11:41:32 +0200 | <tomsmeding> | no, accelerate is "just" a library; by using the functions from the library, you're actually building a syntax tree instead of running the computations directly. (This is why you need to use 'run' to run the computation in the end.) This syntax tree then gets compiled as with a usual compiler, just at Haskell runtime. |
2023-10-18 11:42:18 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed) |
2023-10-18 11:42:46 +0200 | lortabac | (~lortabac@89.207.171.151) (Ping timeout: 260 seconds) |
2023-10-18 11:42:52 +0200 | azimut | (~azimut@gateway/tor-sasl/azimut) |
2023-10-18 11:43:17 +0200 | lortabac | (~lortabac@89.207.171.151) |
2023-10-18 11:43:53 +0200 | <Athas> | It's essentially a JIT compiler. |
2023-10-18 11:44:31 +0200 | <Athas> | That also means you can easily do interesting things like partial evaluation, where the Haskell level computation emits an Accelerate program. One of the Accelerate examples use this to specialise a ray tracer to a specific scene. |
2023-10-18 11:47:09 +0200 | Inst | (~Inst@120.244.192.250) (Ping timeout: 245 seconds) |
2023-10-18 11:49:01 +0200 | Inst | (~Inst@120.244.192.250) |
2023-10-18 11:52:39 +0200 | <haskellbridge> | <Aquas> So LLVM is called at Haskell runtime? |
2023-10-18 11:53:34 +0200 | lortabac | (~lortabac@89.207.171.151) (Ping timeout: 255 seconds) |
2023-10-18 11:54:42 +0200 | <Athas> | Yes. |
2023-10-18 11:59:11 +0200 | <tomsmeding> | Aquas: you can also run the compilation process at Haskell compile time via TemplateHaskell by using runQ |
2023-10-18 11:59:26 +0200 | <tomsmeding> | but personally I've never used that, so I'm not sure if that flow is still supported :D |
2023-10-18 12:00:06 +0200 | Pickchea | (~private@user/pickchea) (Quit: Leaving) |
2023-10-18 12:07:27 +0200 | <Square> | in the middle of my nix build i see "uploading 'https://hydra.iohk.io/nix-cache-info'...". A bjt |
2023-10-18 12:07:37 +0200 | <Square> | A bit sus. * |
2023-10-18 12:10:22 +0200 | ft | (~ft@p200300cf3f482500978224aa0512647c.dip0.t-ipconnect.de) (Quit: leaving) |
2023-10-18 12:12:46 +0200 | xff0x | (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 255 seconds) |
2023-10-18 12:14:55 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
2023-10-18 12:15:46 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 12:25:15 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
2023-10-18 12:25:44 +0200 | euleritian | (~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) |
2023-10-18 12:26:31 +0200 | aforemny | (~aforemny@i59F516FA.versanet.de) (Ping timeout: 260 seconds) |
2023-10-18 12:27:41 +0200 | aforemny | (~aforemny@2001:9e8:6ce3:9f00:c447:f7a7:e738:aefa) |
2023-10-18 12:28:40 +0200 | euleritian | (~euleritia@dynamic-046-114-201-065.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 12:29:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 12:33:31 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 260 seconds) |
2023-10-18 12:34:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 12:39:28 +0200 | ubert1 | (~Thunderbi@77.119.220.59.wireless.dyn.drei.com) |
2023-10-18 12:40:04 +0200 | CiaoSen | (~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) (Ping timeout: 245 seconds) |
2023-10-18 12:40:40 +0200 | ubert | (~Thunderbi@178.165.203.252.wireless.dyn.drei.com) (Ping timeout: 255 seconds) |
2023-10-18 12:40:40 +0200 | ubert1 | ubert |
2023-10-18 12:41:01 +0200 | rosco | (~rosco@193.138.218.161) |
2023-10-18 12:41:29 +0200 | <Inst> | https://paste.tomsmeding.com/58hJ8xnN |
2023-10-18 12:41:33 +0200 | <Inst> | any idea how to make this idiom fly? |
2023-10-18 12:41:54 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 12:42:25 +0200 | <Inst> | and it's takne from a codewars kata, where it's all about overloading names to make an "English" expression work |
2023-10-18 12:42:40 +0200 | <Inst> | the point is more, if you want multiple toplevel pure assignment |
2023-10-18 12:43:02 +0200 | <Inst> | the verticalized list idiom doesn't work |
2023-10-18 12:44:15 +0200 | coot | (~coot@89-69-206-216.dynamic.chello.pl) (Ping timeout: 240 seconds) |
2023-10-18 12:50:41 +0200 | <tomsmeding> | honestly I'd just `zero = ($ 0)` \n `one = ($ 1)` \n etc. :p |
2023-10-18 12:50:50 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 12:50:57 +0200 | <tomsmeding> | if you want a bunch of names defined, define a bunch of names |
2023-10-18 12:51:28 +0200 | <tomsmeding> | fancy haskell constructs are for manipulating data, not binders in haskell itself |
2023-10-18 12:51:32 +0200 | <tomsmeding> | that's what TemplateHaskell is for |
2023-10-18 12:52:02 +0200 | <tomsmeding> | this might not actually be that verbose in TH |
2023-10-18 12:52:44 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
2023-10-18 12:53:52 +0200 | pretty_dumm_guy | (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit) |
2023-10-18 12:55:36 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 258 seconds) |
2023-10-18 12:56:26 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
2023-10-18 12:56:45 +0200 | danse-nr3 | (~francesco@151.47.117.140) (Ping timeout: 258 seconds) |
2023-10-18 12:56:58 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) |
2023-10-18 12:57:49 +0200 | pavonia | (~user@user/siracusa) (Quit: Bye!) |
2023-10-18 13:01:19 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
2023-10-18 13:01:41 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) |
2023-10-18 13:02:25 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 13:03:48 +0200 | CiaoSen | (~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) |
2023-10-18 13:05:04 +0200 | ggVGc | (~ggVGc@a.lowtech.earth) (Quit: WeeChat 3.6) |
2023-10-18 13:05:15 +0200 | <Square> | I believe there is a trick to create a proxy by using pure or return in some combination instead of Proxy :: Proxy MyType. Anyone know that one? I can't seem to recall how its done. |
2023-10-18 13:05:17 +0200 | xff0x | (~xff0x@ai101218.d.east.v6connect.net) |
2023-10-18 13:05:55 +0200 | <Square> | oh, maybe it was from an value: pure value |
2023-10-18 13:07:49 +0200 | <tomsmeding> | :t pure (undefined :: Int) :: Proxy Int |
2023-10-18 13:07:50 +0200 | <lambdabot> | Proxy Int |
2023-10-18 13:08:05 +0200 | <tomsmeding> | Square: Proxy implements Applicative, so 'pure :: a -> f a' becomes 'pure :: a -> Proxy a' |
2023-10-18 13:08:26 +0200 | <Square> | right. Thanks |
2023-10-18 13:08:31 +0200 | <tomsmeding> | but that really helps only if you already have an 'a' lying around |
2023-10-18 13:08:48 +0200 | <tomsmeding> | (and it does not aid readability :p ) |
2023-10-18 13:09:06 +0200 | <Square> | yeah, wish there was a shorter version directly from type |
2023-10-18 13:10:14 +0200 | <ncf> | :t Proxy @Int |
2023-10-18 13:10:15 +0200 | <lambdabot> | error: parse error on input ‘@’ |
2023-10-18 13:11:04 +0200 | <Square> | sweet. I'll try that |
2023-10-18 13:11:32 +0200 | <ncf> | TypeApplications |
2023-10-18 13:13:47 +0200 | <albet70> | > fmap (+1) (Left 2) |
2023-10-18 13:13:48 +0200 | arahael | (~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net) |
2023-10-18 13:13:49 +0200 | <lambdabot> | Left 2 |
2023-10-18 13:14:04 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 13:19:16 +0200 | hiyori | (~hiyori@user/hiyori) (Quit: Client closed) |
2023-10-18 13:21:32 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Ping timeout: 272 seconds) |
2023-10-18 13:26:26 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) (Ping timeout: 255 seconds) |
2023-10-18 13:27:08 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds)) |
2023-10-18 13:28:08 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 13:31:07 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 13:32:06 +0200 | <tomsmeding> | > first (+1) (Left 2) |
2023-10-18 13:32:08 +0200 | <lambdabot> | error: |
2023-10-18 13:32:08 +0200 | <lambdabot> | • Couldn't match type ‘(b, d)’ with ‘Either a0 b0’ |
2023-10-18 13:32:08 +0200 | <lambdabot> | Expected type: Either a0 b0 -> (b, d) |
2023-10-18 13:32:16 +0200 | <tomsmeding> | er |
2023-10-18 13:32:27 +0200 | <tomsmeding> | oh |
2023-10-18 13:33:17 +0200 | <tomsmeding> | % Data.Bifunctor.first (+1) (Left 2) |
2023-10-18 13:33:17 +0200 | <yahb2> | Left 3 |
2023-10-18 13:33:51 +0200 | <tomsmeding> | why does lambdabot have arrows imported instead of bifunctors |
2023-10-18 13:34:49 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 255 seconds) |
2023-10-18 13:37:16 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed) |
2023-10-18 13:37:40 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 13:39:28 +0200 | cpressey15 | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 13:40:01 +0200 | Vajb | (~Vajb@207.61.167.122) (Ping timeout: 252 seconds) |
2023-10-18 13:42:38 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Ping timeout: 245 seconds) |
2023-10-18 13:42:56 +0200 | cpressey15 | cpressey |
2023-10-18 13:45:15 +0200 | Square2 | (~Square4@user/square) |
2023-10-18 13:47:29 +0200 | Square | (~Square@user/square) (Ping timeout: 255 seconds) |
2023-10-18 13:47:30 +0200 | Square3 | (~Square4@user/square) (Ping timeout: 272 seconds) |
2023-10-18 13:50:01 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds)) |
2023-10-18 13:50:54 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 13:56:15 +0200 | aforemny | (~aforemny@2001:9e8:6ce3:9f00:c447:f7a7:e738:aefa) (Ping timeout: 240 seconds) |
2023-10-18 13:57:31 +0200 | <Inst> | hmmm |
2023-10-18 13:57:39 +0200 | <Inst> | here's an idea for "IO monad sucks / Haskell syntax sucks" |
2023-10-18 13:57:48 +0200 | <Inst> | you'd still want isMain for that |
2023-10-18 13:57:58 +0200 | <Inst> | this is actually a pretty interesting idea for a library |
2023-10-18 13:58:34 +0200 | <Inst> | but it's pretty much "OOP", unfortunately, i.e, trying to generate monadic types that are universally records |
2023-10-18 13:58:42 +0200 | <Inst> | so you'd bypass the variadic function issue for Haskell |
2023-10-18 13:59:03 +0200 | <Inst> | it'd be a pretty interesting basis for an alt prelude |
2023-10-18 13:59:35 +0200 | <Inst> | the ability to do IO actions as getLine {text = hello} |
2023-10-18 13:59:38 +0200 | <Inst> | nah, the syntax still sucks here |
2023-10-18 14:00:22 +0200 | aforemny | (~aforemny@2001:9e8:6ce4:a700:b6be:fb5b:7ea6:79a3) |
2023-10-18 14:02:43 +0200 | <yushyin> | haskell syntax (extensions aside) is fine and clear |
2023-10-18 14:08:36 +0200 | <Inst> | there is precisely one problem with Haskell syntax, imo, and that's the lack of variadics |
2023-10-18 14:08:54 +0200 | <Inst> | it makes it harder to have ergonomic library API design |
2023-10-18 14:09:22 +0200 | <Inst> | algol syntax languages have input("Enter name here: ") and input() at the same time |
2023-10-18 14:09:39 +0200 | <Inst> | you have to do funky variadic function overloading with typeclasses to get that |
2023-10-18 14:09:42 +0200 | danse-nr3 | (~francesco@151.37.121.111) |
2023-10-18 14:09:54 +0200 | <nullie> | wouldn't it become typing hell |
2023-10-18 14:09:55 +0200 | <Inst> | being able to do foo bar baz and foo, and have both typecheck |
2023-10-18 14:10:04 +0200 | <cheater> | What is Haskell? A miserable little pile of syntaxes. |
2023-10-18 14:10:28 +0200 | <Inst> | the two ways to do it right now is to get a typeclass to overload |
2023-10-18 14:10:39 +0200 | <Inst> | and do some weird crap with that |
2023-10-18 14:10:48 +0200 | <Inst> | or to use a default record, and overload arguments onto the default record, but that's still painful |
2023-10-18 14:10:52 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 14:11:13 +0200 | lortabac | (~lortabac@37.169.5.141) |
2023-10-18 14:11:15 +0200 | <Inst> | what we do right now is have variant functions, but that's unergonomic |
2023-10-18 14:11:26 +0200 | qqq | (~qqq@92.43.167.61) |
2023-10-18 14:11:34 +0200 | <Inst> | getLinePrompt is a pain |
2023-10-18 14:12:00 +0200 | <Inst> | unless there's more ways i'm unfamiliar with :( |
2023-10-18 14:12:23 +0200 | <Inst> | @danse-nr3: do I know you by another name on Matrix? |
2023-10-18 14:12:23 +0200 | <lambdabot> | Unknown command, try @list |
2023-10-18 14:31:59 +0200 | lortabac | (~lortabac@37.169.5.141) (Read error: Connection reset by peer) |
2023-10-18 14:33:02 +0200 | Vajb | (~Vajb@207.61.167.122) (Ping timeout: 255 seconds) |
2023-10-18 14:42:32 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
2023-10-18 14:43:33 +0200 | hgolden | (~hgolden@2603-8000-9d00-3ed1-1ee4-1b7c-94a7-8fa7.res6.spectrum.com) |
2023-10-18 14:51:57 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 14:52:07 +0200 | Square | (~Square@user/square) |
2023-10-18 15:00:19 +0200 | acidjnk_new | (~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
2023-10-18 15:04:01 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 15:06:33 +0200 | <cpressey> | Hi, could anyone help me understand why the following is not a syntax error? |
2023-10-18 15:06:36 +0200 | <cpressey> | > let 99 = 3 * 5 in 99 + 1 |
2023-10-18 15:06:37 +0200 | <lambdabot> | 100 |
2023-10-18 15:07:57 +0200 | <tomsmeding> | > let Just x = Just 42 in x |
2023-10-18 15:07:58 +0200 | <lambdabot> | 42 |
2023-10-18 15:08:16 +0200 | <tomsmeding> | > let (x, 42) = (10, 42) in x |
2023-10-18 15:08:17 +0200 | <lambdabot> | 10 |
2023-10-18 15:08:19 +0200 | <tomsmeding> | > let (x, 43) = (10, 42) in x |
2023-10-18 15:08:21 +0200 | <lambdabot> | *Exception: <interactive>:3:5-22: Non-exhaustive patterns in (x, 43) |
2023-10-18 15:08:31 +0200 | <tomsmeding> | cpressey: it's a degenerate pattern that happens to bind no variables |
2023-10-18 15:09:13 +0200 | <tomsmeding> | the reason why it doesn't give a _runtime_ error about non-exhaustive patterns (because the pattern does, of course, not match) is laziness: the match is never evaluated because none of its bound variables are ever used |
2023-10-18 15:09:22 +0200 | wib_jonas | (~wib_jonas@business-37-191-60-209.business.broadband.hu) |
2023-10-18 15:09:26 +0200 | <tomsmeding> | notwithstanding the fact that that is immediate because there _are_ no bound variables |
2023-10-18 15:09:49 +0200 | <tomsmeding> | it's a cute one though :) |
2023-10-18 15:10:06 +0200 | <tomsmeding> | could go on the haskell wtf list, after |
2023-10-18 15:10:11 +0200 | <tomsmeding> | > let 2 + 2 = 5 in 2 + 2 |
2023-10-18 15:10:12 +0200 | <lambdabot> | 5 |
2023-10-18 15:10:39 +0200 | <tomsmeding> | cpressey: how did you find it |
2023-10-18 15:11:00 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) |
2023-10-18 15:11:00 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host) |
2023-10-18 15:11:00 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 15:11:28 +0200 | <wib_jonas> | tomsmeding: I think that one just defines a (+) operator so that's less surprising |
2023-10-18 15:11:43 +0200 | <tomsmeding> | for a haskell programmer it is indeed not surprising |
2023-10-18 15:11:45 +0200 | <cpressey> | tomsmeding: the first version was "let 15 = 3 * 5 in 15 + 1" to see if Haskell would allow it |
2023-10-18 15:11:52 +0200 | <tomsmeding> | right |
2023-10-18 15:12:04 +0200 | <tomsmeding> | % :set -XBangPatterns |
2023-10-18 15:12:05 +0200 | <yahb2> | <no output> |
2023-10-18 15:12:10 +0200 | <tomsmeding> | % let !99 = 3 * 5 in 99 + 1 |
2023-10-18 15:12:10 +0200 | <yahb2> | *** Exception: <interactive>:41:5-15: Non-exhaustive patterns in 99 |
2023-10-18 15:12:15 +0200 | <tomsmeding> | right |
2023-10-18 15:12:22 +0200 | <tomsmeding> | if you make the pattern strict, it fails at runtime :) |
2023-10-18 15:12:27 +0200 | Vajb | (~Vajb@207.61.167.122) (Ping timeout: 258 seconds) |
2023-10-18 15:13:21 +0200 | <cpressey> | Anything to make it issue a warning at compile-time? To the effect that you have a pattern that doesn't have any variables? |
2023-10-18 15:13:26 +0200 | <tomsmeding> | % :set -Wall |
2023-10-18 15:13:26 +0200 | <yahb2> | <no output> |
2023-10-18 15:13:32 +0200 | <tomsmeding> | % let 99 = 3 * 5 in () |
2023-10-18 15:13:33 +0200 | <yahb2> | <interactive>:45:5: warning: [-Wunused-pattern-binds] ; This pattern-binding binds no variables: 99 = 3 * 5 ; ; <interactive>:45:5: warning: [-Wincomplete-uni-patterns] ; Pattern match(es)... |
2023-10-18 15:13:38 +0200 | <tomsmeding> | cpressey: -Wall |
2023-10-18 15:13:51 +0200 | <tomsmeding> | which everybody should use, as usual, and somehow not everybody does, as usual |
2023-10-18 15:13:59 +0200 | <cpressey> | well, -Wincomplete-uni-patterns it seems, but yes, thank you :) |
2023-10-18 15:14:05 +0200 | <tomsmeding> | % 2 |
2023-10-18 15:14:05 +0200 | <yahb2> | <interactive>:47:1: warning: [-Wtype-defaults] ; • Defaulting the following constraints to type ‘Integer’ ; (Show a0) ; arising from a use of ‘Yahb2Defs.limitedPrint’ ; ... |
2023-10-18 15:14:10 +0200 | <tomsmeding> | % :unset -Wall |
2023-10-18 15:14:10 +0200 | <yahb2> | don't know how to reverse -Wall |
2023-10-18 15:14:14 +0200 | <tomsmeding> | oh |
2023-10-18 15:14:15 +0200 | <tomsmeding> | % :q |
2023-10-18 15:14:15 +0200 | <yahb2> | <bye> |
2023-10-18 15:14:17 +0200 | <tomsmeding> | % 1 |
2023-10-18 15:14:18 +0200 | <yahb2> | 1 |
2023-10-18 15:14:45 +0200 | <tomsmeding> | problem with -Wall in the interactive repl is that defaulting is damn useful in the repl and it throws warnings all over the place (as it should) |
2023-10-18 15:15:19 +0200 | <tomsmeding> | cpressey: -Wunused-pattern-binds might be more specifically about this |
2023-10-18 15:15:52 +0200 | <tomsmeding> | (it's so strange that it triggers _two_ warnings!) |
2023-10-18 15:16:11 +0200 | <tomsmeding> | wow |
2023-10-18 15:16:23 +0200 | <tomsmeding> | https://paste.tomsmeding.com/3xo5H8qf |
2023-10-18 15:16:27 +0200 | <tomsmeding> | that's a _lot_ of output |
2023-10-18 15:16:50 +0200 | <cpressey> | I tried it locally with ghci -Wall and it actually gave me 5 warnings |
2023-10-18 15:17:00 +0200 | <tomsmeding> | see my paste, you can make it 6 |
2023-10-18 15:17:19 +0200 | <tomsmeding> | only 4 on 8.10.7 though |
2023-10-18 15:18:24 +0200 | <cpressey> | Ah, you've got a 1 on both sides, so you get overlapping patterns too |
2023-10-18 15:18:56 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 15:18:57 +0200 | <tomsmeding> | hm? same warnings if I do "in 2" |
2023-10-18 15:19:27 +0200 | <tomsmeding> | ah the overlapping-patterns warning is there only if GHC doesn't have to do arithmetic to see that the match is redundant |
2023-10-18 15:19:42 +0200 | <cpressey> | Ah ok |
2023-10-18 15:19:43 +0200 | <tomsmeding> | if you replace the "99 = 1" by "99 = 1 * 1" it disappears |
2023-10-18 15:19:49 +0200 | <tomsmeding> | fair enough |
2023-10-18 15:35:22 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) |
2023-10-18 15:38:07 +0200 | arahael | (~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds) |
2023-10-18 15:43:09 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 248 seconds) |
2023-10-18 15:44:06 +0200 | Guest9 | (~Guest9@ext-1-173.eduroam.chalmers.se) |
2023-10-18 15:44:43 +0200 | <Guest9> | Hi! Is there any way to pass in arguments to the compiler during compile time? I run some TH code during compile time and I would like to pass in a configurable parameter. Naturally, `cabal build my-exe -- argument` does not work |
2023-10-18 15:48:40 +0200 | <danse-nr3> | Inst: i don't think so, i don't hang out on matrix at the moment |
2023-10-18 15:55:41 +0200 | <Inst> | thanks |
2023-10-18 15:55:46 +0200 | <Inst> | hmmm, also: |
2023-10-18 15:56:01 +0200 | acidjnk_new | (~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) |
2023-10-18 15:56:02 +0200 | sm | (~sm@plaintextaccounting/sm) (Quit: sm) |
2023-10-18 15:56:13 +0200 | <Inst> | still am trying to figure out how to implement varargs in haskell |
2023-10-18 15:57:03 +0200 | <Inst> | could reuse the brace syntax for functions |
2023-10-18 15:57:41 +0200 | <Inst> | and disambiguate vs record syntax by having it always default to be a secord function |
2023-10-18 15:57:50 +0200 | <Inst> | *record function on the first brace |
2023-10-18 15:58:22 +0200 | <Inst> | erm, record syntax |
2023-10-18 15:58:36 +0200 | <Inst> | type system would be harder to do |
2023-10-18 15:58:40 +0200 | <Inst> | implicit parameters? |
2023-10-18 15:59:43 +0200 | notzmv | (~zmv@user/notzmv) (Ping timeout: 264 seconds) |
2023-10-18 16:00:55 +0200 | alphacentauri | (alphacenta@gateway/vpn/protonvpn/alphacentauri) (Quit: WeeChat 4.1.0) |
2023-10-18 16:01:53 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 16:04:09 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) |
2023-10-18 16:04:10 +0200 | shriekingnoise | (~shrieking@186.137.175.87) |
2023-10-18 16:06:07 +0200 | <danse-nr3> | no i think it was discussed here not long ago, there is no idiomadic way |
2023-10-18 16:09:07 +0200 | <Inst> | i'mm thinking language extensions |
2023-10-18 16:09:31 +0200 | <Inst> | foo {} |
2023-10-18 16:09:42 +0200 | <Inst> | foo :: bunch of implicit params go here => () -> a |
2023-10-18 16:10:03 +0200 | <Inst> | the bigger question is how it'd be unhaskelly |
2023-10-18 16:13:25 +0200 | thegeekinside | (~thegeekin@189.180.124.118) |
2023-10-18 16:17:44 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Ping timeout (120 seconds)) |
2023-10-18 16:18:18 +0200 | <int-e> | > let start f = f []; push xs x f = f (x:xs); add (x:y:xs) f = f (x+y:xs); end xs = xs in start push 42 push 23 add push 11 add end |
2023-10-18 16:18:19 +0200 | <lambdabot> | [76] |
2023-10-18 16:19:39 +0200 | <danse-nr3> | neat! |
2023-10-18 16:19:45 +0200 | <int-e> | Inst: What's the type of your function? |
2023-10-18 16:19:55 +0200 | <probie> | Inst: how often do you need a true var args function? Still, you can look at how `Text.printf` is implemented |
2023-10-18 16:21:43 +0200 | <int-e> | danse-nr3: It's the only example I know of of something that is kind of a varargs function but doesn't rely on type classes (only polymorphism). If you overdo it it'll seriously strain the type checker though. |
2023-10-18 16:24:25 +0200 | <Inst> | int-e: it's more a question of how to build "accessible" libraries, i.e, people are used to having non-curried functions |
2023-10-18 16:24:47 +0200 | <Inst> | the type would be implicit params => () -> something |
2023-10-18 16:24:57 +0200 | <Inst> | you'd invoke via fun {args...} |
2023-10-18 16:25:07 +0200 | <Inst> | the args would then get passed as implicit params with a default value |
2023-10-18 16:25:46 +0200 | <Inst> | like i said, i'd just be more worried about it being unhaskelly because you'd essentially end up with a hybrid algol / ml syntax from it |
2023-10-18 16:25:52 +0200 | <int-e> | I don't see how this is accessible. |
2023-10-18 16:26:57 +0200 | <Inst> | it's more ergonomic for the library writer, and accessible to the end user because you don't need the typeclass overloading stuff anymore |
2023-10-18 16:27:10 +0200 | <int-e> | [citation needed] |
2023-10-18 16:27:42 +0200 | Guest9 | (~Guest9@ext-1-173.eduroam.chalmers.se) (Quit: Connection closed) |
2023-10-18 16:27:43 +0200 | <int-e> | Type errors are a boon. Variadic functions and types don't go together well. If you don't want types, don't use Haskell. |
2023-10-18 16:27:59 +0200 | <Inst> | thanks <3 |
2023-10-18 16:28:10 +0200 | <Inst> | i was asking about how this would be unhaskelly, you answered my question for me |
2023-10-18 16:28:31 +0200 | <int-e> | (As people have pointed out, there are tricks to get variadic functions. Those invariably have quite terrible type errors when you hold them wrong.) |
2023-10-18 16:28:40 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 16:29:10 +0200 | <Inst> | the only benefit of the system i'd propose would be that it'd reduce the chances of error when screwing up with variadic functions |
2023-10-18 16:29:19 +0200 | <Inst> | the natural place for such functions would be in IO or IO surrogates |
2023-10-18 16:29:27 +0200 | <int-e> | > printf "%f" id |
2023-10-18 16:29:28 +0200 | <lambdabot> | error: |
2023-10-18 16:29:28 +0200 | <lambdabot> | • Could not deduce (PrintfArg (a0 -> a0)) |
2023-10-18 16:29:28 +0200 | <lambdabot> | arising from a use of ‘printf’ |
2023-10-18 16:29:40 +0200 | <int-e> | (that's not even half the error) |
2023-10-18 16:29:51 +0200 | <Inst> | i don't think anyone would want to use it outside IO etc |
2023-10-18 16:31:20 +0200 | <danse-nr3> | when i came to haskell at first i missed variadic functions, now i struggle to imagine an use case for them... i always end up thinking: "so... we want a list?" |
2023-10-18 16:31:43 +0200 | <Inst> | I only miss variadic functions when I look up a Haskell library and notice the API design |
2023-10-18 16:31:58 +0200 | <Inst> | of course the library is perfectly fine and usable, but lack of variadics makes it harder to pick up |
2023-10-18 16:32:30 +0200 | <Inst> | in fact there's a few functions that implement variadics that i feel, not necessarily know, is smelly |
2023-10-18 16:32:38 +0200 | <Inst> | *a few libraries |
2023-10-18 16:33:05 +0200 | misterfish | (~misterfis@84-53-85-146.bbserv.nl) (Remote host closed the connection) |
2023-10-18 16:33:49 +0200 | <Inst> | if such an extension existed, i'd actually want the extension split up, one for writing variadic functions, and another for calling them |
2023-10-18 16:36:03 +0200 | <int-e> | I guess the answer to "what do people who really really want a variable number of arguments of varying types use" is something like HList. |
2023-10-18 16:36:24 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 258 seconds) |
2023-10-18 16:36:59 +0200 | <int-e> | Or possibly something on top of Template Haskell. |
2023-10-18 16:37:01 +0200 | <danse-nr3> | or a sum type. Varying types does not have to mean any type |
2023-10-18 16:40:20 +0200 | wib_jonas | (~wib_jonas@business-37-191-60-209.business.broadband.hu) (Quit: Client closed) |
2023-10-18 16:49:42 +0200 | [itchyjunk] | (~itchyjunk@user/itchyjunk/x-7353470) |
2023-10-18 16:50:09 +0200 | idgaen | (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
2023-10-18 16:50:58 +0200 | danse-nr3 | (~francesco@151.37.121.111) (Ping timeout: 258 seconds) |
2023-10-18 16:52:22 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 16:53:58 +0200 | <probie> | I think you just want a list of a boring old sum type |
2023-10-18 16:54:17 +0200 | <tomsmeding> | the only useful variadic function I know in C is printf |
2023-10-18 16:54:21 +0200 | <tomsmeding> | (and friends) |
2023-10-18 16:54:39 +0200 | <tomsmeding> | C and C++, that is |
2023-10-18 16:54:59 +0200 | <tomsmeding> | it seems to me that all other useful cases of variadic functions are not actually variadic functions, they're simply ad-hoc overloading |
2023-10-18 16:55:05 +0200 | <tomsmeding> | we don't do that in haskell |
2023-10-18 16:55:25 +0200 | <tomsmeding> | granted, printf is useful and awkward in haskell. But that's a small price for getting, well, haskell |
2023-10-18 16:56:12 +0200 | <tomsmeding> | execl() and friends do not count because seriously, use execv already |
2023-10-18 16:56:43 +0200 | <tomsmeding> | (execl() and friends only exist in C because creating and filling an array in C is annoying) |
2023-10-18 16:57:23 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds) |
2023-10-18 16:57:29 +0200 | <tomsmeding> | well, I said "we don't do that in haskell" -- we have type classes for that |
2023-10-18 16:57:44 +0200 | <tomsmeding> | but it's more structured than the bare-bones ad-hoc overloading you get in C++ |
2023-10-18 16:59:51 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds) |
2023-10-18 17:00:26 +0200 | euleritian | (~euleritia@77.22.252.56) |
2023-10-18 17:01:13 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) |
2023-10-18 17:04:45 +0200 | danse-nr3 | (~francesco@151.37.121.111) |
2023-10-18 17:05:09 +0200 | <vektor> | Is there a way to constrain a data type to only take type args of certain classes? Concretely, could I build a type Vector a that guarantees that a is always Num? Or always Show? I have a datatype that makes sense only with a small set of types 'a', but I want to be agnostic of the concrete type 'a' used there. The usual solution is to just carry |
2023-10-18 17:05:09 +0200 | <vektor> | the class constraint in all relevant functions, but I found that dissatisfactory. |
2023-10-18 17:06:38 +0200 | <vektor> | Mostly because in many functions I don't actually care about what 'a' is, but then 20 functions down from the last mention, I want to debug-print a value of a, and have to add Show a to 20 signatures, when in my mind it doesn't even make sense to have 'a' not be show. |
2023-10-18 17:08:14 +0200 | <ncf> | ghc has something called the "stupid context" which i learnt about recently https://hackage.haskell.org/package/ghc-9.8.1/docs/src/GHC.Core.DataCon.html |
2023-10-18 17:08:26 +0200 | <ncf> | is that what you're looking for? |
2023-10-18 17:09:01 +0200 | azimut | (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 252 seconds) |
2023-10-18 17:09:24 +0200 | <danse-nr3> | or is this a case for a plain constraint on a type parameter? |
2023-10-18 17:09:56 +0200 | <EvanR> | check out this variadic printf: putStrLn [show 234, show 8.423, show True, show 'c'] |
2023-10-18 17:10:10 +0200 | statusbot12 | (~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com) (Remote host closed the connection) |
2023-10-18 17:10:11 +0200 | <EvanR> | er, throw a concat in there |
2023-10-18 17:10:24 +0200 | statusbot | (~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com) |
2023-10-18 17:10:26 +0200 | <EvanR> | or unlines |
2023-10-18 17:10:27 +0200 | Achylles | (~Achylles_@45.182.57.85) |
2023-10-18 17:11:18 +0200 | <danse-nr3> | oh i see you want to have `data D = Show a => D a` for instance? Yeah makes sense i was looking for something similar some time ago |
2023-10-18 17:11:54 +0200 | <ddellacosta> | existential types, but they have always seemed like more trouble than it's worth. Stupid context is interesting ncf , TIL, thanks |
2023-10-18 17:11:56 +0200 | <EvanR> | Vector (String, a) |
2023-10-18 17:12:14 +0200 | <EvanR> | very stupid context ^ |
2023-10-18 17:12:49 +0200 | <EvanR> | data StringAnd a = StringAnd String a |
2023-10-18 17:13:28 +0200 | <ncf> | er i guess it's not GHC-specific. it's right there in the haskell 98 report: data [context =>] simpletype = constrs |
2023-10-18 17:14:21 +0200 | <EvanR> | somewhat more seriously, it would be nice if in debug mode you could just debug values without threading Show everywhere, like a built-in Show (similar to how Typeable is built-in now) |
2023-10-18 17:14:30 +0200 | <[Leary]> | I think that "stupid context" is referring to DatatypeContexts, in which case it's entirely useless. Re existential, you don't actually need to hide a type to carry a constraint around, so that can solve the issue given a runtime cost, but may require the constraints be present in your type sigs anyway. |
2023-10-18 17:15:15 +0200 | <EvanR> | idris has no issue displaying something for any term, even functions |
2023-10-18 17:15:17 +0200 | <vektor> | danse-nr3: That's what I want, yeah. Basically, define `data D a = (Show a, Num a) => Constructor1 | Constructor2`, and then never have to worry about telling ghc that 'yes, a is in fact show and Num, don't worry your pretty little head about that part'. Is that what that does? |
2023-10-18 17:16:56 +0200 | <vektor> | as for the concurrent suggestion of "stupid context", I wasn't quite able to make sense of that yet, but it seems to build upon danse's suggestion? THough the syntax used there is `data (Eq a, Ord b) => T a b = T1 a b | T2 a` |
2023-10-18 17:16:59 +0200 | <ncf> | [Leary]: why is it entirely useless? |
2023-10-18 17:17:14 +0200 | <danse-nr3> | so existential types suggested above by ddellacosta seem to be the solution |
2023-10-18 17:17:40 +0200 | <[Leary]> | ncf: You can't actually /use/ the constraint, only impose it. |
2023-10-18 17:18:15 +0200 | <ncf> | right |
2023-10-18 17:20:25 +0200 | <EvanR> | by using the existential, I'm not sure how that accomplishes the goal of requiring support down the line but not specifying it in the users type signatures |
2023-10-18 17:20:46 +0200 | <EvanR> | the users still can't be totally polymorphic, they have to specify your existential |
2023-10-18 17:21:06 +0200 | <EvanR> | also, common wisdom is you don't want to accomplish this goal |
2023-10-18 17:21:10 +0200 | ski | (~ski@88.131.7.247) |
2023-10-18 17:21:18 +0200 | <danse-nr3> | i just started reading, seems like the main usecase suggests that the costrained parameter is not exposed in the type |
2023-10-18 17:22:20 +0200 | <ddellacosta> | yeah, I probably shouldn't have mentioned existential types, to echo what EvanR is saying |
2023-10-18 17:22:23 +0200 | <EvanR> | you can't have quote most of your functions not care about the type in Vector a, but still call these inner functions that require special support |
2023-10-18 17:22:48 +0200 | <EvanR> | since they actually do care |
2023-10-18 17:23:02 +0200 | CiaoSen | (~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) (Ping timeout: 255 seconds) |
2023-10-18 17:23:10 +0200 | <[Leary]> | vektor: You'd want `data T a b = (Eq a, Ord b) => T1 a b | Eq a => T2 a`. You /do/ have to satisfy the constraints upon constructing the data, but they're then made available upon pattern matching. |
2023-10-18 17:23:29 +0200 | <vektor> | Ok, so DatatypeContexts and data (Show a) => D a seems to demand I carry the 'Show a' constraint everywhere I take my D a. That's the opposite of what I intended... |
2023-10-18 17:23:39 +0200 | _xor | (~xor@72.49.199.93) (Quit: Ping timeout (120 seconds)) |
2023-10-18 17:23:50 +0200 | <vektor> | [Leary], I assume that syntax does the other thing then? :D |
2023-10-18 17:24:02 +0200 | alphacentauri | (alphacenta@gateway/vpn/protonvpn/alphacentauri) |
2023-10-18 17:24:18 +0200 | _xor | (~xor@72.49.199.93) |
2023-10-18 17:26:05 +0200 | <EvanR> | you would have to put Vector (D a) everywhere instead, so I guess it saves some typing, but that doesn't make anything fully polymorphic. Another way to reduce typing is to make a synonym for (Show a, Num a) =>, so shorthanded would be something like SN a => |
2023-10-18 17:27:33 +0200 | billchenchina | (~billchenc@2a0c:b641:7a2:230::10) |
2023-10-18 17:27:45 +0200 | <c_wraith> | vektor: the semantics of DatatypeContexts are *solely* that the constraint is added to the constructor. There's no provision that the constraint mean anything. This is why it's deprecated - it's useless. |
2023-10-18 17:29:49 +0200 | <vektor> | Yeah, I vaguely remember attacking this same problem before and not making much progress. Ever since then, there's been a pesky "-XDatatypeContexts is deprecated" warning that I never really bothered to fix. I have been here before O.o |
2023-10-18 17:31:20 +0200 | euleritian | (~euleritia@77.22.252.56) (Ping timeout: 246 seconds) |
2023-10-18 17:32:07 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 252 seconds) |
2023-10-18 17:33:05 +0200 | <EvanR> | your original "problem" of putting constraints on operations that need them is actually the solution |
2023-10-18 17:33:30 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 17:33:37 +0200 | <EvanR> | the problem of debugging stuff though, there might be a better way to go about it |
2023-10-18 17:33:40 +0200 | <tomsmeding> | yeah, the established alternative to DatatypeContexts is just putting the constraints on the operation |
2023-10-18 17:34:15 +0200 | <tomsmeding> | "putting the constraint _in_ the data type" is making a GADT, like [Leary] suggested |
2023-10-18 17:35:42 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) |
2023-10-18 17:39:17 +0200 | <vektor> | Ok, I've messed about with what Leary suggested now. Running after the stack of compiler errors I inevitably get, my main observation is that I lose some of the "undesired" polymorphism. So when previously I could arrange constructors to create a value of type 'D a' and then later decide on which a to use, now I have to either decide on which a to |
2023-10-18 17:39:17 +0200 | <vektor> | use, or carry the (Num a, Show a) constraint in places I previously didn't have to. Taking a step back, the constraint seems to no longer be needed in places that consumed or transformed D, but is now needed in places that create D. I guess that makes sense, no free lunch after all. |
2023-10-18 17:40:01 +0200 | <EvanR> | you're basically bundling the dictionary with your value |
2023-10-18 17:40:26 +0200 | <vektor> | sorry, what dictionary? |
2023-10-18 17:40:33 +0200 | <EvanR> | sort of a Num a *> a, as opposed to Num a => a which is like a function waiting for a dictionary |
2023-10-18 17:40:38 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
2023-10-18 17:41:19 +0200 | <EvanR> | the dictionary is how type classes are implemented, it's a record of all the instance methods. GHC passes it around for you when there is ad-hoc polymorphism |
2023-10-18 17:41:31 +0200 | Achylles | (~Achylles_@45.182.57.85) (Quit: Leaving) |
2023-10-18 17:42:02 +0200 | danse-nr3_ | (~francesco@151.57.122.70) |
2023-10-18 17:42:33 +0200 | danse-nr3 | (~francesco@151.37.121.111) (Read error: Connection reset by peer) |
2023-10-18 17:43:06 +0200 | econo_ | (uid147250@id-147250.tinside.irccloud.com) |
2023-10-18 17:44:34 +0200 | <ski> | `elem :: Eq a => a -> [a] -> Bool' is transformed into `elem :: EqDict a -> a -> [a] -> Bool', where `data EqDict a = MkEqDict {(==),(/=) :: a -> a -> Bool} is the dictionary/record/"vtable" that is the translation of `class Eq a of (==),(/=) :: a -> a -> Bool' |
2023-10-18 17:46:57 +0200 | <EvanR> | when you build a GADT with constraints on the constructor, the dictionary is bundled. When you case analyze a GADT the dictionaries come out again |
2023-10-18 17:47:20 +0200 | <ski> | vektor : .. and `data T a b = (Eq a, Ord b) => T1 a b | Eq a => T2 a' above would then get translated into `data T a b = T1 (EqDict a) (OrdDict b) a b | T2 (EqDict a) a' .. so when you're constructing `T1's and `T2's, you're packing those instance dictionaries into the data structure. and when you're pattern-matching, you're getting them back out again |
2023-10-18 17:48:15 +0200 | <EvanR> | in light of all this, if you just need the Show constraint, it's clear that you could get the same effect by just bundling a String instead and skip the machinery xD |
2023-10-18 17:49:17 +0200 | <ski> | (of course, an implementation is free to inline these dictionaries wherever it can .. but it can't do that, everywhere, due "polymorphic recursion" (technical term). and also due to a bunch of language extensions, should you turn any of them on) |
2023-10-18 17:49:25 +0200 | <tomsmeding> | (in which case a smart constructor / pattern synonym might come in handy to avoid having to keep the String up to date manually) |
2023-10-18 17:49:32 +0200 | <vektor> | Oh, dang. I had thought the Existential thing mapped the constraint over all constructors, but if I just put it once, it's just for the first somehow...? Color me thoroughly confused. |
2023-10-18 17:49:55 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) |
2023-10-18 17:49:55 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host) |
2023-10-18 17:49:55 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 17:50:15 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 17:50:19 +0200 | <dolio> | Each constructor gets its own context. |
2023-10-18 17:50:30 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 17:50:39 +0200 | <ski> | vektor : in `data T ... = ... | Eq a => C ..a.. | ...', `Eq a' is attached only to the data constructor `C' there |
2023-10-18 17:50:52 +0200 | <tomsmeding> | the first step in understanding all this is reading '->' for '=>'. (The 'data T a = Eq a => C a a' notation is a bit special; the GADT version, which is 'data T a where C :: Eq a -> a -> a -> T a', is clearer.) |
2023-10-18 17:51:25 +0200 | <tomsmeding> | er, oops, Eq a => a -> a -> T a, of course :D |
2023-10-18 17:51:54 +0200 | <vektor> | ski: Ahhh, I see. That's why it's not doing what I hoped. I can't eliminate the redundant constraints on functions working with my data type, because the constraints I baked into the data def only apply to the first constructor... |
2023-10-18 17:52:31 +0200 | <EvanR> | if they only apply to the first constructor then fine? |
2023-10-18 17:52:49 +0200 | <EvanR> | you still don't need more constraints on functions accepting the type |
2023-10-18 17:53:48 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 240 seconds) |
2023-10-18 17:53:50 +0200 | <EvanR> | unless there are other arguments which need to be compatible for some reason and then we need examples |
2023-10-18 17:54:16 +0200 | <vektor> | I mean, if I now write a prettyPrint :: D a -> String ... my expectation was that a (Show a) constraint wouldn't be necessary, as it's implied by the type: (D a) can not exist with an a that is not Show. That was the point of the exercise. |
2023-10-18 17:54:27 +0200 | <ski> | vektor : mind, i didn't catch the start of this conversattion (e.g. hasn't seen any code snippets you might've shown) |
2023-10-18 17:54:47 +0200 | <EvanR> | yes because you couldn't have constructed one |
2023-10-18 17:55:17 +0200 | <EvanR> | no |
2023-10-18 17:55:58 +0200 | <vektor> | EvanR: Are you saying if I apply the constraint to all constructors, the compiler would figure out that there can only ever be 'D a' if (Show a)? |
2023-10-18 17:56:12 +0200 | ski | idly wonders how `D's defined |
2023-10-18 17:56:16 +0200 | <EvanR> | data T a where C1 :: Show a => a -> T a; C2 a -> T a -- here, you can constraint a non-Show a. But you wouldn't be able to pretty print it, probably. So you could show "????" instead |
2023-10-18 17:56:17 +0200 | <tomsmeding> | prettyPrint needs to get the 'show' method for 'a' from _somewhere_; if prettyPrint takes 'Show a =>', then it gets that method as an argument. If you put 'Show a =>' on a constructor of D, that constructor has the method in one of its fields. Either way prettyPrint gets the info. |
2023-10-18 17:56:19 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 17:56:30 +0200 | <tomsmeding> | If you do neither of those things, it can't magically conjure up the method from somewhere :p |
2023-10-18 17:56:59 +0200 | <EvanR> | vektor, no, this is much simpler than you are thinking |
2023-10-18 17:58:00 +0200 | <tomsmeding> | the whole intuition of "types being a member of a type class" only exists during typeclass _resolution_, which is the phase where ghc turns code with '=>' into code with '->', explictly passing the dictionaries (containing the type class methods) around |
2023-10-18 17:58:24 +0200 | <tomsmeding> | after that, type classes don't exist any more, there's just some additional records/dictionaries of stuff being passed around |
2023-10-18 17:59:13 +0200 | <vektor> | ski, just to fill you in, I have a data type 'D a' (or actually 'Expr x a', and yes, it's a syntax tree of a DSL) where a is only ever instantiated with types with Show and Num. I want to put those constraints into the type of D, so I don't have to make them explicit every time I try to "traceShow" a value of type a. |
2023-10-18 18:00:02 +0200 | ubert | (~Thunderbi@77.119.220.59.wireless.dyn.drei.com) (Ping timeout: 246 seconds) |
2023-10-18 18:00:13 +0200 | <EvanR> | put those constraints into constructors that hold the said types you want to show |
2023-10-18 18:00:22 +0200 | alphacentauri | (alphacenta@gateway/vpn/protonvpn/alphacentauri) (Quit: WeeChat 4.1.0) |
2023-10-18 18:00:24 +0200 | <tomsmeding> | right, that's the only thing you can do here |
2023-10-18 18:00:30 +0200 | <EvanR> | constructors you can show without that information... show them without the information and you don't need the constraints |
2023-10-18 18:00:32 +0200 | <vektor> | ... a value of type a contained within a D or Expr x of course. A naked a would still need the Show a thing. But Basically, I want to make functions like prettyPrint (D a) -> String, where I can call show on values of a without the compiler yelling. |
2023-10-18 18:00:33 +0200 | <ski> | vektor : you're using `GADTs' for that ? |
2023-10-18 18:01:20 +0200 | <EvanR> | a "naked a" in isolation has no support for anything, you can't even print it |
2023-10-18 18:01:21 +0200 | <vektor> | ski: nah, just plain ADT. |
2023-10-18 18:01:27 +0200 | <ski> | vektor : are `x' and `a' indices of `Expr' ? or just parameters ? |
2023-10-18 18:01:29 +0200 | <ski> | ok |
2023-10-18 18:01:42 +0200 | <EvanR> | and contradicts that you only use it at types that support Show |
2023-10-18 18:02:17 +0200 | <EvanR> | for the purposes of pretty printing another avenue is Generic, rather than Show |
2023-10-18 18:02:23 +0200 | <vektor> | Don't worry about x, that's just dead weight. a is the numeric type in which Expr does its computations. I.e. I can switch from Float to Double by one function call. |
2023-10-18 18:02:23 +0200 | ski | would still like to actually see this `Expr |
2023-10-18 18:02:25 +0200 | <ski> | ' |
2023-10-18 18:02:44 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 272 seconds) |
2023-10-18 18:05:04 +0200 | danse-nr3__ | (~francesco@151.57.122.70) |
2023-10-18 18:05:08 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 18:05:40 +0200 | danse-nr3_ | (~francesco@151.57.122.70) (Read error: Connection reset by peer) |
2023-10-18 18:05:48 +0200 | <vektor> | ski: https://paste.tomsmeding.com/6KsU2MIg - there you go. Shown here with the currently-workshopped "everything gets constraints" version. |
2023-10-18 18:07:10 +0200 | Natch | (~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se) (Ping timeout: 272 seconds) |
2023-10-18 18:08:35 +0200 | <ski> | imho, you might be better off with `data WrappedExpr x a = (Num a,Show a) => WrapExpr (WrappedExpr x a)' (and deleting all the bundled constraints in `Expr') -- at least that way, you'd not be putting your constraints into every single node of your syntax tree (quite redundently, one could think) |
2023-10-18 18:10:16 +0200 | Natch | (~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se) |
2023-10-18 18:10:37 +0200 | <ski> | .. and there's really no point in putting `Show a' constraints on the nodes that can't even contain any value of a type mentioning the `a' parameter (those data constructors are `ThetaI',`Uniform',`Normal',`Null',`Var',`TNull',`Call') |
2023-10-18 18:10:42 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds) |
2023-10-18 18:11:18 +0200 | <EvanR> | yes you can presumably print Null without any additional infor |
2023-10-18 18:11:38 +0200 | <ski> | (i'm assuming `Value a's can actually contain `a's, since there's no other place in there where `a' could actually get used) |
2023-10-18 18:11:41 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 18:12:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 18:12:08 +0200 | ubert | (~Thunderbi@77.119.220.59.wireless.dyn.drei.com) |
2023-10-18 18:12:18 +0200 | <vektor> | I mean, I just blindly copy pasted those constraints everywhere in the hopes that some GHC-magic would activate and ghc would figure out that "oh, Expr x a implies that a is both show and num, anywhere I go, but I'm not sure it's materializing. |
2023-10-18 18:12:28 +0200 | <EvanR> | which makes me think your actual objective is something else, given you wanted to trick GHC into thinking ^ |
2023-10-18 18:12:29 +0200 | <ski> | @where DecoratingStructures |
2023-10-18 18:12:29 +0200 | <lambdabot> | <http://web.archive.org/web/20051126143527/http://haskell.org/hawiki/DecoratingStructures> |
2023-10-18 18:12:36 +0200 | <ski> | @where IndirectComposite |
2023-10-18 18:12:36 +0200 | <lambdabot> | <http://web.archive.org/web/20051126141834/http://haskell.org/hawiki/IndirectComposite> |
2023-10-18 18:12:49 +0200 | <vektor> | Yeah, as said, a is the numeric type of the execution, so Values are where a lives. |
2023-10-18 18:12:58 +0200 | <EvanR> | GHC is not magic and the stuff involved here is purely mechanical |
2023-10-18 18:13:30 +0200 | <EvanR> | obeying the usual laws of nature |
2023-10-18 18:13:32 +0200 | <ski> | what you get out it what you put in |
2023-10-18 18:13:38 +0200 | <vektor> | I'm starting to think I've found a thing that's cognitively simple to think about ("just put an implied "Show a, Num a" onto every Expr x a), but ghc doesn't really do it simply. |
2023-10-18 18:14:09 +0200 | <ski> | vektor : what is the current problem you're experiencing (with this strategy you just described) ? |
2023-10-18 18:18:44 +0200 | notzmv | (~zmv@user/notzmv) |
2023-10-18 18:19:41 +0200 | sm | (~sm@plaintextaccounting/sm) (Quit: sm) |
2023-10-18 18:22:43 +0200 | <vektor> | Bunch of edge cases that interface with Expr in funny ways, gimme a few minutes. |
2023-10-18 18:22:50 +0200 | <EvanR> | if you put the constraints in the GADT, then yes logically the a in Expr x a are instances of Show and Num, assuming you managed to build an Expr x a. Anywhere you go. To prove it, pattern match the Expr |
2023-10-18 18:23:04 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) |
2023-10-18 18:24:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds) |
2023-10-18 18:24:38 +0200 | <vektor> | Currently, I only have an ADT. That make a difference to your statement? |
2023-10-18 18:24:44 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 18:24:47 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 18:24:50 +0200 | <ski> | it's not going to give you `Num a' and `Show a' anytime you have a value of type `Expr x a'. you have to pattern-match, as EvanR says, to extract those constraints. only in the scope of that pattern-match are those constraints known / in force |
2023-10-18 18:24:50 +0200 | ozone | (ozone@libera/bot/ozone) (Leaving the channel. /invite ozone again if needed) |
2023-10-18 18:25:10 +0200 | <ski> | vektor : do you currently have what you showed in the paste ? |
2023-10-18 18:25:41 +0200 | <vektor> | ski: Yeah, what's currently in the paste. I'm working on fixing the rest of the code to coordinate with it. |
2023-10-18 18:25:47 +0200 | <ski> | i believe EvanR meant the syntax of putting `..constraints.. =>' before the data constructors, by "GADT" here |
2023-10-18 18:27:56 +0200 | <vektor> | EvanR: Regarding the magic/mechanical comment, I'm quite aware, but I could've imagined GHC going "oh, all of these constructors have a subset of common constraints, let me take the intersection of all those and then you get them for free everywhere you meet an Expr x a. Not infeasible, afaict, but it would've surprised me if GHC just did that. |
2023-10-18 18:27:57 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 18:28:09 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) |
2023-10-18 18:28:20 +0200 | <ski> | yea, it doesn't |
2023-10-18 18:28:21 +0200 | <EvanR> | I'm glad GHC doesn't do surprising things |
2023-10-18 18:28:27 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 18:28:43 +0200 | <EvanR> | I like my code to be unsurprising AF |
2023-10-18 18:28:45 +0200 | <ski> | you only get the constraints associated with the data constructor, when you (sucessfully) match on that data constructor |
2023-10-18 18:29:02 +0200 | zenstoic | (uid461840@id-461840.hampstead.irccloud.com) |
2023-10-18 18:29:30 +0200 | <EvanR> | I'm kind of amazed how far people can get with their compilers not understanding how they work |
2023-10-18 18:29:38 +0200 | __monty__ | (~toonn@user/toonn) (Ping timeout: 255 seconds) |
2023-10-18 18:29:54 +0200 | <ski> | compilers are shiny toys |
2023-10-18 18:32:04 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
2023-10-18 18:32:09 +0200 | _ht | (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
2023-10-18 18:32:41 +0200 | <vektor> | EvanR: Well, "understanding the compiler" and "getting somewhere with the compiler" exist in a symbiotic relationship. Have to encounter situations you don't understand to learn something, but also have to stay reasonably close to what you know to stay effective. Right now I'm exploring quite a lot, so compiler surprises are expected. |
2023-10-18 18:33:15 +0200 | alphacentauri | (alphacenta@gateway/vpn/protonvpn/alphacentauri) |
2023-10-18 18:33:20 +0200 | <ski> | correct |
2023-10-18 18:33:24 +0200 | <vektor> | But personally I've never complained about an "oh hey, ghc can derive that instance for me" moment. Some surprises are good. |
2023-10-18 18:34:21 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) |
2023-10-18 18:34:21 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host) |
2023-10-18 18:34:21 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 18:35:15 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Client Quit) |
2023-10-18 18:36:36 +0200 | <EvanR> | I took your data type and wrote a function showE :: Expr x a -> String which makes use of show to print the Constant x (Value a). Of course, I have no way to do anything with the x |
2023-10-18 18:37:02 +0200 | L29Ah | (~L29Ah@wikipedia/L29Ah) () |
2023-10-18 18:37:17 +0200 | <vektor> | Cool. How's that look? |
2023-10-18 18:37:29 +0200 | <EvanR> | the code for showE? |
2023-10-18 18:37:31 +0200 | <vektor> | Yeah |
2023-10-18 18:37:32 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 248 seconds) |
2023-10-18 18:37:45 +0200 | <EvanR> | showE (Constant x v) = show v |
2023-10-18 18:38:41 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) |
2023-10-18 18:38:41 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host) |
2023-10-18 18:38:41 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 18:38:52 +0200 | <EvanR> | I defined a dummy type for Value a |
2023-10-18 18:38:56 +0200 | <vektor> | Huh. Ok. So the moment I match a Constant x v, I get access to Show a, and can do show v... |
2023-10-18 18:39:15 +0200 | <EvanR> | yes |
2023-10-18 18:39:52 +0200 | <EvanR> | I guess it doesn't require GADTs after all |
2023-10-18 18:39:57 +0200 | <vektor> | So with that, I can build a prettyPrinter that doesn't rely on Show a to work, because when the time comes that I need a Show a instance, I'm in your exact pattern above... |
2023-10-18 18:40:15 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 18:40:28 +0200 | <ski> | as mentioned before, when you pattern-match, the constraints associated with the data constructor will be made available |
2023-10-18 18:40:29 +0200 | <EvanR> | this all relies on Show |
2023-10-18 18:41:16 +0200 | <EvanR> | you used it in the data type definition, you use it in the pretty printer, and whatever constructs Expr has to be working on Showable values |
2023-10-18 18:41:31 +0200 | <EvanR> | at least for Constant expr |
2023-10-18 18:42:01 +0200 | <EvanR> | Null doesn't need it |
2023-10-18 18:42:09 +0200 | <vektor> | So I could sidestep the constraint (Show a) by just not building any Constants into the Expr... |
2023-10-18 18:42:15 +0200 | __monty__ | (~toonn@user/toonn) |
2023-10-18 18:42:43 +0200 | <EvanR> | if you take away the constraint on stuff like Null yes |
2023-10-18 18:42:53 +0200 | <vektor> | But the prettyPrinter :: Expr x a -> String does not need a Show a, because it gets that when it encounters a Constant. |
2023-10-18 18:43:07 +0200 | <ski> | i guess you could provide an environment for constants |
2023-10-18 18:43:09 +0200 | <vektor> | (that last one re: "this all relies on Show") |
2023-10-18 18:43:53 +0200 | <EvanR> | you can and should eliminate some of these constraints to rely less on Show, since it's not doing anything for e.g. Null |
2023-10-18 18:44:23 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) (Quit: Client closed) |
2023-10-18 18:45:38 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 18:46:43 +0200 | b_jonas | (~x@89.134.28.176) |
2023-10-18 18:47:59 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) |
2023-10-18 18:50:07 +0200 | danse-nr3__ | (~francesco@151.57.122.70) (Ping timeout: 264 seconds) |
2023-10-18 18:51:03 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 18:51:20 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 18:56:00 +0200 | tzh | (~tzh@c-71-193-181-0.hsd1.or.comcast.net) |
2023-10-18 18:56:00 +0200 | kuribas | (~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection) |
2023-10-18 18:56:44 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 18:57:00 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 18:57:12 +0200 | hugo | (znc@verdigris.lysator.liu.se) (Ping timeout: 272 seconds) |
2023-10-18 18:58:30 +0200 | billchenchina | (~billchenc@2a0c:b641:7a2:230::10) (Remote host closed the connection) |
2023-10-18 18:58:30 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) |
2023-10-18 18:58:40 +0200 | sm | (~sm@plaintextaccounting/sm) (Quit: sm) |
2023-10-18 18:59:04 +0200 | danse-nr3__ | (~francesco@151.57.122.70) |
2023-10-18 19:05:34 +0200 | Pozyomka | (~pyon@user/pyon) (Quit: Pozyomka, my beloved: https://i.imgur.com/BMmVfTq.png) |
2023-10-18 19:06:10 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) |
2023-10-18 19:07:13 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 19:08:29 +0200 | Pozyomka | (~pyon@user/pyon) |
2023-10-18 19:10:35 +0200 | <vektor> | Huh. now I have my valMap :: (Num b, Show b) => (a->b) -> Value a -> Value b. I can't seem to find the right syntax to add those constraints to the Functor Value instance. |
2023-10-18 19:11:21 +0200 | <ski> | you don't |
2023-10-18 19:11:44 +0200 | <vektor> | Because it's not a functor, or because it doesn't need those constraints? |
2023-10-18 19:12:30 +0200 | <ski> | `fmap :: forall a b. (a -> b) -> f a -> f b' (for some particular `f', `Value' in your case) promises to work for *all* types `a',`b', not just ones that happen to be instances of `Num' and `Show' |
2023-10-18 19:13:03 +0200 | ncf | . o O ( exofunctors ) |
2023-10-18 19:13:11 +0200 | <ski> | your `valMap' only (apparently) works for types `b' which are instances of `Num' and `Show' |
2023-10-18 19:15:29 +0200 | hugo | (znc@verdigris.lysator.liu.se) |
2023-10-18 19:15:44 +0200 | <EvanR> | you said you will only ever use types a which have Num and Show instance. But fmap allows you to contradict that by possibly producing b (any b) |
2023-10-18 19:15:47 +0200 | <ski> | vektor : did you add constraints on data constructors of `Value', as well ? |
2023-10-18 19:16:13 +0200 | <EvanR> | even b that doesn't support Show or NUm |
2023-10-18 19:16:26 +0200 | <vektor> | ski: Yeah, doing that right now. Seemed like the reasonable next step after convincing myself that prettyPrinting Expr works as intended. :) |
2023-10-18 19:17:59 +0200 | <vektor> | EvanR, yeah kinda hoped if this worked truly as I intended, then fmap would basically be constrained to only working on with (Num b, Show b). |
2023-10-18 19:18:08 +0200 | <EvanR> | fmap chr (MkValue 34) = ? |
2023-10-18 19:18:33 +0200 | <EvanR> | how would it even work as you intended, is the thing |
2023-10-18 19:18:45 +0200 | <EvanR> | I think the type system is catching a logic error here |
2023-10-18 19:19:03 +0200 | <vektor> | what's ' chr' ? |
2023-10-18 19:19:08 +0200 | <ski> | @type chr |
2023-10-18 19:19:09 +0200 | <lambdabot> | Int -> Char |
2023-10-18 19:19:10 +0200 | <ski> | > chr 34 |
2023-10-18 19:19:11 +0200 | <EvanR> | maps a number to a Char |
2023-10-18 19:19:12 +0200 | <lambdabot> | '"' |
2023-10-18 19:19:25 +0200 | <vektor> | ahh, ok. |
2023-10-18 19:19:29 +0200 | <EvanR> | using unicode |
2023-10-18 19:19:32 +0200 | <ski> | > [chr n | n <- [64 .. 95]] |
2023-10-18 19:19:33 +0200 | <lambdabot> | "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" |
2023-10-18 19:20:28 +0200 | <EvanR> | and Char isn't a Num |
2023-10-18 19:20:38 +0200 | <vektor> | Well, I was expecting that to not type, I guess? The deeper into this rabbit hole of "just constrain the type param of this type to only work with certain types" goes, the weirder it gets. |
2023-10-18 19:20:43 +0200 | rosco | (~rosco@193.138.218.161) (Quit: Lost terminal) |
2023-10-18 19:20:57 +0200 | <ski> | the type of `fmap' (which you can't change) ensures that it will type correctly |
2023-10-18 19:21:21 +0200 | <ski> | (it promises to work for *all* types `a' and `b') |
2023-10-18 19:21:52 +0200 | <EvanR> | vektor, you're right, it will only work for certain types |
2023-10-18 19:22:05 +0200 | <vektor> | I mean, it isn't really that the fmap shouldn't type check, I was expecting Val Char to not type check. Like, in any context. Val Char isn't, therefore fmap chr someValue shouldn't....? |
2023-10-18 19:22:07 +0200 | <ski> | result : since your `valMap' doesn't satisfy the promises that `fmap' makes, you can implement `fmap' by `valMap' |
2023-10-18 19:22:21 +0200 | <ski> | er .. *can't* |
2023-10-18 19:22:39 +0200 | <EvanR> | if Value is an instance of Functor, then fmap chr value does type check |
2023-10-18 19:22:49 +0200 | <EvanR> | but as we see that makes no sense so it can't a Functor |
2023-10-18 19:22:55 +0200 | <EvanR> | can't be |
2023-10-18 19:23:21 +0200 | <ski> | vektor : "I was expecting Val Char to not type check. Like, in any context. Val Char isn't" -- which is why you can't implement `fmap' by `valMap' |
2023-10-18 19:23:36 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 260 seconds) |
2023-10-18 19:24:46 +0200 | Square | (~Square@user/square) (Ping timeout: 260 seconds) |
2023-10-18 19:25:02 +0200 | <ski> | (because `fmap f (Val x)' is supposed to be `Val (f x)', therefore `fmap chr (Val 34)' would be `Val (chr 34)', iow `Val' applied to a `Char'. you can't prevent the user of `fmap' supplying a function `f' (namely `chr') whose result type is `Char') |
2023-10-18 19:25:21 +0200 | Square2 | (~Square4@user/square) (Ping timeout: 260 seconds) |
2023-10-18 19:25:35 +0200 | <vektor> | Massive Is-Ought distinction here, of course. I was imagining (and I'm not convinced *yet* it can't be) a type system that just prevents types like "Value Char" from existing. Like... at a later point? You let me have my Functor Value, but when I actually use it to fmap chr, then the type systems sees that that would create (Value Char), which |
2023-10-18 19:25:35 +0200 | <vektor> | violates my constraint on the type (Num a). Therefore, it breaks. |
2023-10-18 19:26:27 +0200 | <EvanR> | I like how haskell is serious about the types, resulting in behavior that follows its own logic. Many languages with a type system violate their logic for reasons, making people disregard the value of logic |
2023-10-18 19:26:28 +0200 | <vektor> | I get how not letting me have Functor Value upholds soundness here, but I can vaguely believe that that check could be, at least for the case I'm working with, delayed by one. |
2023-10-18 19:26:30 +0200 | cpressey | (~cpressey@host-2-102-14-126.as13285.net) (Quit: Client closed) |
2023-10-18 19:27:10 +0200 | <EvanR> | you said you would only use types which are instances of Num |
2023-10-18 19:27:19 +0200 | <EvanR> | which contradicts functor here |
2023-10-18 19:27:50 +0200 | <EvanR> | so you are either saved from an error, or your original plan needs rethinking |
2023-10-18 19:27:50 +0200 | <ski> | when you use `fmap chr blah', the type system only checks the types for `fmap',`chr',`blah' (and relevant instances in scope relating to types relevant to those). it does *not* check the implementation of any of `fmap',`chr',`blah' when type-checking. that would violate the interface abstraction that the type of the involved operations provides |
2023-10-18 19:28:16 +0200 | <vektor> | EvanR: Re Logic: Absolutely. The reason this project is in haskell is because I wouldn't trust myself enough in python to keep this code base sane. Static guarantees are very nice indeed. |
2023-10-18 19:29:38 +0200 | <EvanR> | kind of serious about the second part, for example this whole thing is about pretty printing expressions for debugging purposes. If that's the only reason for restricting to Num and Show, maybe you should step back |
2023-10-18 19:29:52 +0200 | <EvanR> | maybe the parameters to Expr are more polymorphic than you thought |
2023-10-18 19:30:29 +0200 | <EvanR> | putting constraints on operations not data by default leads you in that direction |
2023-10-18 19:30:30 +0200 | ski | . o O ( s/polymorphic/parametric/ ) |
2023-10-18 19:30:41 +0200 | <vektor> | ski: I understand that part. I understand why haskell does what it does here, but I could see a haskell that looks hat fmap chr blah and says "well, the type of that is Value Char. Value a has the constraint (Num a), and Char is not Num, therefore there's a type error here. Which means I could effectively fmap over Value only with operations f :: |
2023-10-18 19:30:42 +0200 | <vektor> | (Num a, Num b) => a -> b, but it's not enforced by the fmap, but only by the resulting type. I'm well aware that's not how haskell does things. |
2023-10-18 19:31:43 +0200 | <ski> | vektor : but that `chr' might be a parameter, which is only known to have type `x -> y' in this context, only in another context does `x' gets pinned down to `Int' and `y' to `Char' |
2023-10-18 19:31:53 +0200 | <EvanR> | in java i would expect people to implement Functor anyway and just have it crash when someone calls in an fmap which makes no sense |
2023-10-18 19:32:21 +0200 | <EvanR> | in haskell you don't let it go that far, ideally |
2023-10-18 19:32:24 +0200 | <ski> | vektor : also "Char is not Num" is easily fixed (well, "fixed") |
2023-10-18 19:33:56 +0200 | <ski> | @let instance Num Char where _ + _ = '+'; _ - _ = '-'; _ * _ = '*'; negate _ = '-'; abs _ = '|'; signum _ = 's'; fromInteger _ = 'n' |
2023-10-18 19:33:57 +0200 | <lambdabot> | Defined. |
2023-10-18 19:34:03 +0200 | <vektor> | EvanR: Yeah, I'm evaluating if I should step back and keep my code as is. The resulting trails of Show and Num everywhere are ultimately tolerable, and I'm unsure just how much technical debt I'm piling on with this change if I have to put another change onto the language. I'm coming to the conclusion that what I imagined was a simple fix isn't |
2023-10-18 19:34:04 +0200 | <vektor> | so simple. |
2023-10-18 19:34:05 +0200 | <ski> | there you go, `Char' is an instance of `Num' |
2023-10-18 19:34:27 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 19:34:37 +0200 | <vektor> | Curveball: Does it become a simple fix if I were to enumerate all possible acceptable types a? (Probably not, right?) |
2023-10-18 19:34:37 +0200 | <[exa]> | ski: as an absolute bonus, (+) and (*) seem to be associative. |
2023-10-18 19:34:49 +0200 | <EvanR> | vektor, actually, yes |
2023-10-18 19:35:06 +0200 | <ski> | instances are OWA (Open-World Assumption), not CWA (Closed-World Assumption) (these are logic programming terminology. type classes are related to logic programming). you can't ensure noone won't later make a type an instance of a class |
2023-10-18 19:36:09 +0200 | <vektor> | [exa] and while negate negate x =/= x, at least negate x == negate negate negate x. That's not too bad. |
2023-10-18 19:36:43 +0200 | <EvanR> | implementing Num for Char just means you need to come up with another example re: Functor |
2023-10-18 19:37:10 +0200 | <EvanR> | and there's no way to implement Num for literally all types |
2023-10-18 19:37:15 +0200 | <ski> | [exa] : but distributive law fails .. dang |
2023-10-18 19:37:18 +0200 | <vektor> | logic programming. Another field this small project of mine interfaces with that I understand not nearly enough of. Beyond the, ohh, half a dozen other computer science fields that the project interacts with, lol. |
2023-10-18 19:37:43 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 258 seconds) |
2023-10-18 19:38:07 +0200 | <ski> | LP is a lovely paradigm |
2023-10-18 19:38:20 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 19:38:24 +0200 | ski | 's recently been reading about ordered linear logic programming |
2023-10-18 19:39:43 +0200 | <vektor> | Now that I think about it, logic programming is probably, out of all the fields I should be knowing more about, the one field my project doesn't directly interface with, just kinda compete with in a way. Well, a flavor of logic programming anyway. |
2023-10-18 19:39:52 +0200 | <ski> | vektor : just in case you didn't know, inference rules in type systems are basically logic programming clauses (rules and facts), making up a logic program (although it might not be to useful to execute, at least naively, depending) |
2023-10-18 19:40:31 +0200 | L29Ah | (~L29Ah@wikipedia/L29Ah) |
2023-10-18 19:41:02 +0200 | <vektor> | When I was looking into type inference (the x in Expr x a is for type elaborations) I think I remember seeing a talk about someone who did exactly that; doing type inference as a logic program. |
2023-10-18 19:41:02 +0200 | mc47 | (~mc47@xmonad/TheMC47) (Remote host closed the connection) |
2023-10-18 19:41:34 +0200 | <ski> | apart from the connection between type classes & instances and predicates & clauses that i already mentioned above |
2023-10-18 19:42:18 +0200 | <vektor> | ski: Shouldn't it then be possible to simply assert "Value Char isn't" in that logic program and be done with it, making my vision of Utopia from above viable? It'd break anytime you fmap with something funny, but work as long as the fmap is from Num to Num. |
2023-10-18 19:42:20 +0200 | <EvanR> | vektor, ok, maybe it's not so simple. But if you are thinking there are only 3 possible a, you can define data ConcreteExpr a where AExpr :: Expr A -> ConcreteExpr A; BExpr :: Expr B -> ConcreteExpr B; CExpr :: Expr C -> ConcreteExpr C, then ConcreteExpr a can only exist at those three types |
2023-10-18 19:43:21 +0200 | <ski> | vektor : in case you're interested, i could suggest a couple of papers |
2023-10-18 19:43:21 +0200 | <EvanR> | if A B and C are Num and Show, then functions on ConcreteExpr obviously know that |
2023-10-18 19:43:22 +0200 | <ski> | @where polymorphic-type-inference |
2023-10-18 19:43:22 +0200 | <lambdabot> | "Polymorphic Type Inference" by Michael I. Schwartzbach in 1995-03 at <https://cs.au.dk/~mis/typeinf.p(s|df)>,<http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.1493> |
2023-10-18 19:43:25 +0200 | <ski> | @where on-understanding |
2023-10-18 19:43:25 +0200 | <lambdabot> | "On Understanding Types, Data Abstraction, and Polymorphism" by Luca Cardelli,Peter Wegner in 1985-12 at <http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf> |
2023-10-18 19:43:27 +0200 | <vektor> | EvanR: Why do I have the feeling this sounds nice in a minimally working example, but is horrible once my 20 constructors of Expr get involved? :O |
2023-10-18 19:43:29 +0200 | <ski> | @where on-understanding-revisited |
2023-10-18 19:43:29 +0200 | <lambdabot> | "On Understanding Data Abstraction, Revisited" by William R. Cook in 2009-10 at <http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf> |
2023-10-18 19:44:12 +0200 | <EvanR> | vektor, it's wrapping the large parameterized Expr type, not duplicating. But yes it could get hairy for other reasons. And you really lose out on generic programming that the usual way does by default |
2023-10-18 19:44:18 +0200 | <vektor> | ski, my supervisor's reading 'recommendations' take precedence before yours, FYI. :) |
2023-10-18 19:44:22 +0200 | <ski> | vektor : "the x in Expr x a is for type elaborations" -- yea, that's why i mentioned DecoratingStructures (and IndirectComposite), one and a half hour ago |
2023-10-18 19:44:36 +0200 | <ski> | vektor : fair enough :D |
2023-10-18 19:45:29 +0200 | <ski> | vektor : "Shouldn't it then be possible to simply assert \"Value Char isn't\" in that logic program" -- no, because it's OWA, doesn't deal in negative knowledge. knowledge can only be ("monotonically") added, not subtracted |
2023-10-18 19:45:54 +0200 | <vektor> | Right, right. |
2023-10-18 19:46:00 +0200 | ski | sees EvanR's suggesting real GADTs now |
2023-10-18 19:46:01 +0200 | <vektor> | Did I mention I should know more about logic programming? |
2023-10-18 19:46:14 +0200 | <vektor> | > * ski sees EvanR's suggesting real GADTs now |
2023-10-18 19:46:14 +0200 | <vektor> | Lol |
2023-10-18 19:46:15 +0200 | <lambdabot> | <hint>:1:1: error: parse error on input ‘*’ |
2023-10-18 19:46:41 +0200 | <vektor> | quoting, not prompting, ya tin can. |
2023-10-18 19:46:54 +0200 | <EvanR> | GADT LIFE |
2023-10-18 19:46:59 +0200 | ski | can teen |
2023-10-18 19:47:22 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) |
2023-10-18 19:48:01 +0200 | <ski> | vektor : anyway, i happen to think the first paper above, by Schwartzbach, is a relatively soft intro to the basics of type inference. it for sure helped me a lot when i started learning about all this, years ago, all on my own |
2023-10-18 19:48:05 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 19:48:43 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 19:49:46 +0200 | <vektor> | I've gotten most of Stephen Diehl's WriteYouAHaskell done already one way or another. Well, the parts that are published anyway. Some gaping holes there, and I'm doing some *unusual* things that don't fit neatly into an HM algorithm. |
2023-10-18 19:49:53 +0200 | <vektor> | But I'll be sure to give it a look. |
2023-10-18 19:52:17 +0200 | <[exa]> | vektor: "unusual things" ? |
2023-10-18 19:52:22 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Ping timeout: 252 seconds) |
2023-10-18 19:52:24 +0200 | <[exa]> | (/me curious) |
2023-10-18 19:53:28 +0200 | <vektor> | My IRC chat indicates we DM'd before, so I'm pretty sure your curiosity has been fed to a degree a while back. :D |
2023-10-18 19:53:34 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) (Ping timeout: 272 seconds) |
2023-10-18 19:55:03 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
2023-10-18 19:55:24 +0200 | <vektor> | s/chat/client |
2023-10-18 19:59:27 +0200 | danse-nr3__ | (~francesco@151.57.122.70) (Ping timeout: 240 seconds) |
2023-10-18 19:59:31 +0200 | <ski> | vektor : your `Expr' suggests you may be doing something with stochastic distributions ? |
2023-10-18 19:59:57 +0200 | m1dnight | (~christoph@78-22-4-67.access.telenet.be) (Quit: WeeChat 4.0.5) |
2023-10-18 20:00:15 +0200 | m1dnight | (~christoph@78-22-4-67.access.telenet.be) |
2023-10-18 20:00:33 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) |
2023-10-18 20:00:37 +0200 | <vektor> | That's correct. |
2023-10-18 20:01:36 +0200 | <EvanR> | vektor, if you derive Generic, then several pretty printer libraries will just work. Or you can make your own which uses Generic |
2023-10-18 20:01:45 +0200 | <EvanR> | might be a shortcut |
2023-10-18 20:03:29 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) |
2023-10-18 20:07:47 +0200 | fendor | (~fendor@2a02:8388:1640:be00:aab:1226:f274:5021) (Remote host closed the connection) |
2023-10-18 20:09:54 +0200 | L29Ah | (~L29Ah@wikipedia/L29Ah) () |
2023-10-18 20:10:54 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 245 seconds) |
2023-10-18 20:11:07 +0200 | TimWolla | (~timwolla@2a01:4f8:150:6153:beef::6667) (Ping timeout: 264 seconds) |
2023-10-18 20:16:33 +0200 | __monty_1 | (~toonn@user/toonn) |
2023-10-18 20:16:49 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) (*.net *.split) |
2023-10-18 20:16:49 +0200 | gmg | (~user@user/gehmehgeh) (*.net *.split) |
2023-10-18 20:16:49 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) (*.net *.split) |
2023-10-18 20:16:49 +0200 | chexum | (~quassel@gateway/tor-sasl/chexum) (*.net *.split) |
2023-10-18 20:16:49 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) (*.net *.split) |
2023-10-18 20:16:49 +0200 | adanwan_ | (~adanwan@gateway/tor-sasl/adanwan) (*.net *.split) |
2023-10-18 20:16:49 +0200 | ChaiTRex | (~ChaiTRex@user/chaitrex) (*.net *.split) |
2023-10-18 20:16:49 +0200 | ec | (~ec@gateway/tor-sasl/ec) (*.net *.split) |
2023-10-18 20:16:49 +0200 | califax | (~califax@user/califx) (*.net *.split) |
2023-10-18 20:16:49 +0200 | chiselfuse | (~chiselfus@user/chiselfuse) (*.net *.split) |
2023-10-18 20:16:50 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) (*.net *.split) |
2023-10-18 20:18:13 +0200 | __monty__ | (~toonn@user/toonn) (Ping timeout: 252 seconds) |
2023-10-18 20:18:58 +0200 | Simikando | (~Simikando@adsl-dyn158.91-127-59.t-com.sk) (Quit: Leaving) |
2023-10-18 20:25:38 +0200 | dcoutts | (~duncan@net77-43-75-226.mclink.it) (Ping timeout: 258 seconds) |
2023-10-18 20:28:55 +0200 | phma | (phma@2001:5b0:211b:9d88:b368:1baa:7a2:22b7) (Read error: Connection reset by peer) |
2023-10-18 20:29:56 +0200 | phma | (phma@2001:5b0:210b:f338:ff94:b91f:1e4:46fd) |
2023-10-18 20:33:17 +0200 | Tuplanolla | (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) |
2023-10-18 20:35:28 +0200 | TimWolla | (~timwolla@2a01:4f8:150:6153:beef::6667) |
2023-10-18 20:37:29 +0200 | chele | (~chele@user/chele) (Remote host closed the connection) |
2023-10-18 20:37:59 +0200 | michalz | (~michalz@185.246.207.221) (Ping timeout: 255 seconds) |
2023-10-18 20:40:15 +0200 | michalz | (~michalz@185.246.207.217) |
2023-10-18 20:46:47 +0200 | L29Ah | (~L29Ah@wikipedia/L29Ah) |
2023-10-18 20:50:29 +0200 | Pickchea | (~private@user/pickchea) |
2023-10-18 20:53:31 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 20:53:53 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
2023-10-18 20:55:30 +0200 | moni_ | (~moni@cpe-174-106-185-141.ec.res.rr.com) (Remote host closed the connection) |
2023-10-18 20:58:49 +0200 | nate2 | (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds) |
2023-10-18 21:02:05 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) |
2023-10-18 21:02:05 +0200 | nickiminjaj | (~nickiminj@83.5.236.254.ipv4.supernova.orange.pl) (Changing host) |
2023-10-18 21:02:05 +0200 | nickiminjaj | (~nickiminj@user/laxhh) |
2023-10-18 21:07:10 +0200 | ft | (~ft@p3e9bc680.dip0.t-ipconnect.de) |
2023-10-18 21:08:27 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
2023-10-18 21:08:44 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 21:12:28 +0200 | nickiminjaj | (~nickiminj@user/laxhh) (Quit: Textual IRC Client: www.textualapp.com) |
2023-10-18 21:14:57 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) |
2023-10-18 21:15:59 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 21:16:54 +0200 | vektor | (~vektor@IP-045131036068.dynamic.medianet-world.de) (Client Quit) |
2023-10-18 21:26:04 +0200 | azimut | (~azimut@gateway/tor-sasl/azimut) |
2023-10-18 21:29:08 +0200 | harveypwca | (~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db) |
2023-10-18 21:34:07 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Remote host closed the connection) |
2023-10-18 21:36:21 +0200 | machinedgod | (~machinedg@d198-53-218-113.abhsia.telus.net) |
2023-10-18 21:49:03 +0200 | califax | (~califax@user/califx) |
2023-10-18 21:52:27 +0200 | bjobjo | (~bjobjo@user/bjobjo) (Quit: leaving) |
2023-10-18 21:54:59 +0200 | CiaoSen | (~Jura@2a05:5800:2b2:8d00:664b:f0ff:fe37:9ef) |
2023-10-18 21:56:36 +0200 | ChaiTRex | (~ChaiTRex@user/chaitrex) |
2023-10-18 21:58:34 +0200 | chiselfuse | (~chiselfus@user/chiselfuse) |
2023-10-18 21:59:13 +0200 | ec | (~ec@gateway/tor-sasl/ec) |
2023-10-18 21:59:21 +0200 | stiell_ | (~stiell@gateway/tor-sasl/stiell) |
2023-10-18 21:59:27 +0200 | FinnElija | (~finn_elij@user/finn-elija/x-0085643) |
2023-10-18 22:00:11 +0200 | bitdex | (~bitdex@gateway/tor-sasl/bitdex) |
2023-10-18 22:04:10 +0200 | gmg | (~user@user/gehmehgeh) |
2023-10-18 22:05:04 +0200 | Inst | (~Inst@120.244.192.250) (Ping timeout: 245 seconds) |
2023-10-18 22:07:59 +0200 | ski | (~ski@88.131.7.247) (Ping timeout: 258 seconds) |
2023-10-18 22:09:12 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 22:13:32 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) (Ping timeout: 248 seconds) |
2023-10-18 22:16:34 +0200 | vglfr | (~vglfr@88.155.159.184) (Read error: Connection reset by peer) |
2023-10-18 22:16:54 +0200 | vglfr | (vglfr@gateway/vpn/protonvpn/vglfr) |
2023-10-18 22:20:50 +0200 | Unicorn_Princess | (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
2023-10-18 22:22:21 +0200 | idgaen | (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.5) |
2023-10-18 22:26:53 +0200 | zenstoic | (uid461840@id-461840.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 22:28:50 +0200 | asivitz | (uid178348@id-178348.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
2023-10-18 22:28:55 +0200 | Inst | (~Inst@120.244.192.250) |
2023-10-18 22:32:44 +0200 | vglfr | (vglfr@gateway/vpn/protonvpn/vglfr) (Ping timeout: 255 seconds) |
2023-10-18 22:37:07 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
2023-10-18 22:37:28 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
2023-10-18 22:44:32 +0200 | takuan | (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
2023-10-18 22:47:09 +0200 | __monty_1 | __monty__ |
2023-10-18 22:47:25 +0200 | __monty__ | (~toonn@user/toonn) (Quit: leaving) |
2023-10-18 22:48:03 +0200 | vglfr | (~vglfr@88.155.159.184) |
2023-10-18 22:50:38 +0200 | oo_miguel | (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Ping timeout: 255 seconds) |
2023-10-18 22:57:10 +0200 | Jackneill | (~Jackneill@20014C4E1E0E6F00DA1379EF70CDB149.dsl.pool.telekom.hu) (Ping timeout: 252 seconds) |
2023-10-18 23:02:30 +0200 | michalz | (~michalz@185.246.207.217) (Remote host closed the connection) |
2023-10-18 23:04:40 +0200 | shapr | (~user@2600:1700:c640:3100:70ed:821a:ab80:9f0d) |
2023-10-18 23:09:02 +0200 | _ht | (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht) |
2023-10-18 23:09:05 +0200 | eggplantade | (~Eggplanta@2600:1700:38c5:d800:b915:f992:5adb:85e) |
2023-10-18 23:10:12 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 23:10:27 +0200 | tromp | (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer) |
2023-10-18 23:10:49 +0200 | jmdaemon | (~jmdaemon@user/jmdaemon) |
2023-10-18 23:11:02 +0200 | Vajb | (~Vajb@207.61.167.122) (Read error: Connection reset by peer) |
2023-10-18 23:11:11 +0200 | Vajb | (~Vajb@207.61.167.122) |
2023-10-18 23:15:27 +0200 | logothesia | (~logothesi@user/logothesia) |
2023-10-18 23:15:39 +0200 | logothesia | (~logothesi@user/logothesia) () |
2023-10-18 23:19:25 +0200 | mvk | (~mvk@2607:fea8:5c9a:a600::900d) |
2023-10-18 23:19:28 +0200 | mvk | (~mvk@2607:fea8:5c9a:a600::900d) (Client Quit) |
2023-10-18 23:21:05 +0200 | acidjnk_new | (~acidjnk@p200300d6e72b937894bacaba5afcc7b7.dip0.t-ipconnect.de) (Ping timeout: 240 seconds) |
2023-10-18 23:26:25 +0200 | jmdaemon | (~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds) |
2023-10-18 23:32:34 +0200 | harveypwca | (~harveypwc@2601:246:c280:6a90:837d:db39:3eea:f7db) (Quit: Leaving) |
2023-10-18 23:38:44 +0200 | falafel | (~falafel@62.175.113.194.dyn.user.ono.com) |
2023-10-18 23:39:01 +0200 | euleritian | (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds) |
2023-10-18 23:39:47 +0200 | euleritian | (~euleritia@dynamic-046-114-202-144.46.114.pool.telefonica.de) |
2023-10-18 23:46:41 +0200 | Pickchea | (~private@user/pickchea) (Quit: Leaving) |
2023-10-18 23:51:33 +0200 | sm | (~sm@plaintextaccounting/sm) |
2023-10-18 23:52:10 +0200 | jmdaemon | (~jmdaemon@user/jmdaemon) |
2023-10-18 23:57:07 +0200 | gmg | (~user@user/gehmehgeh) (Quit: Leaving) |
2023-10-18 23:59:32 +0200 | pavonia | (~user@user/siracusa) |
2023-10-18 23:59:49 +0200 | Guest|69 | (~Guest|69@rn-nat-129-97-131-0.dynamic.uwaterloo.ca) |
2023-10-18 23:59:57 +0200 | Guest|69 | (~Guest|69@rn-nat-129-97-131-0.dynamic.uwaterloo.ca) (Client Quit) |