Logs on 2022-05-05 (liberachat/#haskell)
| 00:01:20 | × | werneta quits (~werneta@137.79.199.110) (Ping timeout: 260 seconds) |
| 00:02:47 | → | alp_ joins (~alp@user/alp) |
| 00:04:24 | → | frost joins (~frost@user/frost) |
| 00:04:35 | × | Katarushisu quits (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) (Quit: Ping timeout (120 seconds)) |
| 00:04:54 | → | Katarushisu joins (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) |
| 00:08:36 | × | jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds) |
| 00:12:00 | × | frost quits (~frost@user/frost) (Quit: Client closed) |
| 00:12:35 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 00:12:35 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 00:12:35 | → | wroathe joins (~wroathe@user/wroathe) |
| 00:14:34 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5) |
| 00:14:46 | <EvanR> | in satisfactory there's an intermediate item called "AI limiter". Maybe we need "Turing completeness limiter" |
| 00:15:22 | <monochrom> | We have timeouts. Is that good enough? :) |
| 00:15:25 | <dminuoso> | Is that like a circuit board component I can solder on, EvanR? |
| 00:15:39 | <EvanR> | yes |
| 00:15:52 | <monochrom> | Right? If my computer is unresponsive for a minute, I unplug it. My limiter. |
| 00:16:10 | → | xff0x joins (~xff0x@om126167102105.29.openmobile.ne.jp) |
| 00:16:11 | <monochrom> | Except for laptops. That's harder. |
| 00:16:28 | <EvanR> | the level of automation there is also like satisfactory (low) |
| 00:16:35 | <dminuoso> | We actually did have turbo button many eons ago. |
| 00:16:47 | × | zyklotomic quits (~ethan@res380d-128-61-86-82.res.gatech.edu) (Ping timeout: 256 seconds) |
| 00:16:49 | <dminuoso> | A precursor to turing limiters. |
| 00:16:53 | <monochrom> | Oh w00t turbo button. Yeah I had one. |
| 00:17:06 | <EvanR> | people used it like a limiter |
| 00:17:10 | <monochrom> | Err wait how is that limiting haha |
| 00:17:19 | <EvanR> | by default you leave turbo on |
| 00:17:33 | <dminuoso> | Yes, the turbo button was just a limiter with an inverted name. |
| 00:17:33 | → | zyklotomic joins (~ethan@res380d-128-61-84-187.res.gatech.edu) |
| 00:17:36 | <EvanR> | then when necessary go "subturbo" |
| 00:17:39 | <monochrom> | OK that's throttling if you turn it off. But it doesn't stop. |
| 00:17:42 | <dminuoso> | Turbo sounds more positive than throttle. |
| 00:18:05 | <monochrom> | The reset button is closer to a limiter. |
| 00:18:12 | <EvanR> | they should bring back that marketing |
| 00:18:16 | <dminuoso> | The power button is a turing limiter. |
| 00:18:21 | <monochrom> | Yeah. |
| 00:18:24 | <dminuoso> | Press it, and turing completeness is limited to 0. |
| 00:18:33 | <EvanR> | your ISP will no longer throttle you, rather, they will take away your turbo |
| 00:20:04 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 00:20:18 | <EvanR> | you guys are joking about limiting turing completeness by turning it off, unplugging it, or activate the self destruct ordinance. And a great idea goes out the window xD |
| 00:21:52 | <dminuoso> | That was not a joke. |
| 00:22:07 | <dminuoso> | But an odinance turing limiter sounds exciting. Tell me more. |
| 00:22:09 | <dminuoso> | Do you have a video? |
| 00:23:45 | <hpc> | ah yes, the principle of explosion |
| 00:24:29 | <monochrom> | EvanR: What is the great idea? |
| 00:24:55 | <monochrom> | Ordinance has detonational semantics >:) |
| 00:25:35 | <monochrom> | https://mail.haskell.org/pipermail/haskell-cafe/2011-January/088315.html |
| 00:27:48 | × | tommd quits (~tommd@97-120-41-123.ptld.qwest.net) (Ping timeout: 248 seconds) |
| 00:27:49 | <hpc> | musical semantics is genius |
| 00:28:04 | <dminuoso> | @remember monochrom Ordinance has detonational semantics >:) |
| 00:28:04 | <lambdabot> | I will remember. |
| 00:29:46 | <seydar> | another day, another attempt to implement blurhash |
| 00:33:06 | <seydar> | Axman6 described it as "super compressed JPG", so now i'm trying to understand the JuicyPixels implementation of JPG encoding |
| 00:36:17 | → | shapr joins (~user@184.81.59.2) |
| 00:45:37 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 00:53:38 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 00:58:51 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 00:59:05 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds) |
| 01:01:14 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 01:02:07 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 01:02:28 | × | CAT_S quits (apic@brezn3.muc.ccc.de) (Ping timeout: 248 seconds) |
| 01:06:11 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 01:06:24 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 252 seconds) |
| 01:06:27 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 276 seconds) |
| 01:09:54 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 01:12:23 | × | Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep) |
| 01:12:35 | × | geekosaur quits (~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b))) |
| 01:12:35 | → | allbery_b joins (~geekosaur@xmonad/geekosaur) |
| 01:12:38 | allbery_b | is now known as geekosaur |
| 01:15:29 | → | CAT_S joins (apic@brezn3.muc.ccc.de) |
| 01:20:36 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 248 seconds) |
| 01:25:20 | × | gurkenglas quits (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 260 seconds) |
| 01:29:11 | × | stackdroid18 quits (14094@user/stackdroid) (Quit: hasta la vista... tchau!) |
| 01:29:17 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 01:35:27 | <sm[i]> | > <monochrom> And BTW to answer those who said I was too trigger-happy last time: I saw good regulars leaving this channel precisely because we fed the trolls instead of banning. |
| 01:35:28 | <lambdabot> | <hint>:1:1: error: parse error on input ‘<’ |
| 01:36:02 | <sm[i]> | I am usually one of those. I get that it's a fine line and difficult to judge sometimes. |
| 01:36:33 | <sm[i]> | for me, when a channel becomes too intolerant and cliquish, it's the sign of an calcifying community and time to move on |
| 01:36:59 | <sm[i]> | avoid either extreme, and cool the temperature, is the goal for a channel op I think |
| 01:37:39 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 276 seconds) |
| 01:37:45 | × | shapr quits (~user@184.81.59.2) (Remote host closed the connection) |
| 01:38:03 | → | shapr joins (~user@184.81.59.2) |
| 01:38:24 | → | andrey_ joins (~andrey@p200300dbcf1053000b1abd83a6152638.dip0.t-ipconnect.de) |
| 01:38:50 | <sm[i]> | monochrom, sometimes I get the feeling you enjoy the ban hammer a little more than a good op should. Just my humble and respectful 2c |
| 01:38:55 | <EvanR> | seydar, that was me, too at least |
| 01:40:51 | × | andrey__ quits (~andrey@p508d5cc9.dip0.t-ipconnect.de) (Ping timeout: 246 seconds) |
| 01:41:58 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 01:42:27 | × | shapr quits (~user@184.81.59.2) (Ping timeout: 256 seconds) |
| 01:42:56 | → | shapr joins (~user@184.81.59.2) |
| 01:43:00 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 248 seconds) |
| 01:45:04 | → | werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
| 01:47:54 | <EvanR> | /mode +b nutter This hurts the community more than it hurts you |
| 01:47:58 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 01:48:35 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Ping timeout: 256 seconds) |
| 01:52:36 | × | alp_ quits (~alp@user/alp) (Ping timeout: 252 seconds) |
| 01:52:48 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds) |
| 01:53:15 | → | tommd joins (~tommd@97-120-41-123.ptld.qwest.net) |
| 01:57:45 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 248 seconds) |
| 02:00:49 | × | Unicorn_Princess quits (~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Quit: Leaving) |
| 02:09:43 | × | shapr quits (~user@184.81.59.2) (Ping timeout: 260 seconds) |
| 02:15:14 | → | finn_elija joins (~finn_elij@user/finn-elija/x-0085643) |
| 02:15:14 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
| 02:15:14 | finn_elija | is now known as FinnElija |
| 02:19:42 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 02:19:50 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 02:19:54 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 02:19:54 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 02:19:54 | → | wroathe joins (~wroathe@user/wroathe) |
| 02:26:52 | → | AlexNoo_ joins (~AlexNoo@178.34.163.12) |
| 02:27:43 | × | euandreh quits (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) (Quit: WeeChat 3.5) |
| 02:28:04 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
| 02:28:58 | × | AlexZenon quits (~alzenon@178.34.162.108) (Ping timeout: 272 seconds) |
| 02:29:12 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 02:30:12 | × | AlexNoo quits (~AlexNoo@178.34.162.108) (Ping timeout: 246 seconds) |
| 02:30:52 | × | Alex_test quits (~al_test@178.34.162.108) (Ping timeout: 272 seconds) |
| 02:32:09 | → | AlexZenon joins (~alzenon@178.34.163.12) |
| 02:34:23 | → | Alex_test joins (~al_test@178.34.163.12) |
| 02:36:48 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds) |
| 02:41:39 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 02:45:21 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 02:52:35 | × | xff0x quits (~xff0x@om126167102105.29.openmobile.ne.jp) (Read error: Connection reset by peer) |
| 02:56:04 | × | td_ quits (~td@muedsl-82-207-238-011.citykom.de) (Ping timeout: 248 seconds) |
| 02:57:55 | → | td_ joins (~td@muedsl-82-207-238-115.citykom.de) |
| 02:58:40 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 260 seconds) |
| 03:00:00 | → | mvk joins (~mvk@2607:fea8:5ce3:8500::aa1d) |
| 03:00:05 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 03:00:15 | × | tommd quits (~tommd@97-120-41-123.ptld.qwest.net) (Ping timeout: 252 seconds) |
| 03:02:34 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
| 03:07:23 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 03:09:02 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 03:13:41 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds) |
| 03:18:15 | → | euandreh joins (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) |
| 03:19:12 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 03:19:45 | × | zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!) |
| 03:24:52 | × | waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 248 seconds) |
| 03:29:25 | → | pavonia joins (~user@user/siracusa) |
| 03:29:33 | × | jao quits (~jao@211.68.17.95.dynamic.jazztel.es) (Ping timeout: 256 seconds) |
| 03:34:39 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds) |
| 03:35:04 | × | littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
| 03:39:01 | × | img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in) |
| 03:40:39 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 03:41:19 | → | img joins (~img@user/img) |
| 03:45:19 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 256 seconds) |
| 03:48:09 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 03:51:13 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 03:53:15 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 03:54:53 | → | littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo) |
| 03:55:00 | × | lechner quits (lechner@debian/lechner) (Quit: WeeChat 3.5) |
| 03:55:15 | → | lechner joins (lechner@debian/lechner) |
| 03:56:06 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds) |
| 03:58:00 | × | lechner quits (lechner@debian/lechner) (Client Quit) |
| 03:58:14 | → | lechner joins (lechner@debian/lechner) |
| 03:59:07 | × | EvanR quits (~EvanR@user/evanr) (Remote host closed the connection) |
| 03:59:27 | → | EvanR joins (~EvanR@user/evanr) |
| 04:00:39 | → | benin joins (~benin@183.82.29.230) |
| 04:01:18 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 04:06:30 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 276 seconds) |
| 04:08:24 | → | notzmv joins (~zmv@user/notzmv) |
| 04:13:54 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 04:14:40 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 04:15:37 | → | coot joins (~coot@213.134.190.95) |
| 04:25:04 | → | bahamas joins (~lucian@84.232.141.55) |
| 04:32:43 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 04:35:08 | × | seydar quits (~seydar@154-27-113-252.starry-inc.net) (Client Quit) |
| 04:40:26 | × | zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection) |
| 04:43:48 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds) |
| 04:46:42 | → | zaquest joins (~notzaques@5.130.79.72) |
| 04:47:46 | → | mbuf joins (~Shakthi@27.58.129.52) |
| 04:50:54 | × | dunj3 quits (~dunj3@kingdread.de) (Quit: ZNC 1.7.2+deb3 - https://znc.in) |
| 05:01:09 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 05:03:09 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 05:04:32 | → | Vajb joins (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56) |
| 05:07:19 | × | jargon quits (~jargon@174-22-206-112.phnx.qwest.net) (Quit: Nini. ZZzz...) |
| 05:09:08 | × | Me-me quits (~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net) (Changing host) |
| 05:09:08 | → | Me-me joins (~me-me@user/me-me) |
| 05:11:39 | → | cdman joins (~dcm@user/dmc/x-4369397) |
| 05:35:55 | × | forell quits (~forell@user/forell) (Ping timeout: 256 seconds) |
| 05:41:55 | × | bliminse quits (~bliminse@host86-164-128-238.range86-164.btcentralplus.com) (Quit: leaving) |
| 05:46:44 | × | x_kuru quits (~xkuru@user/xkuru) (Read error: Connection reset by peer) |
| 05:52:26 | → | gpncarl joins (~gpncarl@120.244.220.74) |
| 05:56:16 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 05:56:50 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 05:58:52 | × | [Leary] quits (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) (Remote host closed the connection) |
| 05:59:16 | → | [Leary] joins (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) |
| 06:00:48 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 250 seconds) |
| 06:02:56 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection) |
| 06:03:15 | → | michalz joins (~michalz@185.246.204.105) |
| 06:04:09 | × | gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 276 seconds) |
| 06:06:05 | → | acidjnk joins (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) |
| 06:08:30 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 06:12:46 | → | forell joins (~forell@user/forell) |
| 06:19:57 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection) |
| 06:20:21 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 06:40:59 | → | Wstfgl0 joins (~me-me@v.working.name) |
| 06:43:06 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:e8a7:5207:d6e5:3f9a) |
| 06:43:27 | × | Me-me quits (~me-me@user/me-me) (Killed (NickServ (GHOST command used by Wstfgl0!~me-me@v.working.name))) |
| 06:43:30 | Wstfgl0 | is now known as Me-me |
| 06:43:37 | × | Me-me quits (~me-me@v.working.name) (Changing host) |
| 06:43:37 | → | Me-me joins (~me-me@user/me-me) |
| 06:46:27 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 06:47:37 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 06:49:41 | → | kenran joins (~kenran@ip-037-024-119-190.um08.pools.vodafone-ip.de) |
| 06:56:55 | × | bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 07:02:34 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 07:05:03 | → | alp_ joins (~alp@user/alp) |
| 07:05:41 | → | odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 07:07:24 | × | jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 246 seconds) |
| 07:08:06 | → | bahamas joins (~lucian@84.232.141.55) |
| 07:16:44 | → | Gilbert189 joins (~Gilbert18@user/Gilbert189) |
| 07:22:24 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 07:22:57 | × | shriekingnoise quits (~shrieking@201.231.16.156) (Quit: Quit) |
| 07:25:42 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 07:32:32 | → | jonathanx joins (~jonathan@dyn-5-sc.cdg.chalmers.se) |
| 07:33:12 | → | kaph joins (~kaph@net-2-42-128-205.cust.vodafonedsl.it) |
| 07:34:23 | → | chele joins (~chele@user/chele) |
| 07:35:45 | → | fendor joins (~fendor@91.141.58.225.wireless.dyn.drei.com) |
| 07:39:34 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
| 07:39:55 | × | nek0 quits (~nek0@nek0.eu) (Quit: Ping timeout (120 seconds)) |
| 07:40:13 | → | nek0 joins (~nek0@nek0.eu) |
| 07:47:09 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 07:47:19 | → | mmhat joins (~mmh@2001:4090:a242:802a:ee08:6bff:fe09:5315) |
| 07:47:41 | × | sus quits (zero@user/zeromomentum) (Quit: the lounge - https://webirc.envs.net) |
| 07:47:43 | → | machinedgod joins (~machinedg@24.105.81.50) |
| 07:48:17 | → | sus joins (zero@user/zeromomentum) |
| 07:50:34 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 07:51:52 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 07:52:03 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 276 seconds) |
| 07:53:07 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 07:53:12 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 07:53:16 | × | Gilbert189 quits (~Gilbert18@user/Gilbert189) (Quit: Leaving) |
| 07:53:26 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 07:54:25 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
| 07:57:45 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 07:58:32 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 08:02:12 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 248 seconds) |
| 08:03:17 | × | tzh_ quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz) |
| 08:03:33 | <absence> | is it possible to enable GHC.Stats with a function call, or is passing the rts option -T the only way? |
| 08:03:49 | × | bgs quits (~bgs@cpe-212-85-160-171.cable.telemach.net) (Ping timeout: 256 seconds) |
| 08:03:51 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 252 seconds) |
| 08:04:04 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 08:05:49 | → | bgs joins (~bgs@cpe-212-85-160-171.cable.telemach.net) |
| 08:06:43 | → | gpncarl joins (~gpncarl@120.244.220.74) |
| 08:07:55 | × | raym quits (~raym@user/raym) (Ping timeout: 260 seconds) |
| 08:09:35 | → | raym joins (~raym@user/raym) |
| 08:11:05 | × | gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 248 seconds) |
| 08:12:51 | → | Midjak joins (~Midjak@82.66.147.146) |
| 08:12:52 | × | mvk quits (~mvk@2607:fea8:5ce3:8500::aa1d) (Ping timeout: 248 seconds) |
| 08:14:55 | → | __monty__ joins (~toonn@user/toonn) |
| 08:16:19 | → | ubert joins (~Thunderbi@p200300ecdf1588a56901cfb4252abec6.dip0.t-ipconnect.de) |
| 08:16:47 | × | acidjnk quits (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 08:16:53 | → | ccntrq joins (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb) |
| 08:17:52 | → | dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net) |
| 08:19:11 | × | jpds quits (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection) |
| 08:19:34 | → | jpds joins (~jpds@gateway/tor-sasl/jpds) |
| 08:19:36 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Read error: Connection reset by peer) |
| 08:22:42 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 08:22:47 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 08:24:11 | × | ubert quits (~Thunderbi@p200300ecdf1588a56901cfb4252abec6.dip0.t-ipconnect.de) (Quit: ubert) |
| 08:26:26 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Client Quit) |
| 08:26:48 | → | bahamas joins (~lucian@92.85.13.88) |
| 08:28:24 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 08:28:36 | × | kenran quits (~kenran@ip-037-024-119-190.um08.pools.vodafone-ip.de) (Quit: WeeChat info:version) |
| 08:29:56 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 08:33:32 | → | jgeerds joins (~jgeerds@d53604b0.access.ecotel.net) |
| 08:34:25 | × | [Leary] quits (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) (Remote host closed the connection) |
| 08:34:25 | → | _ht joins (~quassel@231-169-21-31.ftth.glasoperator.nl) |
| 08:36:48 | <apache2> | speaking of intel instructions |
| 08:37:40 | <apache2> | in the manuals for x86, x86_64, etc they have a description of what each assembly mnemonic does in a sort of pseudo-code language |
| 08:37:47 | <apache2> | does that have a name, and has anybody implemented it? |
| 08:40:07 | <apache2> | aand to get back on track: I managed to introduce some kind of bug in my code which resulted in an endless loop over an recursive list when trying to add a character to a Text string, the let binding stuff is pretty magical |
| 08:40:35 | <apache2> | I found it by bisection, commenting out parts until something worked again |
| 08:40:46 | → | [Leary] joins (~Leary]@122-58-228-205-vdsl.sparkbb.co.nz) |
| 08:40:52 | <apache2> | is there some sort of profiler / debugger / something to help diagnose problems like that? |
| 08:49:09 | × | mjacob quits (~mjacob@adrastea.uberspace.de) (Ping timeout: 256 seconds) |
| 08:49:43 | × | tomku|two quits (~tomku@user/tomku) (Ping timeout: 256 seconds) |
| 08:49:51 | → | tomku joins (~tomku@user/tomku) |
| 08:49:56 | → | mjacob joins (~mjacob@adrastea.uberspace.de) |
| 08:52:11 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 08:52:32 | <merijn> | apache2: Depends how the endless loop happens :p |
| 08:53:02 | <merijn> | apache2: ghci has a built in debugger, but it's not used super much |
| 08:53:29 | <merijn> | Because |
| 08:53:34 | <merijn> | @quote cmccann stream.of.con |
| 08:53:35 | <lambdabot> | cmccann says: you want a debugger? GHC has one. Except that stepping through lazy evaluation is like listening to a stream of consciousness narrative told by a 5-year-old with ADHD. |
| 08:54:00 | <merijn> | There's also profiling support, but I dunno how well that works to catch infinite loops |
| 08:56:08 | → | teo joins (~teo@user/teo) |
| 08:57:27 | × | teo quits (~teo@user/teo) (Client Quit) |
| 08:58:18 | → | teo joins (~teo@user/teo) |
| 09:00:02 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection) |
| 09:00:06 | × | corisco[m] quits (~coriscokd@2001:470:69fc:105::1:dea6) (Quit: You have been kicked for being idle) |
| 09:00:23 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 09:02:04 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 240 seconds) |
| 09:02:32 | <kuribas> | the ghc debugger is also not how I want to debug. |
| 09:02:37 | × | ccntrq quits (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb) (Remote host closed the connection) |
| 09:02:40 | <kuribas> | I don't care about the order ghc uses to evaluate things. |
| 09:03:01 | <kuribas> | So I would want to be able to specify what part of the eval tree to evaluate next. |
| 09:03:10 | <kuribas> | "stepping" feels to imperative. |
| 09:03:24 | → | ccntrq joins (~Thunderbi@2a01:e34:eccb:b060:8a52:6111:fb65:b9eb) |
| 09:04:27 | <kuribas> | As long as the debugger keeps the right semantics, so a bottom will not quit the whole evaluation. |
| 09:04:27 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 09:04:33 | → | gpncarl joins (~gpncarl@120.244.220.74) |
| 09:05:12 | <kuribas> | for example snd (undefined, 4), I should be able to evaluate the first argument, without it stopping evaluating the whole thing. |
| 09:05:17 | → | ubert joins (~Thunderbi@2a02:8109:9880:303c:ad62:b99:9259:5795) |
| 09:05:44 | <sm> | apache2: another way is to sprinkle the likely code with trace statements, inspecting output and code can get you pretty far |
| 09:06:20 | <kuribas> | yeah, Debug.Trace is the best |
| 09:06:52 | <kuribas> | when messing around on the repl didn't produce anything interesting. |
| 09:07:52 | <sm> | then there's setting stack/heap size artificially low to force termination, would that help here ? |
| 09:08:11 | <merijn> | Depends if it's actually leaking memory |
| 09:08:24 | → | frost joins (~frost@user/frost) |
| 09:09:03 | <kuribas> | ah an endless loop, those are the worst to debug. |
| 09:09:15 | <merijn> | hey! |
| 09:09:20 | <merijn> | you don't know it's endless! :D |
| 09:09:44 | <sm> | and is there a way to send it a signal/exception to force termination, with a traceback ? |
| 09:10:11 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection) |
| 09:10:25 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 09:10:27 | <merijn> | Depends how picky you are about the definition of each of the words in that sentence :p |
| 09:10:35 | <sm> | heh |
| 09:10:51 | <merijn> | sm: async exception are only detected during allocation/GC |
| 09:10:53 | <sm> | figures it wouldn't be simple |
| 09:11:07 | <merijn> | It's possible to get code stuck in an allocationless loop that will thus never detect async exceptions |
| 09:11:23 | <sm> | good to know |
| 09:11:44 | <merijn> | sm: It should be possible to implement support for stacktraces of an active thread, but that'll be some engineering work |
| 09:11:50 | <sm> | ctrl c would probably work though ? |
| 09:11:53 | <merijn> | sm: hah |
| 09:11:57 | <merijn> | Absolutely not |
| 09:12:12 | <merijn> | Arguably ctrl-c doesn't work at all in the current state of things :p |
| 09:12:38 | <sm> | uh.. ctl z ? sometimes only that that works |
| 09:12:40 | <merijn> | There's something that approximately resembless "working" that has essentially no sensible semantics |
| 09:13:04 | <merijn> | sm: So ctrl-z from terminal does work, because that's handled in the kernel |
| 09:13:16 | <merijn> | And has actual sensible semantics |
| 09:14:02 | <merijn> | sm: The problem is that ctrl-c sends SIGINT and signals are delivered (non-deterministically!) to "a" thread in the process. So you have no clue which runtime thread gets the signal |
| 09:15:04 | <sm> | could you instrument haskell code with a handler for ctrl z ? |
| 09:15:40 | <merijn> | sm: No, because ctrl-z causes the kernel scheduler to stop scheduling your process, so there's no handler to run |
| 09:15:50 | <merijn> | Because the process itself gets suspended and doesn't execute anything |
| 09:16:20 | <sm> | thanks, makes sense |
| 09:16:29 | sm | grasps at straws.. could you enable some RTS logging/real-time profiling to show some of the functions executing ? |
| 09:16:35 | <merijn> | sm: There's a bunch of issues on the GHC tracker on fixing the signal handling to be, you know, sensible and predictable. But since, as of yet, no one is paying me to hack on GHC it's "on my to do list" |
| 09:16:54 | <merijn> | Which is code for saying "I will never do it, because I don't have the energy/attention span for that" :p |
| 09:16:59 | → | dut joins (~dut@user/dut) |
| 09:17:08 | <sm> | 👍🏻 |
| 09:18:23 | → | acidjnk joins (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) |
| 09:18:45 | <merijn> | I outlined (I think I did, anyway?) what a "proper" approach would look like |
| 09:20:13 | <sm> | merijn: I'm not seeing that, just mention of the debugger and profiling ? |
| 09:20:28 | <merijn> | Man, gitlab doesn't have a way to list all issues I commented on? |
| 09:21:09 | <sm> | oh I assumed you were talking about this infinite loop debugging puzzle |
| 09:21:28 | <merijn> | sm: Well, I was more referring to "proper" signal handling. But that would also open the way for more complex operations like "getting stack trace dumped out from all threads" |
| 09:21:48 | <merijn> | Which sounds doable enough *iff* you have a sensible async infrastructure |
| 09:22:01 | → | pretty_d1 joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 09:22:02 | <sm> | that sure sounds useful and good for "haskell in production" |
| 09:22:07 | × | pretty_d1 quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit) |
| 09:22:35 | <merijn> | argh |
| 09:22:41 | <merijn> | I hate gitlab |
| 09:22:55 | <sm> | hope younger sponsored businesses HF or one of the big haskell using corps |
| 09:23:12 | <sm> | I hope you get ... |
| 09:23:30 | <sm> | dang it iphone |
| 09:23:34 | × | littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
| 09:23:35 | <merijn> | How can you not allow me to search for issues I commented on...I have no idea what this issue was named, just that I wrote some stuff |
| 09:23:38 | merijn | sighs |
| 09:23:42 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 276 seconds) |
| 09:23:58 | sm | throws his hands up at technology |
| 09:24:33 | <merijn> | Right, so a write-up exists somewhere, just don't ask me where... >.> |
| 09:27:13 | × | econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity) |
| 09:29:21 | <sm> | haskell should have a periodic vote & funding round for projects, like cardano's project catalyst |
| 09:29:55 | → | jollygood joins (www-data@2607:5300:60:8be::1) |
| 09:31:55 | <jollygood> | hi.I tried 9.2.2 on stack on windows, and I am getting weird error: |
| 09:31:59 | <jollygood> | Stack has not been tested with GHC versions above 9.0, and using 9.2.2, this may fail. Found an invalid compiler at "ghc-9.2.2.exe": Received ExitFailure (-1073741515) when running Raw command: "ghc-9.2.2.exe" --info |
| 09:32:20 | <jollygood> | I am using nightly-2022-05-05 resolver |
| 09:33:23 | <sm> | the first sentence can usually be ignored. Try to run that exe yourself with that flag, does it work ? |
| 09:34:15 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 09:34:57 | <jollygood> | it doesn't give me any errors, or any output |
| 09:35:33 | → | gurkenglas joins (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) |
| 09:36:33 | <sm> | what about --version, or --help ? does the exe file look ok ? is the date what you expect ? was it installed by stack ? |
| 09:37:15 | <jollygood> | no output no matter what arguments I pass to it |
| 09:37:41 | <jollygood> | yes it was installed by stack |
| 09:38:34 | <sm> | sounds invalid alright. I'd check stack and ghc issue trackers and maybe ask #ghc |
| 09:39:47 | <sm> | and maybe try installing it with ghcup and configuring stack to use that |
| 09:40:12 | <jollygood> | ghci doesn't work either, it just returns. |
| 09:40:56 | → | xaotuk joins (~sasha@2a06:5b00:15fe:9b00::2) |
| 09:41:36 | × | jonathanx quits (~jonathan@dyn-5-sc.cdg.chalmers.se) (Remote host closed the connection) |
| 09:42:18 | <maerwald> | what's the best book on haskell concurrency and performance? |
| 09:42:43 | <sm> | simon marlow's of course |
| 09:42:43 | <merijn> | The best book on concurrency is Simon Marlow's paralle and concurrent Haskell |
| 09:42:59 | <kuribas> | +1 |
| 09:43:03 | <Hecate> | yeah that's the best you've got at the moment |
| 09:43:05 | <merijn> | it talks about *efficiency* for the things covered, but that's not the same as performance |
| 09:43:12 | <sm> | ack |
| 09:43:15 | <merijn> | I don't think there's really any book on Haskell performance |
| 09:43:38 | <kuribas> | first learn performance in a general sense. |
| 09:43:41 | <merijn> | That said, I don't think there's any decent book on performance in other languages either :p |
| 09:44:12 | <merijn> | Which is kinda a problem, I learned through osmosis, but then sometimes people ask me "where/how did you learn this stuff and how can I learn?" and then I don't have an answer |
| 09:44:17 | <kuribas> | optimize queries, use the right algorithms, then do linear optimizations (cache locality etc). |
| 09:44:35 | <merijn> | See, I actually think that's wrong :p |
| 09:44:44 | × | mbuf quits (~Shakthi@27.58.129.52) (Quit: Leaving) |
| 09:45:05 | <kuribas> | merijn: are you going to say, profile first? :-) |
| 09:45:05 | <merijn> | If you *truly* care about performance you can't write your code first and then optimise after. You gotta design your code "from the inner loop outwards" |
| 09:45:10 | <sm> | "hire me as coach for one meelleon dollars" |
| 09:45:32 | <kuribas> | merijn: also first, do you need to care about performance? |
| 09:45:33 | <merijn> | kuribas: Profiling is important, but you can't profile and optimise your way out of every performance problem |
| 09:45:36 | → | gensyst joins (gensyst@user/gensyst) |
| 09:45:59 | <merijn> | So, actually one of the most interesting and enlightening things I learned from Google was during my interview there |
| 09:46:04 | <kuribas> | you need a good architecture first. |
| 09:46:13 | <merijn> | One of the interviews was the "non-abstract large scale systems design" interview |
| 09:46:41 | <merijn> | Which was basically, "here's some ballpark requirements and numbers, design a ballpark system design" |
| 09:46:50 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 09:47:06 | <merijn> | i.e. estimate the required computational/latency stuff from some napkin math and estimate what'd you'd *roughly* need |
| 09:47:19 | <sm> | kuribas++ |
| 09:47:55 | <merijn> | The architecture needs of high performance code can be radically different depending on the performance needed |
| 09:48:02 | <merijn> | So you can't just decide architecture first |
| 09:48:42 | <sm> | if you want a system to be fast, it's a good idea to think about the whole system first |
| 09:48:55 | <gensyst> | I want to create a "machine" with its own state, so I can do initMachine :: m state and then updateMachine :: MyDataType -> state -> m state and along the way queryMachine :: state -> SomeOutputType. How can I do this without exposing the state type to the outside world? |
| 09:48:55 | <merijn> | "hollistic systems design" |
| 09:49:02 | <kuribas> | merijn: first a prototype? |
| 09:49:09 | <merijn> | I will write that on my resume, next to "software zymurgist" |
| 09:49:28 | <merijn> | kuribas: I mean, you don't necessarily need a prototype to make decisions like that |
| 09:49:35 | <merijn> | IFF you know what you're doing |
| 09:49:51 | → | robosexual joins (~robosexua@92.248.229.56) |
| 09:49:53 | <gensyst> | AND in such a way that the state type is still known (internally by the type checker) to be the same across all those function calls. |
| 09:50:02 | <merijn> | Like, if you know the main computational load is "a bunch of matrix math" the architecture should be "how do I most efficiently feed data into BLAS" |
| 09:50:42 | <merijn> | gensyst: You can use a record with an existential type to get something like that |
| 09:51:16 | <jollygood> | issue is with ghc not with stack: https://gitlab.haskell.org/ghc/ghc/-/issues/21196 |
| 09:52:13 | <sm> | aha, there's that 9.2 showstopper so was wondering about. nice one |
| 09:52:25 | × | bahamas quits (~lucian@92.85.13.88) (Ping timeout: 248 seconds) |
| 09:52:34 | <kuribas> | gensyst: not that if you want things to be checked at compile time, the *must* be exposed. |
| 09:54:02 | <gensyst> | So I ask for the impossible? |
| 09:54:12 | <merijn> | kuribas: Wrong |
| 09:54:15 | <merijn> | Hold on |
| 09:54:20 | <merijn> | I'm finishing a sketch |
| 09:54:27 | <sm> | Hold his beer |
| 09:54:49 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 09:55:21 | <kuribas> | merijn: well, putting the type in a GADT is still "exposing" the state. |
| 09:56:21 | <merijn> | hmm |
| 09:56:24 | <merijn> | pastebin is slow |
| 09:57:41 | <merijn> | Not tested, probably contains a typo, etc. but something like: https://dpaste.org/ppZAC |
| 09:58:18 | <merijn> | That way the internal state 's' can be any type not visible to users of StateMachine |
| 09:58:47 | <merijn> | But now it's time for my lunch walk, so I let the hard work of explanation to someone else :p |
| 09:59:19 | <kuribas> | you still have the same state type everywhere, so it doesn't check the states. |
| 09:59:31 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 10:00:05 | <merijn> | Either you or I misunderstood the question :p |
| 10:00:12 | <kuribas> | well, if he meant, parametrize over state, that your solution would work. |
| 10:00:24 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 248 seconds) |
| 10:03:15 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 10:03:53 | → | jonathanx joins (~jonathan@dyn-5-sc.cdg.chalmers.se) |
| 10:04:08 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 248 seconds) |
| 10:04:20 | × | sweater quits (~sweater@206.81.18.26) (Remote host closed the connection) |
| 10:06:39 | × | dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Quit: WeeChat 3.5) |
| 10:07:59 | → | sweater joins (~sweater@206.81.18.26) |
| 10:09:28 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 248 seconds) |
| 10:12:27 | × | werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 256 seconds) |
| 10:12:59 | <gensyst> | merijn, hmm the idea of combining such "internal" funcs with other "external" funcs didn't occur to me |
| 10:13:03 | <gensyst> | i'll try it out |
| 10:13:33 | → | flinner joins (~flinner@user/flinner) |
| 10:14:23 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 10:16:31 | → | werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
| 10:16:55 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 10:21:34 | × | flinner quits (~flinner@user/flinner) (Quit: Using Circe, the loveliest of all IRC clients) |
| 10:27:24 | × | gurkenglas quits (~gurkengla@dslb-084-057-085-111.084.057.pools.vodafone-ip.de) (Ping timeout: 276 seconds) |
| 10:30:56 | → | littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo) |
| 10:33:53 | × | mmhat quits (~mmh@2001:4090:a242:802a:ee08:6bff:fe09:5315) (Ping timeout: 256 seconds) |
| 10:34:53 | × | merijn quits (~merijn@86.86.29.250) (Ping timeout: 260 seconds) |
| 10:36:53 | → | crazazy joins (~user@130.89.171.62) |
| 10:47:00 | × | perrierjouet quits (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Ping timeout: 248 seconds) |
| 10:47:04 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 10:47:30 | → | mmhat joins (~mmh@2001:4090:a242:800a:ee08:6bff:fe09:5315) |
| 10:48:03 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds) |
| 10:48:21 | Lord_of_Life_ | is now known as Lord_of_Life |
| 10:54:02 | ← | jakalx parts (~jakalx@base.jakalx.net) () |
| 10:56:22 | → | CiaoSen joins (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 11:01:34 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 11:04:35 | → | jakalx joins (~jakalx@base.jakalx.net) |
| 11:09:18 | <gensyst> | merijn, It's line 13 (utilizing the earlier pattern match) that perplexes me. Why does this work? Yet for some reason if you do the exact same thing without pattern matching, it stops working: https://dpaste.org/AM1WW |
| 11:09:24 | <gensyst> | because of "escaped type variables" |
| 11:09:27 | <gensyst> | but why..... |
| 11:09:38 | <gensyst> | why are they any less "escaped" with pattern matching |
| 11:15:08 | × | acidjnk quits (~acidjnk@p200300d0c7068b437523c7c9ae2c8004.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 11:19:17 | <merijn> | gensyst: That's part of ExistentialQuantification |
| 11:19:38 | <merijn> | gensyst: Basically, the type 's' is only "in scope" after you pattern match on StateMachine |
| 11:20:07 | <merijn> | gensyst: It's complaining about "escaping", because what you wrote makes 's' "visible" outside a pattern match, but the type system cannot deal with that |
| 11:20:59 | <merijn> | gensyst: So when you pattern match on StateMachine you (temporarily and in a limited scope) get a vision of 's', but you're not allowed to let anyone else notice 's', because then the type checker would have to know what it is |
| 11:21:32 | <merijn> | In my version, we make 's' visible by pattern matching, but then carefully pack things back up and hidden for the outside world before returning anything |
| 11:22:09 | → | bahamas joins (~lucian@84.232.141.55) |
| 11:23:04 | <gensyst> | merijn, ok but wouldn't it be possible to expose the stuff we got from the pattern match to the outside world? (I have tried and the compiler will complain similarly about "escaped type variables" if we try). So the point is that in my (incorrect) method, those things for some reason get escaped earlier, even if we don't really escape them in the end. |
| 11:23:09 | <gensyst> | Do you see what I mean? |
| 11:23:24 | × | _ht quits (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection) |
| 11:23:34 | × | littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
| 11:23:41 | <merijn> | gensyst: You are allowed to expose anything *other than* 's' just fine |
| 11:24:29 | <merijn> | gensyst: Theoretically you could (maybe) make a complicated analysis to make that work, but then the question is: Is that worth the maintenance effort? |
| 11:24:43 | <merijn> | Especially since there's a simple workaround of "just write out the pattern match" |
| 11:25:22 | <gensyst> | merijn, hmm, but how does the pattern match makes this easier for the compiler? |
| 11:25:52 | → | briandaed joins (~briandaed@109.95.142.93.r.toneticgroup.pl) |
| 11:26:09 | → | _ht joins (~quassel@231-169-21-31.ftth.glasoperator.nl) |
| 11:28:09 | <merijn> | gensyst: The 'forall s' part says "there is *a* type 's', don't have to care what, but it's the same in all the bits of this datatype". When you pattern match the compiler plucks a temporary (opaque! so it doesn't know what it is) type out of thin air and checks the code as if you're using that in all the functions. If you would use "currentState myMachine :: s" (i.e. using the accessor function on a |
| 11:28:15 | <merijn> | StateMachine record) it does that too, but now it escapes |
| 11:29:05 | <merijn> | If you do it *twice* "querymachine myMachine (currenState myMachine)" then it creates *two* separate opaque type for each access and then goes "hey, these aren't the same" (because that type is only equivalent to itself) |
| 11:29:33 | <merijn> | gensyst: You'd need to somehow see in the compiler that "really, these two reifications of the opaque type 's' happen in the same scope and refer to the same 's'" |
| 11:29:37 | <merijn> | But that logic is *hard* |
| 11:30:02 | <merijn> | Well, except when you simply tie it to pattern matching and sharing the opaque type accross all field members when you do the pattern match! Then it's easy |
| 11:30:09 | <merijn> | So that's what's done |
| 11:30:59 | <merijn> | (to you it's obvious they *are* the same, but the compiler has no logic for proving that, it just temporarily inserts opaque types unequal to every other type) |
| 11:35:22 | × | robosexual quits (~robosexua@92.248.229.56) (Quit: WeeChat 3.5) |
| 11:35:23 | <gensyst> | merijn, But even in your code, doesn't a new s (s2) get created when you create a *new* StateMachine? |
| 11:35:37 | <gensyst> | so here it seems the compiler *can* deduce that those s are the same |
| 11:36:04 | <merijn> | gensyst: No? Because all the function types can be typechecked fine |
| 11:36:25 | <merijn> | gensyst: So it knows the result of 'updateInternalMachine' returns the *same* 's' as it received as input |
| 11:36:35 | → | chomwitt joins (~chomwitt@2a02:587:dc19:d600:6d5a:79e9:ac14:c3a8) |
| 11:36:58 | <merijn> | gensyst: Imagine all the 's' variables are replaced with an imaginary "concrete" (I dislike that word, but fine) S type |
| 11:37:27 | <merijn> | The compiler has no idea *what* S is, which constructors it has, etc. It just knows "type S exists and these functions take S as argument" and then typechecks that |
| 11:37:59 | <merijn> | So it knows the "new" state 'result' has the same type as the old currenState (because typechecking proves that) |
| 11:38:06 | <merijn> | It just has no idea what that is |
| 11:39:00 | <merijn> | gensyst: Without the pattern match you end up instead getting type S for the use of currentState and S' for the use of 'updateInternalMachine', and S and S' are not the same (at least, there's no way to prove that) |
| 11:40:12 | <gensyst> | ah! ok now i get what you mean by "twice" |
| 11:40:18 | <gensyst> | interesting. |
| 11:40:51 | <gensyst> | the pattern matching guarantees same for all |
| 11:41:01 | <gensyst> | in an easy way |
| 11:41:47 | <merijn> | gensyst: Right! |
| 11:43:08 | <gensyst> | Thank you very much. |
| 11:47:27 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 240 seconds) |
| 11:47:27 | <apache2> | merijn: I guess profiling would work for this |
| 11:48:08 | <apache2> | kuribas: Debug.Trace is kind of hard to integrate though, I haven't gotten it to work reliably (and it's probably because I'm missing something) |
| 11:48:28 | <apache2> | sm: I set ulimit -v to get it to crash rather than bog down the whole machine |
| 11:48:52 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 11:49:47 | <apache2> | sorry I''m 200 years behind the backlog |
| 11:52:28 | × | mmhat quits (~mmh@2001:4090:a242:800a:ee08:6bff:fe09:5315) (Ping timeout: 260 seconds) |
| 11:53:41 | <apache2> | would be nice with a signal handler for ctrl+t like in bsd libc |
| 11:54:50 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer) |
| 11:55:15 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 11:57:20 | → | zero joins (~z@user/zero) |
| 12:01:08 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 12:04:20 | → | dsrt^ joins (~dsrt@173-160-94-253-atlanta.hfc.comcastbusiness.net) |
| 12:06:21 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 12:06:34 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 240 seconds) |
| 12:06:40 | AlexNoo_ | is now known as AlexNoo |
| 12:07:03 | <geekosaur> | apache2, I keep wishing linux would add the necessary support for that, but they refuse |
| 12:07:55 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 12:08:30 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 12:10:00 | <geekosaur> | (it's not just libc, the tty driver needs tpgrp SIGSTAT support, but Linus considers it evil) |
| 12:11:05 | <exarkun> | someone just needs to build a userspace tty driver so it can stop being the kernel's business at all, right? |
| 12:11:32 | <geekosaur> | someone did: readline |
| 12:11:48 | <geekosaur> | but the kernel still needs to sort out who "owns" the tty and is active |
| 12:12:04 | <geekosaur> | ("who" being a process) |
| 12:13:24 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 248 seconds) |
| 12:13:49 | → | dcoutts__ joins (~duncan@host81-156-211-196.range81-156.btcentralplus.com) |
| 12:14:39 | → | mmhat joins (~mmh@2001:4090:a246:806c:ee08:6bff:fe09:5315) |
| 12:15:03 | × | frost quits (~frost@user/frost) (Quit: Client closed) |
| 12:16:17 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 12:16:37 | <kuribas> | apache2: you don't "integrate" it, you just add trace statements, debug (on the repl), then remove the statements. |
| 12:17:22 | <geekosaur> | I can see Linus's point, the tty driver having to walk the processes in the tpgrp and determine the (most likely) active one is pretty grody and a bit unreliable. but damn would it be useful |
| 12:17:57 | <[exa]> | they're moving it finally? |
| 12:18:48 | <geekosaur> | ? |
| 12:18:59 | [exa] | reads the rest of the scrollback |
| 12:19:10 | <[exa]> | ah ok no changes ._. |
| 12:20:16 | <geekosaur> | pretty sure it won't be happening while Linus is in charge |
| 12:20:23 | → | frost joins (~frost@user/frost) |
| 12:20:31 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 256 seconds) |
| 12:21:11 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 12:21:24 | <exarkun> | geekosaur: Yea I meant all of that other "grody" stuff should be userspace too. |
| 12:22:12 | → | jao joins (~jao@211.68.17.95.dynamic.jazztel.es) |
| 12:22:50 | <geekosaur> | userspace doesn't have enough access, and shouldn't |
| 12:23:19 | <[exa]> | I hope they will eventually tie signals as OOB to file descriptors, as they should be |
| 12:23:36 | <[exa]> | ^ wishful thinking for next 50+ years |
| 12:23:54 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 12:24:01 | <geekosaur> | it requires determining when a process (that might be on your uid but not readable) is blocked |
| 12:24:11 | <geekosaur> | and what it's blocked on |
| 12:25:58 | → | acidjnk joins (~acidjnk@p200300d0c7068b43e18f8794d20d12cb.dip0.t-ipconnect.de) |
| 12:27:57 | <apache2> | geekosaur: I see |
| 12:28:03 | <apache2> | geekosaur: I guess the shell could do it too |
| 12:28:20 | <apache2> | find the pg of the pty slave and send a USRINFO1 or whatever |
| 12:28:48 | <apache2> | kuribas: oh, Debug.Trace shows up in the repl? |
| 12:29:20 | <apache2> | [exa]: they have signalfd which is how sensible programs handle signals in the last few years |
| 12:29:35 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds) |
| 12:30:39 | <apache2> | it's not quite oob |
| 12:30:51 | <apache2> | but close |
| 12:32:36 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 12:34:40 | <kuribas> | apache2: yes, it goes to stderr |
| 12:35:05 | × | jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds) |
| 12:37:20 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 260 seconds) |
| 12:37:26 | → | Pickchea joins (~private@user/pickchea) |
| 12:37:48 | × | dcoutts__ quits (~duncan@host81-156-211-196.range81-156.btcentralplus.com) (Ping timeout: 246 seconds) |
| 12:38:15 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 12:42:09 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 12:48:52 | → | zebrag joins (~chris@user/zebrag) |
| 12:49:14 | → | coot joins (~coot@213.134.190.95) |
| 12:50:10 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds) |
| 12:52:21 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 276 seconds) |
| 12:52:35 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 12:55:32 | × | odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Ping timeout: 248 seconds) |
| 13:00:14 | <[exa]> | apache2: ah that is cool |
| 13:03:10 | → | bahamas joins (~lucian@84.232.141.55) |
| 13:04:15 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 13:07:48 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds) |
| 13:07:48 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds) |
| 13:07:48 | → | xff0x joins (~xff0x@om126167084162.29.openmobile.ne.jp) |
| 13:09:37 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net) |
| 13:11:43 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 13:11:53 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 13:12:00 | → | [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 13:13:09 | → | odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 13:16:55 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 13:20:10 | → | Unicorn_Princess joins (~Unicorn_P@93-103-228-248.dynamic.t-2.net) |
| 13:23:42 | → | waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) |
| 13:27:14 | → | tlamer joins (~tlamer@ip-94-112-134-89.net.upcbroadband.cz) |
| 13:33:44 | → | Topsi joins (~Topsi@dyndsl-037-138-064-083.ewe-ip-backbone.de) |
| 13:33:59 | → | jgeerds joins (~jgeerds@d53604b0.access.ecotel.net) |
| 13:36:55 | × | gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 260 seconds) |
| 13:37:58 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 13:37:59 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 13:37:59 | → | wroathe joins (~wroathe@user/wroathe) |
| 13:41:55 | → | bahamas joins (~lucian@84.232.141.55) |
| 13:42:00 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection) |
| 13:42:19 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 13:46:43 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 260 seconds) |
| 13:48:22 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 13:51:02 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 13:55:43 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 14:00:16 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:e8a7:5207:d6e5:3f9a) (Quit: WeeChat 2.8) |
| 14:00:48 | × | acidjnk quits (~acidjnk@p200300d0c7068b43e18f8794d20d12cb.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 14:04:55 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 260 seconds) |
| 14:09:55 | → | xkuru joins (~xkuru@user/xkuru) |
| 14:15:09 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 14:17:04 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Remote host closed the connection) |
| 14:18:19 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 14:20:00 | × | frost quits (~frost@user/frost) (Ping timeout: 252 seconds) |
| 14:20:39 | × | Pickchea quits (~private@user/pickchea) (Ping timeout: 256 seconds) |
| 14:21:52 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Quit: _) |
| 14:22:09 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 14:28:14 | → | odnes_ joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 14:28:53 | × | odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Read error: Connection reset by peer) |
| 14:30:47 | → | vicfred joins (~vicfred@user/vicfred) |
| 14:31:43 | × | xff0x quits (~xff0x@om126167084162.29.openmobile.ne.jp) (Read error: Connection reset by peer) |
| 14:37:07 | → | xff0x joins (~xff0x@om126167084162.29.openmobile.ne.jp) |
| 14:38:43 | × | CiaoSen quits (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 14:39:18 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Ping timeout: 260 seconds) |
| 14:49:01 | → | moonsheep joins (~user@iespladelestany.xtec.cat) |
| 14:51:08 | → | spacenautx joins (~spacenaut@user/spacenautx) |
| 14:52:11 | × | cdman quits (~dcm@user/dmc/x-4369397) (Quit: Leaving) |
| 14:52:48 | × | odnes_ quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Read error: Connection reset by peer) |
| 14:53:11 | → | odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 14:55:52 | × | vicfred quits (~vicfred@user/vicfred) (Quit: Leaving) |
| 14:57:02 | → | shriekingnoise joins (~shrieking@201.231.16.156) |
| 14:57:43 | <juhp[m]> | "(if ... then ... else ...)-syntax in pattern" <- never seen the error before - boggling - no idea how I managed to make it |
| 14:58:28 | <juhp[m]> | The code is just: return $ if ok then classified else [] |
| 14:59:11 | <juhp[m]> | Completely perfluxed |
| 14:59:13 | <geekosaur> | would have to see a bit more, I think. sometimes it means the error is in whatever precedes it |
| 15:00:00 | <juhp[m]> | aha - following it says "Possibly caused by a missing 'do'?" |
| 15:00:33 | <geekosaur> | as written that doesn't require do, so I have to assume whatever precedes it does |
| 15:02:23 | <juhp[m]> | well it is in a do block: the preceding like is: ok <- prompt "install above" |
| 15:02:35 | <dminuoso> | % f (if c then a else b) = _ |
| 15:03:12 | <dminuoso> | juhp[m]: is there an if-then-else before? |
| 15:03:15 | <dminuoso> | if yes, that would explain it |
| 15:03:40 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 15:03:40 | <juhp[m]> | let me check more carefully |
| 15:04:00 | <dminuoso> | Because if you remove the line break, then you have something like `if x then a else b ok <- prompt ...` |
| 15:04:16 | → | Ether17 joins (~Ether17@45.248.151.237) |
| 15:04:21 | <juhp[m]> | basically it's something like https://github.com/juhp/koji-tool/blob/main/src/Install.hs#L204 |
| 15:04:26 | <dminuoso> | Who knows in what state the parser is to consider this a pattern match |
| 15:04:51 | <juhp[m]> | Just I put similar do block under the All case and then this... |
| 15:05:10 | <geekosaur> | I was thinking of it's on the line it says then two lines in what was supposed to be a do, with the do missing, so the second is taken as a definition of $ |
| 15:05:13 | <juhp[m]> | Let me try to revert back.... quite weird |
| 15:05:40 | <juhp[m]> | I tried replacing $ but it didn't seem to help |
| 15:06:14 | <dminuoso> | juhp[m]: ah yes, imagine you forget the do above |
| 15:06:58 | <dminuoso> | if yes == Yes then return install else do mapM_ printInstalled install ok <- prompt "install above" |
| 15:07:10 | <dminuoso> | I can see how this diagnostic might fire |
| 15:10:17 | <juhp[m]> | So what is the solution? I still don't see it |
| 15:10:35 | <dminuoso> | 17:00:00 juhp[m] | aha - following it says "Possibly caused by a missing 'do'? |
| 15:10:57 | <juhp[m]> | okay |
| 15:11:08 | × | moonsheep quits (~user@iespladelestany.xtec.cat) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1)) |
| 15:12:47 | → | moonsheep joins (~user@iespladelestany.xtec.cat) |
| 15:13:11 | × | dsrt^ quits (~dsrt@173-160-94-253-atlanta.hfc.comcastbusiness.net) (Remote host closed the connection) |
| 15:14:19 | <juhp[m]> | Sorry!! Afaict it was caused by an incorrect <- in the following case which should have been a let :-( ugghh |
| 15:14:40 | <juhp[m]> | s/case/pattern/ |
| 15:14:51 | <juhp[m]> | Rather confusing error message |
| 15:15:18 | <juhp[m]> | Thanks a lot, dminuoso and geekosaur ! |
| 15:15:34 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 15:15:47 | <juhp[m]> | Never seen that before (apparently it was introduced in 2020) |
| 15:15:54 | <dminuoso> | juhp[m]: you might want to follow a different style |
| 15:16:10 | <dminuoso> | the kind of interleaved if-then-else + do-notation + early-return is not very idiomatic |
| 15:16:35 | <dminuoso> | it's hard to follow, even for yourself as you have just seen. :) |
| 15:16:41 | <Athas> | It is possible to get `cabal install` to behave more sanely (i.e. just copy the damn binaries built by 'cabal build'), or is there an alternative command I can run to do that? |
| 15:16:44 | <juhp[m]> | dminuoso: right - any pointers would be welcome |
| 15:16:46 | <juhp[m]> | indeed |
| 15:17:27 | <juhp[m]> | Athas: you mean not generate a tarball? dunno |
| 15:17:52 | <dminuoso> | Athas: cp $(cabal -v0 list-bin) |
| 15:17:52 | × | Vajb quits (~Vajb@2001:999:400:9bc1:d5dd:7e53:33b:56) (Read error: Connection reset by peer) |
| 15:18:01 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 15:18:36 | <dminuoso> | Depending on your cabal version, you might have to specify the cabal component for list-bin |
| 15:18:48 | <juhp[m]> | Athas: I started project on github called system-cabal but it is still alpha/beta-ish, which somewhat addresses this |
| 15:18:55 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 15:19:32 | <dminuoso> | I mean it can be as simple as some `cabal build foo:exe:bar && cp $(cabal -v0 list-bin foo:exe:bar) ~/.local/bin/` *shrugs* |
| 15:19:38 | <Athas> | dminuoso: I feared it would be something like that. |
| 15:19:40 | <juhp[m]> | Athas: otherwise stack install ;o) :) |
| 15:19:52 | <Athas> | Yes, that is the competition. |
| 15:20:05 | <dminuoso> | Athas: So I guess you're looking for a simple `cabal copy-bin`? |
| 15:20:09 | × | odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Remote host closed the connection) |
| 15:20:30 | <Athas> | dminuoso: yes. |
| 15:20:46 | <Athas> | Maybe I'll just create a shell script in my project root that abbreviates these hopeless commands. |
| 15:21:07 | <dminuoso> | Haha, I was about to give you a command that was going to start `echo "#!/bin/bash\n ....` |
| 15:21:47 | <Athas> | I am trying to fully migrate my project to cabal, but I don't want to hugely inconvenience my collaborators. |
| 15:21:48 | <dminuoso> | Luckily we have list-bin nowadays, so the pipefitting is easy |
| 15:23:04 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 15:23:36 | <Athas> | Hey, maybe I'll make it a Makefile and they can just pretend it's a C program. |
| 15:23:41 | <juhp[m]> | I still feel my parse error is almost a bug? - I mean why would it mistaken the next case pattern as some other pattern just because it is missing a do |
| 15:23:57 | <juhp[m]> | lol |
| 15:24:14 | <geekosaur> | indentation |
| 15:24:31 | <geekosaur> | I'd still like to see the whole context |
| 15:24:33 | <dminuoso> | juhp[m]: Its an LALR generated parser for a whitespace sensitive language. Parser errors are always harsh in this situhation. |
| 15:24:50 | <juhp[m]> | okay right, I see thanks |
| 15:25:22 | → | liz_ joins (~liz@host109-151-128-120.range109-151.btcentralplus.com) |
| 15:25:36 | <juhp[m]> | geekosaur: I can push the code now that it compiles I guess :) |
| 15:26:18 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 15:31:48 | × | jonathanx quits (~jonathan@dyn-5-sc.cdg.chalmers.se) (Remote host closed the connection) |
| 15:39:39 | → | MajorBiscuit joins (~MajorBisc@86-88-79-148.fixed.kpn.net) |
| 15:40:52 | → | Null_A joins (~null_a@2601:645:8700:2290:b1c9:2c49:e327:d981) |
| 15:41:49 | → | dcoutts__ joins (~duncan@host81-156-211-196.range81-156.btcentralplus.com) |
| 15:45:45 | → | jinsun joins (~jinsun@user/jinsun) |
| 15:48:41 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 15:50:28 | × | jinsun quits (~jinsun@user/jinsun) (Ping timeout: 248 seconds) |
| 15:52:37 | → | dzdcnfzd joins (~dzdcnfzd@2600:387:5:807::73) |
| 15:53:33 | × | xff0x quits (~xff0x@om126167084162.29.openmobile.ne.jp) (Read error: Connection reset by peer) |
| 15:53:36 | <dzdcnfzd> | Can anyone figure out how to write this function: `almostBind :: Monad m => FreeT f m a -> (FreeT f Identity a -> FreeT f m b) -> FreeT f m b` |
| 15:53:52 | <dzdcnfzd> | Sorry, `Functor f` too |
| 15:54:50 | <dzdcnfzd> | Also `Traversable f` |
| 15:55:13 | × | ubert quits (~Thunderbi@2a02:8109:9880:303c:ad62:b99:9259:5795) (Remote host closed the connection) |
| 15:55:32 | → | jinsun joins (~jinsun@user/jinsun) |
| 15:56:41 | × | jollygood quits (www-data@2607:5300:60:8be::1) (Quit: CGI:IRC (Session timeout)) |
| 15:58:37 | <monochrom> | If it is not "\m k -> m >>= \a -> k (pure a)" then you need to say what it should do. |
| 15:59:24 | <c_wraith> | you might need a runIdentity in there |
| 16:00:06 | × | unclechu quits (~unclechu@2001:470:69fc:105::354) (Quit: You have been kicked for being idle) |
| 16:00:39 | <c_wraith> | oh, I see. that's more like almostAp than almostBind |
| 16:01:18 | × | kaiepi quits (~Kaiepi@156.34.47.253) (Read error: Connection reset by peer) |
| 16:01:31 | <monochrom> | I don't know what else "almost bind" could mean. |
| 16:01:44 | × | Ether17 quits (~Ether17@45.248.151.237) (Quit: Client closed) |
| 16:02:43 | <c_wraith> | that type feels very monad-control |
| 16:03:07 | <dzdcnfzd> | I called it almostBind because the type signature looks like bind to me |
| 16:03:10 | <dzdcnfzd> | no deep reason |
| 16:03:17 | → | kaiepi joins (~Kaiepi@156.34.47.253) |
| 16:03:17 | <c_wraith> | it's closer to ap than bind |
| 16:03:32 | <dzdcnfzd> | But `"\m k -> m >>= \a -> k (pure a)"` works! |
| 16:03:39 | <dzdcnfzd> | Thanks monochrom! |
| 16:04:21 | <geekosaur> | well, it does something. but is that something what you needed? |
| 16:04:22 | <dzdcnfzd> | c_wraith: Yeah, it is, actually |
| 16:04:33 | <dzdcnfzd> | Yes, I think :) |
| 16:05:33 | <dzdcnfzd> | My specific use case is that I'm running in a transformer stack that looks like `FreeT f (Except String) ()` where `f` is a nice, well-behaved functor |
| 16:06:22 | <dzdcnfzd> | I have a function `foo` which returns values of type `FreeT f (Except String) ()` |
| 16:06:37 | × | jinsun quits (~jinsun@user/jinsun) (Read error: Connection reset by peer) |
| 16:06:50 | <dzdcnfzd> | I need to apply them to an action of type `FreeT f (Except String) ()` which expects an argument of type `FreeT f Identity ()` |
| 16:06:52 | → | jinsun joins (~jinsun@user/jinsun) |
| 16:07:17 | <dzdcnfzd> | But if I get a `Left` value from `foo` I want the whole computation to collapse |
| 16:07:46 | × | MajorBiscuit quits (~MajorBisc@86-88-79-148.fixed.kpn.net) (Quit: WeeChat 3.4) |
| 16:08:57 | <dzdcnfzd> | I think this works |
| 16:09:03 | <dzdcnfzd> | the free monad still confuses me |
| 16:11:04 | <dzdcnfzd> | The only thing I'm worried about, and this might be dumb (like I said, free monad and monad transformers generally are new to me) is whether I'll end up with the `arg` left over in my computation |
| 16:11:22 | <dzdcnfzd> | whereas I really only want it to be applied to `k` |
| 16:11:30 | <dzdcnfzd> | Does that make any sense or no? |
| 16:12:38 | × | xaotuk quits (~sasha@2a06:5b00:15fe:9b00::2) (Ping timeout: 260 seconds) |
| 16:14:18 | → | xaotuk joins (~sasha@net224-32-245-109.mbb.telenor.rs) |
| 16:17:27 | <dzdcnfzd> | This is a comparison of what I'm doing with the suggestion: https://paste.tomsmeding.com/E9eWj957 |
| 16:17:40 | × | jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds) |
| 16:18:32 | <dzdcnfzd> | I actually think they may be different |
| 16:21:14 | → | MajorBiscuit joins (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net) |
| 16:23:22 | × | benin quits (~benin@183.82.29.230) (Quit: The Lounge - https://thelounge.chat) |
| 16:23:50 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection) |
| 16:24:26 | <k`> | So I get the feeling that `Pointed` is generally considered a mistake, but what about `Copointed` ? Seems like it's harder to get `copoint` 'wrong'. |
| 16:24:26 | <k`> | |
| 16:25:00 | <geekosaur> | it's not a mistake, it just doesn't pull its weight |
| 16:25:15 | <k`> | Sorry, that's what I meant by 'mistake'. 'Not worth it'. |
| 16:25:47 | <geekosaur> | if we were being strict about typeclasses, it'd be there and Applicative would be `Pointed f, Apply f => Applicative f` with no methods |
| 16:26:04 | <geekosaur> | but typeclasses have a cost that nobody wants to pay |
| 16:27:28 | <k`> | I really don't mind paying, but the price seems more like folks getting `point` wrong (e.g. creating a singleton for a zipping Apply). |
| 16:27:33 | <c_wraith> | Note that the cost isn't technical. |
| 16:28:39 | <c_wraith> | The cost is in communication. if Applicative was defined as Pointed + Apply and some laws, do you expect those laws to hold if Applicative doesn't appear in the type declaration? |
| 16:29:51 | <c_wraith> | If you compose two functions, one of which uses only Apply and the other uses only Pointed, does the result depend on Applicative? |
| 16:30:25 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 256 seconds) |
| 16:31:26 | <c_wraith> | none of these things are technical issues with whether it will compile or not. They're issues of communication and expectations. |
| 16:32:26 | <k`> | Clearly you need to put an Applicative constraint on the result if you want to be sure. Unless you're OK with documentation like 'If it's also Apply, it MUST follow these laws.' and 'If it's also Pointed, it must follow these laws.'. |
| 16:33:18 | <k`> | Then `Applicative` degrades to `class (Pointed m, Apply m)=> Applicative m; instance (Pointed m, Apply m)=> Applicative m`. |
| 16:33:56 | <k`> | And since all these laws are unenforced conventions, maybe that's OK. But folks already tend to get things wrong... |
| 16:34:13 | <c_wraith> | It's a very slippery slope to expect people to keep an MxN matrix of laws in their head |
| 16:34:34 | <c_wraith> | since as you say, it's hard enough to keep N sets of laws in your head |
| 16:34:47 | <c_wraith> | Why make it worse? |
| 16:35:12 | <Bulby[m]> | Pointed and Apply 😱 |
| 16:35:13 | <Bulby[m]> | not real right |
| 16:35:42 | <k`> | Anyway, getting back to my original question, what about `Copointed`. I'm honestly not sure how to mess that up, even if you do have `instance (Copointed m, Extend m)=> Comonad m` . |
| 16:36:46 | <Bulby[m]> | k`: enum and bounded do something similar in its documentation |
| 16:36:46 | <edwardk> | k` i can come up with Copointed and Extend instances for the same type that are incompatible. we've had them emerge in practice. |
| 16:37:45 | <edwardk> | the scalaz community tried this at one point for the record. |
| 16:37:54 | <k`> | edwardk: Good to know! What kind of problems? First vs last element? |
| 16:38:34 | <edwardk> | Pointed still plays a role, but it is pretty hard to find useful instances. the main usecase that comes to mind is that a PointedFunctor is basically exactly what you want to quantify over for an 'affine traversal' |
| 16:38:46 | <Bulby[m]> | there are types that in conjunction with other types require new the laws to be compatible |
| 16:38:47 | <Bulby[m]> | not require, it's just a "law" |
| 16:39:00 | <edwardk> | first vs. last. vs. something that gives you back an infinite container |
| 16:39:29 | <k`> | So you extend, get an infinite container, copoint, and loop forever? |
| 16:40:24 | <Bulby[m]> | What is a pointed? Is that `pure`? |
| 16:40:41 | <c_wraith> | yes |
| 16:41:04 | <Bulby[m]> | where does that term come from |
| 16:41:12 | <edwardk> | it is easy to wind up with a set where you can pick a point in the set (pointed set), and another where you have a binary operation on the set (a magma), and not have magically picked the right point to be the unit of the magma when you stick those features together to get a unital magma, or that is the unit of the semigroup when you go to upgrade to a monoid. if you _only_ have the vocabulary for the operations and no vocabulary for the |
| 16:41:12 | <edwardk> | laws, you easily step wrong when you expect those laws to hold |
| 16:42:21 | <edwardk> | instance (Applicative f, Monoid a) => Monoid (f a) -- seems like a great idea until you go to realize it makes for a shit choice of monoid for [a], and precludes ever getting Maybe a to be the lifting of a semigroup with a fresh unit. |
| 16:43:27 | <Bulby[m]> | Where does the term pointed come from? |
| 16:43:33 | <k`> | That makes sense. |
| 16:43:44 | <edwardk> | https://en.wikipedia.org/wiki/Pointed_set |
| 16:43:55 | <edwardk> | a 'pointed functor' is the same idea |
| 16:44:15 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 16:44:30 | × | moonsheep quits (~user@iespladelestany.xtec.cat) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1)) |
| 16:45:18 | <Bulby[m]> | so `pure` "preserves the point" |
| 16:45:28 | <k`> | I've been wondering about the value of a 'lawless' class with `empty :: forall a. m a`, and it seems to do real well until you get to the possibility of somebody defining `empty = Const mempty`, when it needs to be `Const anihilatingElement` (with no inherent laws to tell you that). |
| 16:46:14 | → | Tuplanolla joins (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi) |
| 16:46:34 | <k`> | Bulby[m]: But in practice, `point` often gets (mis)defined as `singleton`. |
| 16:47:27 | <edwardk> | Bulby[m]: a functor maps objects to objects, and provides a mapping of arrows to arrows. a pointed functor, gives you a mapping pure :: a -> f a -- with the obvious laws connecting that to the arrows in the category. pure . f = fmap f . pure |
| 16:47:27 | <Bulby[m]> | you can do whatever as long as it represents the input value? |
| 16:47:39 | <edwardk> | fortunately the latter is a free theorem in haskell so we don't need to tie it down |
| 16:48:12 | <edwardk> | so I don't even require it to be a Functor here, as there are Pointed structures that _aren't_ functors. e.g. Set |
| 16:48:25 | <edwardk> | the problem with Pointed culturally is that it leads to folks doing things like foldMap point |
| 16:48:28 | <edwardk> | er foldMap pure |
| 16:48:31 | <edwardk> | what does that mean? |
| 16:48:45 | <edwardk> | there's no law relating the monoid on 'f a' with the 'a' in any capacity |
| 16:48:55 | <edwardk> | when f = [] vs. Maybe vs. Set you get TOTALLY unrelated answers |
| 16:49:32 | <edwardk> | there's very little you can do parametrically in a given pointed functor usefully |
| 16:49:44 | <k`> | So you need `getAlt . foldMap (Alt . pure)` |
| 16:50:00 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 16:50:17 | <edwardk> | on the other hand, something that takes advantage of the 'associative' structure of say Applicative-without-pure, which is called 'Apply' in one of my packages, that? you can do lots with. |
| 16:50:45 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection) |
| 16:50:59 | <edwardk> | the issue is haskell is generally bad at making classes that mix two such general extension directions, class Functor f => Applicative f. is what we have today |
| 16:51:11 | <k`> | (I'm still wishing that `Apply` would be slotted into the Functor hierarchy.) |
| 16:51:13 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 16:51:33 | → | arjun joins (~arjun@user/arjun) |
| 16:51:33 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 16:51:48 | <edwardk> | but if we wanted class (Apply f, Pointed f) => Applicative f -- we'd be dealing with the fact that almsot all the uses of it would infer the weaker (Apply f, Pointed f) constraint set, despite generally needing the laws of Applicative that tell us the point is related to the <*> to be useful or canonical |
| 16:52:30 | <edwardk> | so the best we can do is make new operations that have their own laws that re-export the ones from those superclasses in order to get inference to do the right thing |
| 16:52:34 | <edwardk> | which is a bit of a mess |
| 16:52:53 | × | dut quits (~dut@user/dut) (Ping timeout: 260 seconds) |
| 16:53:23 | <edwardk> | pure f <*> m = f <$> m -- works for Applicative, but not (Apply f, Pointed f) |
| 16:54:56 | <k`> | So what are your thoughts on just saying "If it's also `Apply`, it must obey the law `pure f <*> mx = fmap f m`? |
| 16:55:22 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 16:55:27 | <Bulby[m]> | what is a free theorm 😭 |
| 16:56:00 | <geekosaur> | https://people.mpi-sws.org/~dreyer/tor/papers/wadler.pdf |
| 16:56:20 | <k`> | Bulby[m]: I think basically if your instance isn't a GADT, it's guaranteed to be true because you can't care about the element type. |
| 16:56:25 | <geekosaur> | it's a theorem that follows directly from a type |
| 16:56:31 | <k`> | In this case. |
| 16:57:00 | <sclv> | right. its a theorem about a function which holds for any function of that type, because any implementation that satisfies the type must satisfy the theorem. |
| 16:57:01 | → | zeenk joins (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) |
| 16:57:35 | → | Guest|68 joins (~Guest|68@144.48.23.93) |
| 16:57:45 | → | econo joins (uid147250@user/econo) |
| 17:00:11 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 17:00:55 | <monochrom> | http://www.vex.net/~trebla/haskell/abs-type-param.html |
| 17:01:23 | <k`> | In this case, unless you're using a GADT or create an illegal Functor, it's impossible for `fmap f (point x)` to be anything other than `point (f x)`. GADTs mess it up because your 'x :: a' could actually be restricted to 'x :: (Integer ~ a)=> a'. |
| 17:01:53 | <Bulby[m]> | sorcery |
| 17:03:59 | × | Guest|68 quits (~Guest|68@144.48.23.93) (Quit: Connection closed) |
| 17:07:09 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 17:08:00 | → | x_kuru joins (~xkuru@user/xkuru) |
| 17:11:33 | × | xkuru quits (~xkuru@user/xkuru) (Ping timeout: 260 seconds) |
| 17:12:52 | × | dzdcnfzd quits (~dzdcnfzd@2600:387:5:807::73) (Quit: Client closed) |
| 17:13:18 | × | euandreh quits (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) (Ping timeout: 260 seconds) |
| 17:17:28 | → | alx741 joins (~alx741@host-181-198-243-150.netlife.ec) |
| 17:17:30 | × | alx741 quits (~alx741@host-181-198-243-150.netlife.ec) (Client Quit) |
| 17:18:34 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 17:19:17 | → | alx741 joins (~alx741@host-181-198-243-150.netlife.ec) |
| 17:19:33 | × | alx741 quits (~alx741@host-181-198-243-150.netlife.ec) (Client Quit) |
| 17:19:33 | → | euandreh joins (~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) |
| 17:23:58 | → | wroathe joins (~wroathe@user/wroathe) |
| 17:25:37 | → | seydar joins (~seydar@154-27-113-252.starry-inc.net) |
| 17:26:31 | × | arjun quits (~arjun@user/arjun) (Ping timeout: 256 seconds) |
| 17:26:58 | → | amesgen[m] joins (~amesgenm]@2001:470:69fc:105::82b) |
| 17:28:19 | <seydar> | I'm having trouble translating some nested loops into Haskell |
| 17:28:20 | <seydar> | https://paste.tomsmeding.com/VGyql1tq |
| 17:30:18 | <seydar> | lines 53 and 63 are where I do some list comprehensions, and I feel like I'm getting them wrong, because when I swap the x and y declarations in line 63, I get a little bit closer to the right answer, but that's clearly not correct according to the C code |
| 17:31:37 | <monochrom> | I think a toy example helps understand the general case. |
| 17:31:56 | <monochrom> | > [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']] |
| 17:31:58 | <lambdabot> | error: |
| 17:31:58 | <lambdabot> | • Variable not in scope: c' :: Char |
| 17:31:58 | <lambdabot> | • Perhaps you meant one of these: |
| 17:32:06 | <monochrom> | > [(i, j) | i <- [0,1,2], j <- ['a', 'b', 'c']] |
| 17:32:08 | <lambdabot> | [(0,'a'),(0,'b'),(0,'c'),(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')] |
| 17:32:12 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 17:32:29 | <monochrom> | It means that i is the outer loop. |
| 17:32:45 | <dminuoso> | Also |
| 17:33:03 | → | stackdroid18 joins (14094@user/stackdroid) |
| 17:33:53 | <seydar> | monochrom: right, i agree, which is why i'm confused as to why my answer gets closer to correct when i mislabel the loops |
| 17:34:05 | <monochrom> | So the problem is elsewhere? |
| 17:34:57 | <seydar> | I... don't know. I'm convinced that the problem is in the list comprehensions, since everything else seems to be right, but I know that the `bases` variable is ultimately wrong |
| 17:35:02 | <monochrom> | "closer to correct (but still incorrect)" is code for very subtle and deep mistake. |
| 17:35:47 | <seydar> | my individual `basis` function is correct, i've tested that out |
| 17:36:05 | <seydar> | but then I'm unable to put together a larger `bases` list correctly |
| 17:40:35 | <seydar> | okay, i've confirmed that `bases` is getting produced correctly. i've compared outputs with a 5x4 image instead of playing guessing games on a 1199x1198 image |
| 17:41:23 | <monochrom> | And yet you can't argue against [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']] = [(0,'a'),(0,'b'),(0,'c'),(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c')] |
| 17:41:33 | <monochrom> | So the problem is elseelseelsewhere? |
| 17:42:16 | <monochrom> | Or a very hard to catch typo somewhere. |
| 17:43:05 | <monochrom> | This is when you throw in a lot of Debug.Trace stuff or split code into more units to perform actually seriously unit testing. |
| 17:43:08 | <seydar> | right, the C loop has x as the inner loop and y as the outer (lines 68 and 69 in the C), which matches the haskell (line 63) |
| 17:43:08 | × | AlexNoo quits (~AlexNoo@178.34.163.12) (Read error: Connection reset by peer) |
| 17:43:51 | → | AlexNoo joins (~AlexNoo@178.34.163.12) |
| 17:44:37 | <monochrom> | Also, use smaller inputs so you get smaller outputs so you don't just gross over "this is close enough". |
| 17:45:06 | <seydar> | you're right |
| 17:45:15 | <seydar> | gonna switch it to be 1x1 components |
| 17:45:21 | <monochrom> | Generally being a good scientist and using the scientific method. |
| 17:46:01 | <seydar> | i prefer to commune with the code and see if there's some middle ground between what the compiler wants and what i want |
| 17:46:27 | <seydar> | okay well turns out my code is wildly fucked up when i go to 1x1, so that's prolly a good place to start since it removes the problem of the list comprehension |
| 17:49:08 | × | AlexNoo quits (~AlexNoo@178.34.163.12) (Read error: Connection reset by peer) |
| 17:49:40 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 17:49:54 | → | AlexNoo joins (~AlexNoo@178.34.163.12) |
| 17:52:26 | <seydar> | fixed it for 1x1 -- there was an unrelated bug that wasn't converting the linear pixels back to sRGB |
| 17:53:32 | <seydar> | so now it's looking like the bug is back to the list comprehension part where i try to replicate nested loops |
| 17:53:46 | <seydar> | is there a better, more haskelly way to do nested loops? |
| 17:54:13 | <monochrom> | No. |
| 17:54:41 | <monochrom> | Worse and less haskelly ways, plenty. |
| 17:55:00 | → | agumonkey joins (~user@88.163.231.79) |
| 17:55:44 | <k`> | I usually end up writing `for t $ \ x -> ... for s $ \ y -> ...` -- probably worse and less Haskelly. |
| 17:56:38 | <monochrom> | Are you sure you want "for" as opposed to "for_"? |
| 17:56:57 | <k`> | Right, looping for effects only, `for_`. |
| 17:57:34 | <monochrom> | But it's incomparable to the [(i, j) | i <- [0,1,2], j <- ['a', 'b', c']] kind. |
| 17:58:35 | <monochrom> | So yes "for" is worse and less Haskelly than "for_" when effect-only. |
| 17:59:12 | <k`> | I mean, you can also use `t >>= \ x -> ... s >>= \ y -> ...` when you need Monadic powers. |
| 17:59:20 | × | crazazy quits (~user@130.89.171.62) (Ping timeout: 248 seconds) |
| 17:59:43 | <k`> | And I honestly can remember what list comprehension desurgars to `mzip`. |
| 17:59:46 | <mrianbloom> | Is there an easy way to do size-type wrappers for arrays in Haskell? |
| 18:00:36 | <mrianbloom> | These would be types that allow you to enforce that two arrays have the same dimensions. |
| 18:00:57 | → | jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) |
| 18:01:12 | × | raym quits (~raym@user/raym) (Ping timeout: 246 seconds) |
| 18:03:06 | → | raym joins (~raym@user/raym) |
| 18:07:26 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 18:08:27 | <EvanR> | you can use numbers at the type level, that's pretty easy |
| 18:08:42 | <EvanR> | doing anything more than using numbers at the type level, ymmv xD |
| 18:10:04 | × | MajorBiscuit quits (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net) (Quit: WeeChat 3.4) |
| 18:10:42 | <EvanR> | https://hackage.haskell.org/package/sized-vector-1.4.3.1 |
| 18:10:56 | <EvanR> | deprecated in favor of |
| 18:14:31 | <juhp[m]> | geekosaur: I updated https://github.com/juhp/koji-tool/blob/main/src/Install.hs#L202 : I think it was indeed a missing do + some indentation issue, since I can't reproduce it again now |
| 18:15:35 | <agumonkey> | he\\o |
| 18:16:49 | <juhp[m]> | (it would be somewhere within the current last commit, but since corrected - I should have saved the broken code for reference) |
| 18:19:55 | → | x_kuru_ joins (~xkuru@user/xkuru) |
| 18:21:29 | <juhp[m]> | Anyway has been some fun refactoring :-) |
| 18:23:51 | × | x_kuru quits (~xkuru@user/xkuru) (Ping timeout: 276 seconds) |
| 18:24:49 | <sm> | "With this paper we have tried to convey that some domain-driven design concepts are applicable and beneficial to functional languages, even strongly typed ones like Haskell. Types don’t replace proper design or GHC would have been modular to begin with." |
| 18:25:34 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 18:25:55 | <sm> | I guess hsyl isn't here, but.. this paper is a gem 💎 |
| 18:26:03 | <sm> | https://hsyl20.fr/home/files/papers/2022-ghc-modularity.pdf |
| 18:26:29 | <mrianbloom> | thanks EvanR |
| 18:27:46 | → | CiaoSen joins (~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 18:28:34 | × | ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 240 seconds) |
| 18:28:42 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 18:32:05 | → | x_kuru joins (~xkuru@user/xkuru) |
| 18:32:09 | × | x_kuru_ quits (~xkuru@user/xkuru) (Read error: Connection reset by peer) |
| 18:34:14 | → | littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo) |
| 18:34:16 | → | odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 18:37:52 | → | kenran joins (~kenran@200116b82b2708000a1d989028fc8790.dip.versatel-1u1.de) |
| 18:39:08 | × | zeenk quits (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!) |
| 18:42:25 | × | Inoperable quits (~PLAYER_1@fancydata.science) (Quit: All your buffer are belong to us!) |
| 18:43:40 | × | xaotuk quits (~sasha@net224-32-245-109.mbb.telenor.rs) (Ping timeout: 260 seconds) |
| 18:43:48 | × | alp_ quits (~alp@user/alp) (Ping timeout: 248 seconds) |
| 18:43:52 | → | Inoperable joins (~PLAYER_1@fancydata.science) |
| 18:45:31 | × | teddyc quits (theodorc@cassarossa.samfundet.no) (Quit: WeeChat 3.0) |
| 18:46:49 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Remote host closed the connection) |
| 18:50:33 | × | Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep) |
| 18:51:16 | × | hololeap_ quits (~hololeap@user/hololeap) (Remote host closed the connection) |
| 18:53:38 | × | spacenautx quits (~spacenaut@user/spacenautx) (Quit: WeeChat 3.5) |
| 18:55:33 | → | yauhsien joins (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) |
| 18:56:36 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 19:03:12 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:6c7f:24ed:3788:2a1e) |
| 19:04:23 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 19:05:45 | → | coot joins (~coot@213.134.190.95) |
| 19:06:16 | × | yauhsien quits (~yauhsien@61-231-34-25.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 19:07:54 | × | mxs quits (~mxs@user/mxs) (Remote host closed the connection) |
| 19:08:02 | → | mxs joins (~mxs@user/mxs) |
| 19:13:12 | → | acidjnk joins (~acidjnk@p200300d0c7068b43f1a15e75027d04fd.dip0.t-ipconnect.de) |
| 19:14:31 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 19:16:52 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:18:07 | zero | is now known as zzz |
| 19:21:42 | → | alp_ joins (~alp@user/alp) |
| 19:24:36 | × | mxs quits (~mxs@user/mxs) (Remote host closed the connection) |
| 19:24:45 | → | mxs joins (~mxs@user/mxs) |
| 19:25:35 | → | bahamas joins (~lucian@84.232.141.55) |
| 19:26:54 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 276 seconds) |
| 19:27:07 | × | zer0bitz quits (~zer0bitz@2001:2003:f444:8f00:98db:b5ce:843:b259) (Ping timeout: 256 seconds) |
| 19:27:52 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 19:28:04 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 19:31:15 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 19:31:39 | <maerwald> | sm: my opinion is that good design cannot happen up-front, unless you really do the same thing for the second time. Good codebases need a rewrite. I'd rather start with a monolith than with a very modular design, because a monolith is easier to grow and refactor. |
| 19:32:19 | × | agumonkey quits (~user@88.163.231.79) (Ping timeout: 256 seconds) |
| 19:32:34 | <sm> | I agree on the first part, certainly |
| 19:33:21 | <sm> | except for the kind of "obvious" design you can bring from experience with similar projects |
| 19:33:44 | → | abhinav joins (~abhinav@c-67-169-139-16.hsd1.ca.comcast.net) |
| 19:34:01 | <maerwald> | with overly modular design you easily navigate yourself into "API locks", where you suddenly can't make drastical changes anymore. That is fine if you're confident that your module boundaries are correct. But if you're wrong about your boundaries, god help you |
| 19:34:51 | abhinav | is now known as abhixec |
| 19:34:51 | × | briandaed quits (~briandaed@109.95.142.93.r.toneticgroup.pl) (Ping timeout: 260 seconds) |
| 19:35:23 | × | quintasan quits (~quassel@quintasan.pl) () |
| 19:35:33 | → | quintasan joins (~quassel@quintasan.pl) |
| 19:35:35 | <sm> | well, I think it's assumed that boundaries are part of what you can change |
| 19:35:59 | <maerwald> | but programmers don't like to be "wrong", so they get obsessed with up-front design and then do worse things |
| 19:36:04 | × | quintasan quits (~quassel@quintasan.pl) (Client Quit) |
| 19:36:16 | → | quintasan joins (~quassel@quintasan.pl) |
| 19:36:36 | <sm> | and if not, that's of course a problem, ideally solvable but if not, to be worked around (as with all the "expedient, safe" fixes to ghc over the years) |
| 19:37:22 | → | briandaed joins (~briandaed@109.95.142.93.r.toneticgroup.pl) |
| 19:37:46 | <sm> | often that's all we can afford at a point in time, or so it appears, but inevitably tech debt builds and eventually deeper cleanup is needed |
| 19:37:55 | <maerwald> | "this codebase needs a rewrite" is a success story... it means the codebase has survived so long and is so popular, that it *deserves* a rewrite! |
| 19:38:23 | <maerwald> | also, I'm not talking about GHC... I know nothing about it :) |
| 19:38:23 | <sm> | agreed! |
| 19:39:18 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 19:39:30 | <sm> | I know more after reading that paper ! might even understand some #ghc talk :) |
| 19:41:14 | <dibblego> | <edwardk> Pointed still plays a role, but it is pretty hard to find useful instances. the main usecase that comes to mind is that a PointedFunctor is basically exactly what you want to quantify over for an 'affine traversal' |
| 19:41:27 | <dibblego> | but what is the use-case for an affine traversal? |
| 19:41:34 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 19:43:22 | <dminuoso> | AffineTraversal in the presence of Traversal is useful for the same reason that Maybe is useful in the presence of []/ |
| 19:43:25 | → | xaotuk joins (~sasha@net224-32-245-109.mbb.telenor.rs) |
| 19:44:39 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 19:47:14 | × | michalz quits (~michalz@185.246.204.105) (Remote host closed the connection) |
| 19:47:34 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 240 seconds) |
| 19:47:39 | → | michalz joins (~michalz@185.246.204.101) |
| 19:48:04 | × | littlebobeep quits (~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds) |
| 19:48:24 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 19:48:31 | <darkling> | I'm new to Haskell, but what I'm having most trouble with at the moment is converting the marvellous new structures and intuitions into actual use-cases. |
| 19:49:28 | × | abhixec quits (~abhinav@c-67-169-139-16.hsd1.ca.comcast.net) (Remote host closed the connection) |
| 19:50:25 | <darkling> | I'm mostly OK with the maths-centric approaches -- I trained as a mathematician -- but linking the way I'd write the code "normally" to this new strangely-named zoo of magic is proving tricky. |
| 19:50:49 | <Cale> | hmm |
| 19:51:06 | <geekosaur> | have you looked at _Real World Haskell_? |
| 19:51:14 | <geekosaur> | @where rwh |
| 19:51:14 | <lambdabot> | http://www.realworldhaskell.org/blog/ http://book.realworldhaskell.org/read/ |
| 19:51:47 | <dminuoso> | Perhaps it might be useful to dispel the magic. Every bit of Haskell code can easily be inspected, and since evaluation amounts to just substituting for a definition - very much like in math - you can trivially follow code. |
| 19:52:17 | <darkling> | Thanks. I'll add that to the reading list. I'm working through LYAH at the moment, in conjunction with "What I wish I knew when I started Haskell", and the Typeclassopedia, and a textbook on Category Theory. |
| 19:53:14 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 19:53:44 | <darkling> | dminuoso: I'm overstating the magic part here. It's more that I can't (yet) use those tools as building blocks, so they appear to stand alone. |
| 19:53:47 | <Cale> | darkling: I guess one thing you might start with is that a lot of imperative loops end up being frozen into lists |
| 19:53:51 | × | odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Remote host closed the connection) |
| 19:54:15 | → | odnes joins (~odnes@5-203-254-76.pat.nym.cosmote.net) |
| 19:54:19 | × | roconnor quits (~roconnor@coq/roconnor) (Ping timeout: 240 seconds) |
| 19:54:36 | <Cale> | Just as a loop either doesn't occur (e.g. because its loop condition isn't met), or it consists of a single iteration followed by another loop, a list is either empty, or consists of a single element followed by another list. |
| 19:54:39 | <dminuoso> | darkling: Oh that. Just imagine this to be a natural language, its writing and reading that automatically builds up intuition. |
| 19:54:55 | <darkling> | I've done quite a bit of Erlang, so I'm happy with the functional idioms. |
| 19:54:57 | <Cale> | So, in some sense, lists are like "loops waiting to happen" |
| 19:55:08 | → | littlebobeep joins (~alMalsamo@gateway/tor-sasl/almalsamo) |
| 19:55:13 | <Cale> | (and especially so if they're lazy lists) |
| 19:55:27 | <darkling> | The laziness is very attractive. :) |
| 19:55:29 | <geekosaur> | I would also mention that category theory is not as useful as some claim |
| 19:55:56 | <darkling> | geekosaur: I had the book a few years ago, independent of Haskell. This is just the impetus to read the book. |
| 19:56:00 | <geekosaur> | knowing CT won't help you one bit with understanding IO, in particular |
| 19:56:26 | <dminuoso> | darkling: Erlang is almost, but not quite, entirely unlike Haskell. |
| 19:56:31 | <EvanR> | so you want to write hello world in haskell, let me first introduce you to javascript's callback system |
| 19:56:48 | <Cale> | haha |
| 19:56:50 | <darkling> | EvanR: Please, don't. $day_job is mostly JS/TS. :) |
| 19:57:40 | <dminuoso> | 21:54:56 Cale | So, in some sense, lists are like "loops waiting to happen" |
| 19:57:48 | <dminuoso> | I file this under "monad tutorial fallacy" |
| 19:58:01 | <Cale> | hm? |
| 19:58:03 | <darkling> | dminuoso: I've already done the brain jump from imperative to functional, though. :) |
| 19:58:33 | <Cale> | darkling: I guess I'm confused about your original question in that case |
| 19:58:39 | × | odnes quits (~odnes@5-203-254-76.pat.nym.cosmote.net) (Client Quit) |
| 19:59:03 | <Cale> | Did you have specific Haskell gadgets that you wanted a use-case for? |
| 19:59:29 | <geekosaur> | there are still jumps to be made, though. I came in knowing enough SML/NJ to be able to understand programs written in it, but laziness and IO still made for a huge jump needed |
| 19:59:29 | <dminuoso> | Cale: So thinking of lists as loops is an intution that we develop after we already understand how to use them. It's similar to "Monads are Burritos", it's an intuition that only helps if you already understand it. |
| 20:00:09 | <Cale> | dminuoso: Well, that was the conclusion of a very specific analogy I was making, though perhaps it requires examples to really get. |
| 20:00:11 | × | _ht quits (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection) |
| 20:00:17 | <Cale> | (but darkling already seems familiar) |
| 20:00:24 | <EvanR> | I knew about lazy wrappers in scheme, that made haskell not seem like a cold turkey |
| 20:00:55 | <geekosaur> | I don't think that's necessarily true, dminuoso. I mean, what do you do with a list in any language? You loop over it |
| 20:00:57 | <dminuoso> | Cale: Right, Im not sure examples really suffice. Without being very comfortable with laziness, Im not convinced most beginners would get the gist of it. |
| 20:01:03 | <geekosaur> | in Hasekll that's the whole point of a list |
| 20:01:05 | <Cale> | I will say that there are a lot of libraries of general abstract nonsense on Hackage that I would rarely or never use. |
| 20:01:44 | <Cale> | (but others that I would) |
| 20:02:00 | <darkling> | Cale: There's a lot made of the Functor/Applicative/Monad stuff, but I'm finding it hard to see where those things fit into the way I'd do things without them. |
| 20:02:10 | <dminuoso> | geekosaur: They are also very useful for other things like random access, keeping a bag of things - if your list implementation has nice asymptotics and ergonomics for that interface. |
| 20:02:29 | <Cale> | darkling: Ah, are you familiar with the general concept of a combinator library? |
| 20:02:34 | <darkling> | Maybe I just need to practice the basic language without them and then spot the patterns where they'd help reduce mess/boilerplate. |
| 20:02:38 | <dminuoso> | In Haskell they dont, which means the "loopy interface" is way more prominent, simply because you cant do much else with it if you intend to scale |
| 20:02:50 | <dminuoso> | And that might not be so obvious in other languages |
| 20:03:06 | <sm> | darkling: maybe it's a good time for a tour through some practical haskell code bases ? |
| 20:03:12 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:6c7f:24ed:3788:2a1e) (Quit: WeeChat 2.8) |
| 20:03:17 | <dminuoso> | In Haskell we actively construct lists for the purpose of deconstructing element by element, you rarely do this in most common traditional languages |
| 20:03:25 | <darkling> | Cale: Not entirely. I've brushed around the concept of combinators in (IIRC) lambda calculus, but never looked into it in detail. |
| 20:03:38 | <geekosaur> | we need an updated RWH that covers things like pandoc and hledger |
| 20:03:44 | <darkling> | I was a mathematician, not a formal computer scientist (despite lecturing as the latter). |
| 20:04:03 | <darkling> | All the CS I know is autodidactic. |
| 20:04:22 | <k`> | darkling: You could just take a look at how Text.ParserCombinators.ReadP does parsing. |
| 20:04:36 | <Cale> | darkling: Ah, this "combinator" is in a less technical sense. The idea is that you build a library where you start with a bunch of basic building block computations of some type, they may even be too simple to be useful on their own, and then you have a bunch of operations for combining them in various ways. |
| 20:05:12 | <sm> | ("practice the basic language and spot the patterns" is good too) |
| 20:05:17 | <EvanR> | code reuse in haskell is better than normal, and people blame how the basic nuts and bolts like lists and eithers are "very dumb" |
| 20:05:42 | <EvanR> | there's like no room for interpretation and so incompatible "cleverness" to proliferate |
| 20:05:46 | <Cale> | darkling: Functor/Applicative/Monad capture patterns that frequently arise when you're building libraries in that style |
| 20:06:05 | <geekosaur> | http://book.realworldhaskell.org/read/using-parsec.html |
| 20:06:14 | <geekosaur> | nice use of combinators |
| 20:06:16 | <EvanR> | darkling, I was trying to respond to your thing about boilerplate but then the phone wrong |
| 20:06:20 | <EvanR> | rang |
| 20:07:49 | <Cale> | For example, in the case of parsers, you might have a parametric type (Parser t) of parsers whose result(s) will have type t |
| 20:08:35 | <Cale> | and then that will be an instance of Functor, because if we have a function (a -> b), we can apply that function to the results of a parser of type Parser a to obtain a parser of type Parser b |
| 20:10:01 | × | bahamas quits (~lucian@84.232.141.55) (Ping timeout: 248 seconds) |
| 20:10:17 | <darkling> | If I've understood, that's the kind of thing where my immediate reaction is to first execute the Parser a to get an a, and then run the a -> b over that result. |
| 20:10:56 | <darkling> | But with the Functor, you can manipulate the Parser a directly to get the Parser b as a stand-alone thing. |
| 20:11:46 | <darkling> | So it's kind of an associative flip: transform(parse(input)) to (transform.parse)(input). |
| 20:13:16 | <Cale> | Yeah, depending on how the parser itself is encoded, it might be more or less involved. But with some of the simplest functional representations of parsers, it will be little more than function composition with a bit of dressing around it. |
| 20:14:04 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 20:14:05 | <darkling> | That puts the tool (Functor) in a much better context, where I feel I could actually use one. :) |
| 20:14:40 | <Cale> | If we look at Monad, it'll provide us with return :: a -> Parser a which will construct a parser that consumes none of the input, but immediately returns the given value as its (sole) result |
| 20:14:59 | <Cale> | as well as (>>=) :: Parser a -> (a -> Parser b) -> Parser b |
| 20:15:01 | <k`> | Then up from Functor, Applicative lets you combine the results of two parsers or make a dummy parser that produces a result purely (without consuming input). |
| 20:15:06 | <Cale> | which will take a parser that has results of type a |
| 20:15:17 | <Cale> | and a function from values of type a to parsers with results of type b |
| 20:15:52 | <Cale> | and it will glue those together in the sensible way: making a parser which runs the first parser to get a value of type a, then applies the function to decide which parser to run next, and run that on whatever is left of the input |
| 20:16:42 | <Cale> | This sort of "deciding what to do next based on the result of a previous computation" is what characterises monads in this setting. |
| 20:17:30 | <darkling> | And that's the ordering dependency that's the intuition of the do-construct? |
| 20:17:35 | <Cale> | Yeah |
| 20:18:22 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 20:19:01 | → | Guest1767 joins (~Polo@user/polo) |
| 20:19:10 | × | Guest1767 quits (~Polo@user/polo) (Client Quit) |
| 20:19:11 | <maerwald> | well, applicative also decides on what to do next, in a sense, except not for the effect flow |
| 20:19:43 | <maerwald> | just for the values |
| 20:20:07 | × | kenran quits (~kenran@200116b82b2708000a1d989028fc8790.dip.versatel-1u1.de) (Quit: WeeChat info:version) |
| 20:20:13 | <darkling> | I think I should stop now, before my brain overflows. |
| 20:20:36 | <Cale> | Yeah, you can't wholesale decide what happens next with applicative, it's just that one computation gets to decide how to transform the result of another (but both are happening regardless of the results) |
| 20:20:36 | <darkling> | But many thanks for the conversation, ladies and gentlemen. I'm sure I'll be back. |
| 20:21:22 | <darkling> | I probably need to read through this conversation again tomorrow, and see if I can advance the rest of the reading based on it. |
| 20:21:52 | <Cale> | Yeah, this is the kind of thing that really you need 5 or 10 examples before you truly get it. |
| 20:22:13 | <maerwald> | yeah... with monad you can decide which parser to pick based on the previous value, with applicative the parsers you run are pre-defined |
| 20:23:02 | <Cale> | (i.e. different whole libraries that use the same operations, but do completely different things with them) |
| 20:23:28 | → | emanon42 joins (~emanon42@103.120.19.44) |
| 20:23:30 | → | mixfix41 joins (~sdenyninn@user/mixfix41) |
| 20:25:32 | <seydar> | yo this Debug.Trace thing is pretty cool |
| 20:25:37 | <seydar> | i feel so dirty using it |
| 20:25:42 | → | gpncarl joins (~gpncarl@120.244.220.74) |
| 20:25:45 | <EvanR> | it's quite impure |
| 20:27:21 | → | jgeerds joins (~jgeerds@d53604b0.access.ecotel.net) |
| 20:29:45 | × | gpncarl quits (~gpncarl@120.244.220.74) (Ping timeout: 248 seconds) |
| 20:30:47 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:32:33 | → | Polo joins (~Polo@user/polo) |
| 20:32:36 | <Cale> | It's really useful for extracting the arguments to a pure function in the case that something is going wrong (and the arguments are hard to guess), and then from there you can work out why it's producing an incorrect result. |
| 20:33:08 | × | briandaed quits (~briandaed@109.95.142.93.r.toneticgroup.pl) (Remote host closed the connection) |
| 20:36:59 | <darkling> | There's a lot to be said for a bunch of carefully-placed printfs. :) |
| 20:39:54 | → | coot joins (~coot@213.134.190.95) |
| 20:43:10 | × | Polo quits (~Polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 20:48:04 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds) |
| 20:49:11 | <sm> | seydar: it's an essential haskell dev tool, nothing to be ashamed of. You may want to add pretty-simple or pretty-show later |
| 20:53:25 | → | teddyc joins (theodorc@cassarossa.samfundet.no) |
| 20:56:39 | <seydar> | sm: ooh, good tip, thank you |
| 20:56:47 | <seydar> | what IO does trace* write to? |
| 20:57:03 | <seydar> | it doesn't appear to be writing to stdout or stderr |
| 20:57:06 | <seydar> | unless i'm high |
| 20:57:12 | <sm> | stderr |
| 20:57:19 | <sm> | some more ideas at https://hackage.haskell.org/package/hledger-lib-1.25/docs/Hledger-Utils-Debug.html |
| 20:59:06 | <seydar> | weird, i am unable to redirect 2>&1 the way i'd expect to |
| 20:59:37 | <EvanR> | wouldn't that have no effect usually |
| 20:59:44 | <EvanR> | still prints out |
| 21:01:19 | <sm> | eh.. you're writing 2>&1 at the right place (towards the end of the command line) ? bash is weird with that |
| 21:01:48 | <geekosaur> | what exactly are you doing and what are you expecting? |
| 21:02:00 | → | Pickchea joins (~private@user/pickchea) |
| 21:02:12 | <seydar> | `ghc Encode && ./Encode cat.jpg 2>&1 hs.out` |
| 21:02:23 | <seydar> | i'm expecting my output to all go to hs.out |
| 21:02:30 | <Clint> | then you have the syntax wrong |
| 21:02:53 | <geekosaur> | first off, you did not redirect into hs,out so it won't be stdout |
| 21:03:24 | <geekosaur> | second off, 2>&1 must follow a redirection of stdout, otherwise you redirect stderr to the old stdout and then redirect stdout to a different place |
| 21:03:42 | <sm> | aHA |
| 21:03:46 | <seydar> | AHHH |
| 21:05:21 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 21:05:33 | sm | remembers a command line is a small stateful procedural program |
| 21:06:12 | × | zyklotomic quits (~ethan@res380d-128-61-84-187.res.gatech.edu) (Ping timeout: 248 seconds) |
| 21:08:06 | → | zyklotomic joins (~ethan@res388d-128-61-89-205.res.gatech.edu) |
| 21:08:37 | <seydar> | https://paste.tomsmeding.com/IXOwurpv |
| 21:08:38 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 250 seconds) |
| 21:08:47 | <seydar> | i'm getting output that i don't expect. namely, things aren't happening in the order that i'd expect |
| 21:09:02 | <seydar> | i'd expect a tuple followed by 20 floats |
| 21:09:21 | <seydar> | going from (0, 0) -> (0, 1) -> (1, 0) -> (1, 1) |
| 21:09:26 | <sm> | welcome to the wacky world of haskell lazy evaluation |
| 21:09:29 | <seydar> | but that is not at _all_ what's happening |
| 21:09:46 | <darkling> | There's no synchronisation guarantee between stdout and stderr -- both can be buffered. |
| 21:10:16 | <seydar> | darkling: that is good to know, but all relevant output here is going to STDERR, so i don't think that's the issue |
| 21:10:21 | <darkling> | You pretty much always have to interpret the two streams' outputs with a certain amount of fuzz. |
| 21:11:02 | <geekosaur> | or set NoBuffering on both |
| 21:11:20 | <darkling> | If it's all going to the same stream, then it should be properly ordered, but I guess sm's observation takes over here, and "properly ordered" still has unexpected results. |
| 21:11:44 | <seydar> | how do i make something eager? |
| 21:12:05 | <sm> | a simple way is to print it |
| 21:12:06 | <geekosaur> | not guaranteed if you did it via redirection, because each Handle is still buffered independently even if they end up writing to the same place |
| 21:12:41 | <sm> | (not trace it) |
| 21:13:29 | <seydar> | sm: dammit, now i have to copy everything and move it to an IO () function |
| 21:14:23 | <sm> | ie, using print in the IO monad. There's also `seq`, deepseq, and such like |
| 21:14:28 | <geekosaur> | also, sadly, GNU stdbuf doesn't work on haskell programs because they don't use glibc's buffering stuff |
| 21:14:56 | <sm> | when you're just debugging, the lazy ordering usually isn't a big problem, in fact it gives good insight into program execution |
| 21:15:08 | <sm> | labeling the values can help |
| 21:15:32 | <EvanR> | % let x = trace "foo" 1; y = trace "bar" 2 in (x,y) |
| 21:15:40 | <geekosaur> | no yahb still |
| 21:15:46 | <EvanR> | YAAAAAHB |
| 21:16:13 | <sm> | if you really want guaranteed definite ordered output, then that's logging and yes requires IO |
| 21:16:13 | <geekosaur> | no mniip still. hope they're enjoying their vacation or whatever |
| 21:16:30 | <geekosaur> | (hoping it's that and not, say, a hospital stay) |
| 21:17:04 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 21:17:06 | geekosaur | wonders if there are enough pieces in mniip's github to assemble a new yahb |
| 21:17:30 | <EvanR> | if tony stark dies, no one is iron man |
| 21:17:57 | <EvanR> | (spoiler alert) |
| 21:18:25 | <geekosaur> | I found the bot core there and the sandboxing stuff, but I don't think it has how to glue them together into a yahb |
| 21:19:27 | <EvanR> | mniip's biosignature unlocks a hidden vault which release autoscripts to glue all the pieces together onto them (or whoever can fake access) |
| 21:19:36 | <geekosaur> | (or even how to sandbox a ghci) |
| 21:21:28 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 21:23:55 | → | eraziel joins (~eraziel@modemcable169.17-58-74.mc.videotron.ca) |
| 21:24:03 | <seydar> | "traceShow (y, x) `seq` traceShowId bases" did not have the effect i thought it would. only the second trace statement was executed |
| 21:25:58 | <monochrom> | (Mixing up conversations) So yahb is Iron Man??!! |
| 21:27:19 | <sm> | welcome to the second level of the wacky world of haskell lazy evaluation! |
| 21:27:46 | <sm> | replace seq with $ there I think |
| 21:28:37 | <eraziel> | what's a good way to ensure a small chunk of code runs uninterrupted ? doing this right now `finally (pure ()) thingIdLikeToRunUninterrupted` |
| 21:28:50 | <eraziel> | the `pure ()` part seems off |
| 21:30:12 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 21:30:28 | <monochrom> | Yeah this one seems to be a simple misunderstanding of traceShow. Consider giving it two arguments. |
| 21:30:29 | → | tromp joins (~textual@dhcp-077-249-230-040.chello.nl) |
| 21:30:31 | <EvanR> | before you complain that yahb was autonomous and could be commanded by anybody here, iron man has automated clones |
| 21:31:34 | <monochrom> | Ooohhh!!! So yahb is Jarvis... |
| 21:32:37 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 21:32:38 | × | gensyst quits (gensyst@user/gensyst) (Quit: Leaving) |
| 21:34:20 | <seydar> | okay so it looks like all of my life's woes come from the fact that i can't get the ordering right in this list comprehension |
| 21:34:33 | <seydar> | it is ordering... non-deterministically |
| 21:35:10 | <seydar> | it is ordering deterministically according to an unknown god |
| 21:35:41 | <sm> | trace more things to see what the heck it's doing |
| 21:35:42 | <darkling> | Did you forget to feed the shoggoths? |
| 21:36:34 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 21:37:27 | <seydar> | sm: this is the result of my tracing |
| 21:37:27 | × | Katarushisu quits (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) (Quit: The Lounge - https://thelounge.chat) |
| 21:37:30 | <EvanR> | yeah don't confuse non-determinism with "not what I thought I ordered" |
| 21:38:06 | → | Katarushisu joins (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) |
| 21:38:09 | <monochrom> | Ugh list comprehension data order is orthogonal to evaluate order if that's what you mean. |
| 21:38:46 | <monochrom> | Or rather s/data order/linked list order/ |
| 21:39:20 | <seydar> | okay i don't think this is the source of my bug |
| 21:39:30 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 21:39:40 | <sm> | I'd trace more till it makes sense. Things get evaluated when needed and not before, This is often surprising to a human |
| 21:40:02 | <EvanR> | unless the human was raised by lazy wolves or something |
| 21:41:02 | <sm> | unless raised by lazy wolves 🐺 |
| 21:41:02 | <seydar> | what's that eager version of haskell called? |
| 21:41:07 | × | emanon42 quits (~emanon42@103.120.19.44) (Quit: The Lounge - https://thelounge.chat) |
| 21:41:22 | <EvanR> | purescript |
| 21:43:18 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 21:43:21 | → | emanon42 joins (~emanon42@103.120.19.44) |
| 21:43:25 | <monochrom> | sm: The context is effectless pure code that processes lists and number crunching, the observation is that the resulting numbers are wrong and/or the numbers are in a wrong order in the resulting lists. Lazy evaluation could be seen as nondeterministic but not to the point of being nondeterminitic in answers, we are not talking about unsafeInterleaveIO. |
| 21:43:30 | <seydar> | time for my favorite game: bug or floating point error |
| 21:44:10 | <EvanR> | floating point problem between chair and keyboard |
| 21:44:25 | <monochrom> | I did suggest using Debug.Trace but the purpose was to observe and check intermediate numbers, not to confuse wrong numbers with wrong evaluation order. |
| 21:44:42 | <seydar> | monochrom: this new level of hell is all thanks to Debug.Trace |
| 21:44:47 | <sm> | ah, thanks |
| 21:45:10 | <EvanR> | you realize purity was instituted because otherwise laziness would be ridiculous |
| 21:45:12 | <monochrom> | This case needs zero understanding of evaluation orders. It doesn't matter at all. |
| 21:45:56 | <EvanR> | but really Debug.Trace is really very mild in terms of side effects |
| 21:46:12 | <seydar> | monochrom: i'm coming around to that conclusion. i just had a moment of public panic |
| 21:48:27 | <dibblego> | dminuoso: show me the use-case |
| 21:49:09 | <seydar> | also you guys aren't gonna believe this but the evaluation order that i thought was crazy actually makes perfect sense |
| 21:49:17 | <dibblego> | (also, I have heard the []/Maybe argument before and after analysis, typically the claimant learns that it is not a good argument -- there are better arguments, though they also still fail) |
| 21:49:38 | → | zeenk joins (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) |
| 21:50:05 | <sm> | welcome to level 3! |
| 21:51:16 | <EvanR> | you're dangerously close to being unable to return to normal programming languages |
| 21:52:24 | <EvanR> | you can go back once you get to level 6 |
| 21:52:27 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 21:52:31 | → | Polo joins (~Polo@user/polo) |
| 21:53:05 | × | zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!) |
| 21:55:39 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 21:56:33 | × | gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 21:58:01 | <seydar> | i like the cthulu^H^H^H^H^H^Hhaskell forces you to write top-down |
| 21:58:57 | <seydar> | i'm reading some C code right now and constantly asking "what are you trying to say" |
| 21:59:04 | × | Topsi quits (~Topsi@dyndsl-037-138-064-083.ewe-ip-backbone.de) (Read error: Connection reset by peer) |
| 22:01:33 | <seydar> | ugh i hate this |
| 22:01:42 | <seydar> | all these bugs are derived from ROUNDING ERRORS |
| 22:01:50 | <seydar> | adding all these doubles! |
| 22:03:00 | × | kimjetwav quits (~user@2607:fea8:2362:b400:e8cd:c90e:aafe:7f5b) (Remote host closed the connection) |
| 22:05:33 | <apache2> | can I get show to output whitespace/indentation? |
| 22:10:49 | × | tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:11:53 | <geekosaur> | @hackage pretty-show |
| 22:11:54 | <lambdabot> | https://hackage.haskell.org/package/pretty-show |
| 22:11:56 | <geekosaur> | maybe |
| 22:11:59 | <geekosaur> | show itself, no |
| 22:14:29 | × | fendor quits (~fendor@91.141.58.225.wireless.dyn.drei.com) (Remote host closed the connection) |
| 22:14:51 | <monochrom> | `show (Just 4)` will give you a space but no indentation. |
| 22:18:14 | <EvanR> | haskell doesn't force you to write top down |
| 22:18:25 | <EvanR> | > let ppɐ = (+) in ppɐ 2 2 |
| 22:18:27 | <lambdabot> | 4 |
| 22:18:30 | <monochrom> | Yeah, that. |
| 22:18:44 | <apache2> | thanks geekosaur I'll try that |
| 22:19:00 | × | zeenk quits (~zeenk@2a02:2f04:a004:9b00:1efc:c1cf:378d:8b3d) (Quit: Konversation terminated!) |
| 22:19:13 | × | liz_ quits (~liz@host109-151-128-120.range109-151.btcentralplus.com) (Quit: Lost terminal) |
| 22:22:02 | × | Tuplanolla quits (~Tuplanoll@91-159-68-39.elisa-laajakaista.fi) (Quit: Leaving.) |
| 22:27:43 | → | Guest|99 joins (~Guest|99@217-121-250-5.cable.dynamic.v4.ziggo.nl) |
| 22:27:51 | <seydar> | my program has been deviating from the test program because apparently... they are receiving different input |
| 22:28:33 | <seydar> | i need a drink |
| 22:29:04 | × | ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 240 seconds) |
| 22:29:14 | <hpc> | there's a liquid haskell joke in there somewhere |
| 22:29:51 | <monochrom> | :) |
| 22:30:01 | <monochrom> | Liquor Haskell |
| 22:30:55 | <hpc> | monochrom: haskell needs dependent types to be a real "proof" assistant |
| 22:32:19 | ← | Guest|99 parts (~Guest|99@217-121-250-5.cable.dynamic.v4.ziggo.nl) () |
| 22:32:43 | <monochrom> | "Liquor Haskell combines dependent typing, dependent refinement typing, dependent predicate subtyping, and dependent linear typing." |
| 22:33:10 | <apache2> | :) |
| 22:33:21 | <monochrom> | "Computer science has just become a bit too technical. Let's go for a drink." -- Jay Misra |
| 22:33:22 | <maerwald[m]> | Since when is Haskell trying to become a proof assistant? |
| 22:33:42 | <apache2> | since it became alcoholic? |
| 22:33:56 | <maerwald[m]> | That sounds right |
| 22:33:59 | <maerwald[m]> | Cheers |
| 22:34:28 | <monochrom> | No no no, not proof assistant. 100-proof assistant. |
| 22:34:29 | <apache2> | isn't that a big pun on liquor/dependent (addicted)/proof(as in strong alcohol) etc? |
| 22:34:46 | <hpc> | yep |
| 22:34:50 | → | jargon joins (~jargon@174-22-206-112.phnx.qwest.net) |
| 22:34:59 | <hpc> | these aren't your usual internet puns |
| 22:35:06 | <hpc> | these are {-# LANGUAGE RecordPuns #-} |
| 22:35:29 | <hpc> | i mean, NamedFieldPuns |
| 22:35:52 | <maerwald[m]> | Isn't that just syntax cocaine? |
| 22:36:33 | <monochrom> | desugared grape juice |
| 22:37:08 | <hpc> | maerwald[m]: haskell is inspired by methamatics? :P |
| 22:37:11 | <monochrom> | and desugared malt etc |
| 22:38:03 | <monochrom> | In reality, you cannot do equational reasoning. In meth, you can. |
| 22:39:03 | <hpc> | meth: not even epsilon |
| 22:40:57 | × | Polo quits (~Polo@user/polo) (Quit: Textual IRC Client: www.textualapp.com) |
| 22:44:34 | × | teo quits (~teo@user/teo) () |
| 22:51:00 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 276 seconds) |
| 22:54:03 | × | machinedgod quits (~machinedg@24.105.81.50) (Ping timeout: 256 seconds) |
| 22:57:04 | × | hololeap_ quits (~hololeap@user/hololeap) (Ping timeout: 240 seconds) |
| 23:00:17 | → | hololeap_ joins (~hololeap@user/hololeap) |
| 23:00:20 | × | xaotuk quits (~sasha@net224-32-245-109.mbb.telenor.rs) (Ping timeout: 260 seconds) |
| 23:00:52 | × | acidjnk quits (~acidjnk@p200300d0c7068b43f1a15e75027d04fd.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
| 23:01:10 | × | stackdroid18 quits (14094@user/stackdroid) (Quit: hasta la vista... tchau!) |
| 23:07:05 | × | eraziel quits (~eraziel@modemcable169.17-58-74.mc.videotron.ca) (Quit: Client closed) |
| 23:08:35 | × | Pickchea quits (~private@user/pickchea) (Quit: Leaving) |
| 23:10:04 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 240 seconds) |
| 23:10:04 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 23:10:39 | → | malinoskj290645 joins (~malinoskj@c-68-33-26-115.hsd1.md.comcast.net) |
| 23:11:34 | × | malinoskj290645 quits (~malinoskj@c-68-33-26-115.hsd1.md.comcast.net) (Client Quit) |
| 23:11:40 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.) |
| 23:11:54 | × | chomwitt quits (~chomwitt@2a02:587:dc19:d600:6d5a:79e9:ac14:c3a8) (Ping timeout: 252 seconds) |
| 23:11:55 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 23:11:57 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 23:12:53 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 23:14:45 | → | machinedgod joins (~machinedg@24.105.81.50) |
| 23:20:16 | <seydar> | WOW i had another list comprehension that failed to grok inner- vs outer-loop variables |
| 23:20:20 | <seydar> | so... my bad |
| 23:32:36 | → | lagooned joins (~lagooned@108-208-149-42.lightspeed.hstntx.sbcglobal.net) |
| 23:34:46 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 23:41:03 | × | alp_ quits (~alp@user/alp) (Ping timeout: 252 seconds) |
| 23:43:17 | → | vicfred joins (~vicfred@user/vicfred) |
| 23:47:59 | <seydar> | this project is showing me just how poorly i know haskell and just how poorly i can read |
| 23:49:56 | × | jgeerds quits (~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds) |
| 23:54:05 | <seydar> | i'm having (Integral Double) troubles again: https://paste.tomsmeding.com/TgdvpoGl |
| 23:54:22 | <seydar> | what does it mean when it says "no instance of (Integral Double)"? |
| 23:55:47 | <seydar> | ah. as soon as I removed the `::Double` and the `round`, my problem went away |
| 23:55:54 | <seydar> | which leads me to believe that: |
| 23:55:56 | <seydar> | :t floor |
| 23:55:57 | <lambdabot> | (RealFrac a, Integral b) => a -> b |
| 23:56:20 | <seydar> | okay that doesn't mean much to me, but it feels like `floor` is already making it an Int |
| 23:57:58 | <monochrom> | But what does "limit 0 18" expect? |
| 23:59:37 | × | jao quits (~jao@211.68.17.95.dynamic.jazztel.es) (Remote host closed the connection) |
All times are in UTC on 2022-05-05.