Logs on 2023-07-07 (liberachat/#haskell)
| 00:01:00 | <ski> | .. i'm not sure how common it is to anticipate that, by naming the type `t' (and then going on to pass that module directly to a functor), rather than construct a custom wrapper ("adapter") module when instantiating the functor |
| 00:01:13 | <ski> | anyway, the (above) thought just occured to me |
| 00:01:42 | × | xff0x_ quits (~xff0x@2405:6580:b080:900:50da:9b7c:4bac:847a) (Ping timeout: 246 seconds) |
| 00:03:51 | → | xff0x_ joins (~xff0x@ai086045.d.east.v6connect.net) |
| 00:04:28 | → | inversed joins (~inversed@bcdcac82.skybroadband.com) |
| 00:05:14 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 00:06:38 | → | bontaq joins (~user@ool-45779b84.dyn.optonline.net) |
| 00:06:43 | → | sagax joins (~sagax_nb@user/sagax) |
| 00:09:34 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 00:13:39 | → | califax joins (~califax@user/califx) |
| 00:14:34 | → | falafel joins (~falafel@2603-7000-a700-8710-eb2d-b2d5-726c-ab42.res6.spectrum.com) |
| 00:25:48 | × | ddellacosta quits (~ddellacos@146.70.166.152) (Ping timeout: 240 seconds) |
| 00:26:26 | × | connrs quits (~connrs@user/connrs) (Read error: Connection reset by peer) |
| 00:27:31 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 00:27:55 | → | ddellacosta joins (~ddellacos@146.70.168.100) |
| 00:29:05 | → | connrs joins (~connrs@user/connrs) |
| 00:31:48 | → | EvanR_ joins (~EvanR@user/evanr) |
| 00:32:04 | → | notzmv joins (~zmv@user/notzmv) |
| 00:32:16 | × | EvanR quits (~EvanR@user/evanr) (Read error: Connection reset by peer) |
| 00:33:28 | × | waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 240 seconds) |
| 00:35:02 | × | caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline) |
| 00:39:37 | EvanR_ | is now known as EvanR |
| 00:40:41 | × | lainon quits (~textual@c-98-54-78-2.hsd1.al.comcast.net) (Quit: My Mac has gone to sleep. ZZZzzz…) |
| 00:40:52 | → | thegeekinside joins (~thegeekin@189.217.90.138) |
| 00:41:05 | → | dmgk joins (~dmgk@user/dmgk) |
| 00:42:33 | <EvanR> | the extension LexicalNegation seems to mess with the lexer |
| 00:42:51 | <EvanR> | everything I know is wrong now |
| 00:43:14 | <Axman6> | Welcome to the future |
| 00:44:12 | → | Inst_ joins (~Inst@2601:6c4:4081:2fc0:1933:a56d:b98f:3d34) |
| 00:48:02 | × | Inst__ quits (~Inst@2601:6c4:4081:2fc0:44fe:e619:5fe8:5723) (Ping timeout: 246 seconds) |
| 00:51:41 | × | thegeekinside quits (~thegeekin@189.217.90.138) (Ping timeout: 245 seconds) |
| 00:55:03 | <jackdk> | record dot syntax will also change the lexing of what would otherwise be an operator followed by an identifier |
| 00:57:41 | <geekosaur> | even ExplicitForAll changes the lexer |
| 00:59:57 | → | priesvitne_sklo joins (~priesvitn@109-230-60-22.dynamic.orange.sk) |
| 01:01:54 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds) |
| 01:02:31 | × | inversed quits (~inversed@bcdcac82.skybroadband.com) (Ping timeout: 245 seconds) |
| 01:03:10 | ← | delYsid` parts (~user@84-115-138-74.cable.dynamic.surfer.at) (ERC 5.6-git (IRC client for GNU Emacs 30.0.50)) |
| 01:08:21 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 245 seconds) |
| 01:08:28 | <Axman6> | What even is a token??? Nobody knows |
| 01:10:32 | × | albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection) |
| 01:10:37 | <Axman6> | So WAI has Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived, there isn't much sodumentation about what you should do with the response function, but it feels to me like it really should be treated as a linear argument, it should only be called once. is that something that can be done with current linear types? |
| 01:11:41 | <Axman6> | Request -> (Response -> IO ResponseReceived) %1 -> IO ResponseReceived? |
| 01:14:27 | × | Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Quit: Leaving.) |
| 01:16:40 | → | albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8) |
| 01:18:11 | <EvanR> | are you sure, because there's more things in heaven and middleware than are dreamt of in your philosophy |
| 01:19:18 | <Axman6> | I think it should always be the case that the response handler is only called once, even when middleware is involved, as it can wrap the passed in handler in a new function which itself is only called once |
| 01:20:12 | <jackdk> | I think under this model you have `type Middleware = Application %1 -> Application`, so you consume the old respond function and provide a new one. |
| 01:20:47 | <Axman6> | yeah that feels right |
| 01:22:03 | → | bilegeek joins (~bilegeek@2600:1008:b092:dfba:4ead:a88d:cd60:d095) |
| 01:25:08 | <EvanR> | are you required to use the response function |
| 01:26:12 | <EvanR> | or is it more of a continuation |
| 01:26:24 | × | priesvitne_sklo quits (~priesvitn@109-230-60-22.dynamic.orange.sk) (Ping timeout: 246 seconds) |
| 01:33:24 | × | bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Ping timeout: 246 seconds) |
| 01:35:43 | <Axman6> | it's the only way to create a ResponseReceived, so yes |
| 01:41:29 | <jackdk> | I believe it was done to avoid a rank-2 type, and the constructor is hard to find (not impossible, but you shouldn't go using it if you're writing an application) |
| 01:54:03 | × | xff0x_ quits (~xff0x@ai086045.d.east.v6connect.net) (Ping timeout: 246 seconds) |
| 02:00:44 | × | phma quits (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) (Read error: Connection reset by peer) |
| 02:01:07 | → | phma joins (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) |
| 02:08:40 | → | eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) |
| 02:10:21 | × | jargon quits (~jargon@184.101.73.95) (Remote host closed the connection) |
| 02:12:57 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 246 seconds) |
| 02:14:38 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
| 02:14:38 | → | finn_elija joins (~finn_elij@user/finn-elija/x-0085643) |
| 02:14:39 | finn_elija | is now known as FinnElija |
| 02:16:34 | → | nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net) |
| 02:17:59 | × | td_ quits (~td@i53870936.versanet.de) (Ping timeout: 246 seconds) |
| 02:19:34 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 02:19:52 | → | td_ joins (~td@i5387091B.versanet.de) |
| 02:28:35 | → | trev joins (~trev@user/trev) |
| 02:29:33 | × | phma quits (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) (Read error: Connection reset by peer) |
| 02:30:05 | → | phma joins (~phma@host-67-44-208-87.hnremote.net) |
| 02:42:48 | → | xff0x_ joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
| 02:42:57 | × | terrorjack quits (~terrorjac@2a01:4f8:c17:87f8::) (Quit: The Lounge - https://thelounge.chat) |
| 02:46:22 | → | terrorjack joins (~terrorjac@2a01:4f8:c17:87f8::) |
| 02:52:01 | <talismanick> | How difficult is it to learn/use Shake if you use Cabal and not Stack? |
| 02:52:57 | <talismanick> | (I prefer Cabal because it's less restrictive wrt one-off libraries that don't fit neatly into Stackage releases) |
| 02:53:16 | → | justsomeguy joins (~justsomeg@user/justsomeguy) |
| 02:58:02 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 03:02:13 | <jackdk> | As easy as any other hackage package. I have a few internal work projects built upon shake. |
| 03:03:10 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 03:03:21 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 245 seconds) |
| 03:05:36 | → | mei joins (~mei@user/mei) |
| 03:07:14 | × | fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 03:11:01 | <EvanR> | in the docs for Data.Scientific I find this warning |
| 03:11:18 | <EvanR> | WARNING: 'coefficient' and 'base10exponent' violate substantivity of 'Eq'. |
| 03:11:40 | <EvanR> | that was close, now what does substantivity mean |
| 03:12:55 | <EvanR> | oh, there's an example demonstrating the phenomenon |
| 03:16:29 | <EvanR> | they observe a difference in two scientifics that might report equal according to == |
| 03:18:53 | × | nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 246 seconds) |
| 03:24:38 | <sm> | talismanick: I think there's no real connection.. unless you are making your shake file a cabal or stack script ? |
| 03:25:31 | <sm> | and that doesn't affect Shake's learnability |
| 03:30:35 | <Axman6> | EvanR: is that because it doesn't make an effort to find the minimal mantissa? |
| 03:31:47 | <EvanR> | something about the internal representation will be normalized when pretty printed or by toDecimalDigits |
| 03:32:11 | <EvanR> | otherwise mantissa might have trailing zeros |
| 03:35:33 | <Axman6> | so 123*10^-3 === 12300*10^-5? (pretty sure those are bout 1.23?) |
| 03:35:37 | <Axman6> | both* |
| 03:36:05 | <EvanR> | they look equal to me |
| 03:36:30 | <Axman6> | but it doesn't normalise the latter into the former right? |
| 03:36:55 | <EvanR> | according to the docs if you're messing with the internal representation, no |
| 03:37:19 | <EvanR> | not after every operation like Rational |
| 03:48:48 | ← | aniketd[m] parts (~aniketdma@2001:470:69fc:105::dede) () |
| 03:49:11 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 245 seconds) |
| 03:49:58 | → | aniketd[m] joins (~aniketdma@2001:470:69fc:105::dede) |
| 03:50:04 | → | jargon joins (~jargon@184.101.73.95) |
| 03:53:41 | × | aforemny_ quits (~aforemny@2001:9e8:6ce6:ca00:3bad:e307:8f54:4c53) (Ping timeout: 246 seconds) |
| 03:54:02 | → | aforemny joins (~aforemny@i59F516EE.versanet.de) |
| 04:05:53 | <Axman6> | man, python's coroutines make me feel very unconfortable, they feel so hacky |
| 04:12:32 | × | son0p quits (~ff@181.136.122.143) (Ping timeout: 250 seconds) |
| 04:12:51 | × | robertm quits (robertm@lattice.rojoma.com) (Quit: WeeChat 3.8) |
| 04:14:42 | → | _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
| 04:15:11 | → | robertm joins (robertm@lattice.rojoma.com) |
| 04:16:48 | → | oo_miguel joins (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) |
| 04:32:17 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
| 04:34:28 | × | hololeap quits (~quassel@user/hololeap) (Quit: Bye) |
| 04:36:47 | → | hololeap joins (~quassel@user/hololeap) |
| 04:48:59 | × | jargon quits (~jargon@184.101.73.95) (Remote host closed the connection) |
| 04:53:33 | → | misterfish joins (~misterfis@84-53-85-146.bbserv.nl) |
| 04:59:37 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 05:07:44 | → | jargon joins (~jargon@184.101.73.95) |
| 05:07:54 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 05:08:21 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 05:09:00 | → | azimut_ joins (~azimut@gateway/tor-sasl/azimut) |
| 05:09:20 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 05:09:28 | → | michalz joins (~michalz@185.246.207.203) |
| 05:10:39 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 05:14:06 | <probie> | Axman6: The "new" ones using await (e.g. asyncio), or the old ones sending values to generators (as described in PEP-342)? |
| 05:16:35 | <maerwald[m]> | https://discourse.haskell.org/t/rfc-bumping-recommended-ghc-to-9-4-5-in-ghcup/6866 |
| 05:16:55 | × | Buggys quits (Buggys@shelltalk.net) (Ping timeout: 246 seconds) |
| 05:21:31 | × | stilgart quits (~Christoph@chezlefab.net) (Quit: leaving) |
| 05:21:42 | → | stilgart joins (~Christoph@chezlefab.net) |
| 05:26:04 | → | Buggys joins (Buggys@Buggy.shelltalk.net) |
| 05:27:03 | → | harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) |
| 05:29:46 | → | praknak joins (~praknak@bcdcac82.skybroadband.com) |
| 05:33:51 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds) |
| 05:40:14 | × | _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection) |
| 05:43:02 | → | Guest5320 joins (~finn@176-151-21-224.abo.bbox.fr) |
| 06:04:32 | × | bilegeek quits (~bilegeek@2600:1008:b092:dfba:4ead:a88d:cd60:d095) (Quit: Leaving) |
| 06:08:06 | → | genieliu joins (~jianshili@36.112.90.53) |
| 06:13:51 | → | coot joins (~coot@89-69-206-216.dynamic.chello.pl) |
| 06:17:15 | × | Guest5320 quits (~finn@176-151-21-224.abo.bbox.fr) (Ping timeout: 246 seconds) |
| 06:18:18 | × | misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 246 seconds) |
| 06:22:02 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:22:22 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 260 seconds) |
| 06:23:50 | × | hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 250 seconds) |
| 06:24:07 | → | son0p joins (~ff@181.136.122.143) |
| 06:29:59 | × | son0p quits (~ff@181.136.122.143) (Ping timeout: 246 seconds) |
| 06:30:11 | → | Guest5320 joins (~finn@176-151-21-224.abo.bbox.fr) |
| 06:37:17 | → | fendor joins (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) |
| 06:45:48 | → | hugo joins (znc@verdigris.lysator.liu.se) |
| 06:47:54 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 06:57:15 | → | gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) |
| 06:59:02 | × | falafel quits (~falafel@2603-7000-a700-8710-eb2d-b2d5-726c-ab42.res6.spectrum.com) (Ping timeout: 246 seconds) |
| 07:00:18 | → | alternateved joins (~user@77-254-166-50.dynamic.inetia.pl) |
| 07:02:45 | → | fweht joins (uid404746@id-404746.lymington.irccloud.com) |
| 07:05:23 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection) |
| 07:14:50 | × | genieliu quits (~jianshili@36.112.90.53) (Quit: Lost terminal) |
| 07:17:16 | → | gmg joins (~user@user/gehmehgeh) |
| 07:18:33 | → | mbuf joins (~Shakthi@49.207.178.186) |
| 07:21:47 | × | actioninja6 quits (~actioninj@user/actioninja) (Ping timeout: 246 seconds) |
| 07:23:31 | → | titibandit joins (~titibandi@user/titibandit) |
| 07:24:55 | × | ft quits (~ft@p508db151.dip0.t-ipconnect.de) (Quit: leaving) |
| 07:25:26 | → | priesvitne_sklo joins (~priesvitn@109-230-60-22.dynamic.orange.sk) |
| 07:25:36 | → | actioninja6 joins (~actioninj@user/actioninja) |
| 07:25:45 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 07:28:04 | <Axman6> | probie: I'm going to say both |
| 07:34:36 | × | shriekingnoise quits (~shrieking@186.137.175.87) (Ping timeout: 245 seconds) |
| 07:34:58 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 07:36:02 | × | harveypwca quits (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving) |
| 07:36:55 | × | gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Read error: Connection reset by peer) |
| 07:38:59 | → | Pickchea joins (~private@user/pickchea) |
| 07:42:33 | → | hisa38779 joins (~hisa38@104-181-102-238.lightspeed.wepbfl.sbcglobal.net) |
| 07:44:01 | → | acidjnk joins (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) |
| 07:44:03 | × | hisa3877 quits (~hisa38@104-181-102-238.lightspeed.wepbfl.sbcglobal.net) (Ping timeout: 246 seconds) |
| 07:44:03 | hisa38779 | is now known as hisa3877 |
| 07:45:50 | × | Pickchea quits (~private@user/pickchea) (Quit: Leaving) |
| 07:48:43 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Remote host closed the connection) |
| 07:50:08 | → | misterfish joins (~misterfis@87.215.131.102) |
| 07:52:54 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 08:09:32 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 08:16:49 | × | alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Remote host closed the connection) |
| 08:18:36 | → | ubert joins (~Thunderbi@2a02:8109:abc0:6434:2722:db0d:9dca:9984) |
| 08:20:00 | → | alternateved joins (~user@77-254-166-50.dynamic.inetia.pl) |
| 08:21:45 | → | Sgeo_ joins (~Sgeo@user/sgeo) |
| 08:21:52 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 08:25:12 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 08:25:25 | → | danse-nr3_ joins (~francesco@151.57.190.75) |
| 08:25:31 | × | econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
| 08:26:01 | → | gmg joins (~user@user/gehmehgeh) |
| 08:27:48 | <dminuoso_> | Axman6: I finally figured out whats wrong with python coroutines. |
| 08:28:08 | <dminuoso_> | Python coroutines are in truth just an implementation detail of green threads. |
| 08:30:07 | × | priesvitne_sklo quits (~priesvitn@109-230-60-22.dynamic.orange.sk) (Remote host closed the connection) |
| 08:30:21 | <dminuoso_> | There's so many red herrings around asyncio. The core theme is to facilitate efficient green thread scheduling on things that wait on external resources. |
| 08:31:10 | <dminuoso_> | I mean Haskell has all of python asyncio built-in to GHC RTS + STM |
| 08:32:15 | <dminuoso_> | Well, and some of `async` library for some of the thread coordination stuff. |
| 08:35:17 | → | mmhat joins (~mmh@p200300f1c716433cee086bfffe095315.dip0.t-ipconnect.de) |
| 08:39:21 | × | danse-nr3_ quits (~francesco@151.57.190.75) (Ping timeout: 246 seconds) |
| 08:40:09 | × | tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz) |
| 08:43:07 | × | bliminse quits (~bliminse@user/bliminse) (Quit: leaving) |
| 08:49:48 | → | son0p joins (~ff@181.136.122.143) |
| 08:52:40 | → | danse-nr3_ joins (~francesco@151.57.190.75) |
| 08:53:00 | → | Tuplanolla joins (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) |
| 09:00:07 | dminuoso_ | is now known as dminuoso |
| 09:00:28 | × | Sgeo_ quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 09:02:49 | → | gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) |
| 09:09:35 | × | DustinStiles[m] quits (~duwstiles@2001:470:69fc:105::3:699b) (Remote host closed the connection) |
| 09:11:10 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 09:12:02 | × | polykernel[m] quits (~polykerne@user/polykernel) (Remote host closed the connection) |
| 09:12:54 | → | gtf joins (~gideon@2a02:8012:2259:0:299:560e:70f9:4290) |
| 09:14:56 | → | barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) |
| 09:18:07 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection) |
| 09:26:56 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 09:27:56 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 245 seconds) |
| 09:28:16 | Lord_of_Life_ | is now known as Lord_of_Life |
| 09:32:58 | × | azimut_ quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 09:41:22 | → | gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
| 09:42:08 | × | fendor quits (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) (Remote host closed the connection) |
| 09:43:49 | → | fendor joins (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) |
| 09:45:50 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds) |
| 10:02:56 | × | xff0x_ quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 245 seconds) |
| 10:04:39 | → | waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) |
| 10:06:08 | × | tcard_ quits (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Quit: Leaving) |
| 10:07:47 | → | tcard joins (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) |
| 10:09:26 | → | Pickchea joins (~private@user/pickchea) |
| 10:10:07 | × | danse-nr3_ quits (~francesco@151.57.190.75) (Remote host closed the connection) |
| 10:13:38 | × | barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed) |
| 10:15:27 | → | danse-nr3_ joins (~francesco@151.57.190.75) |
| 10:15:57 | → | barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) |
| 10:16:21 | → | dsrt^ joins (~cd@24.125.210.85) |
| 10:18:38 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 10:19:37 | × | driib quits (~driib@vmi931078.contaboserver.net) (Quit: The Lounge - https://thelounge.chat) |
| 10:20:04 | → | driib joins (~driib@vmi931078.contaboserver.net) |
| 10:23:05 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Ping timeout: 246 seconds) |
| 10:25:35 | → | azr4e1 joins (~azr4e1@host86-134-72-140.range86-134.btcentralplus.com) |
| 10:25:38 | × | azr4e1 quits (~azr4e1@host86-134-72-140.range86-134.btcentralplus.com) (Remote host closed the connection) |
| 10:37:28 | × | barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed) |
| 10:39:36 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 245 seconds) |
| 10:42:26 | → | Lewix joins (uid158496@id-158496.tinside.irccloud.com) |
| 10:42:32 | <Lewix> | hi all |
| 10:42:36 | <Lewix> | is free node still alive? |
| 10:43:29 | <Lewix> | I need to learn Haskell pretty fast, any advice that point me to the right direction would be appreciated. I'm a huge fan of functional programming but have not used it for years. |
| 10:44:56 | <danse-nr3_> | been writing haskell for years and still have not learned it |
| 10:46:02 | <tomsmeding> | Lewix: https://www.haskell.org/documentation/ is not very opinionated but perhaps a good start |
| 10:49:58 | <Lewix> | @danse-nr3_ that is very encouraging :) |
| 10:49:58 | <lambdabot> | Unknown command, try @list |
| 10:50:19 | <Lewix> | @tomsmeding thank you man |
| 10:50:19 | <lambdabot> | Unknown command, try @list |
| 10:50:33 | <Lewix> | danse-nr3_: that is very encouraging :) |
| 10:50:39 | <Lewix> | tomsmeding: thank you man! |
| 10:51:10 | × | fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 10:51:52 | <danse-nr3_> | apologies, was an indirect advice about setting expectations and the "need" requirement. The value-level language, focusing on pure code, is quite consistent and in my opinion one can get a long way by approaching it |
| 10:52:32 | <Lewix> | tomsmeding: any video lecture that you enjoyed or would recommend? |
| 10:52:38 | <Lewix> | danse-nr3_: noted. It's all good |
| 10:57:15 | <juri_> | Lewix: it depends how you learn. i learn by doing, so more doing works. :) |
| 10:57:27 | tomsmeding | is same as juri_ |
| 10:57:42 | <tomsmeding> | find something you like building, and try to do it well |
| 10:58:13 | <tomsmeding> | depending on your level, some of the slides here are nice https://uu-afp.github.io/schedule.html |
| 10:58:53 | <Rembane> | Lewix: Also, come back here and ask questions whenever you get stuck! |
| 10:59:50 | <probie> | If I write something which uses backpack, and upload it to hackage, will things for users break beyond the haddock docs? |
| 11:01:45 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 11:02:34 | → | gmg joins (~user@user/gehmehgeh) |
| 11:02:35 | → | merijn joins (~merijn@097-099-045-062.dynamic.caiway.nl) |
| 11:13:36 | → | bontaq joins (~user@ool-45779b84.dyn.optonline.net) |
| 11:14:32 | <maerwald[m]> | probie: stack users won't be able to use it |
| 11:15:08 | × | hpc quits (~juzz@ip98-169-35-163.dc.dc.cox.net) (Ping timeout: 240 seconds) |
| 11:17:19 | → | hpc joins (~juzz@ip98-169-35-163.dc.dc.cox.net) |
| 11:20:25 | <dminuoso> | And depending on how much backpack you use, it can greatly limit the people capable or willing to work on your library. |
| 11:23:12 | <probie> | dminuoso: That doesn't bother me. If they're not interested in it, they're not interested in it. Any library I write is non-proselytising |
| 11:26:20 | <Lewix> | Also any resources to prepare for interview with Haskell is more than welcome |
| 11:26:23 | × | smalltalkman quits (uid545680@id-545680.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
| 11:26:28 | <Lewix> | Rembane: thank you |
| 11:28:47 | <probie> | maerwald[m]: I thought stack uses cabal under the hood. Are there any issues if the libraries depended on are the implementation of backpack signatures? |
| 11:30:37 | → | slaydr joins (~slaydr@2601:1c2:980:4ea0::43b3) |
| 11:33:09 | → | hippoid joins (~hippoid@user/hippoid) |
| 11:33:47 | × | ryantrinkle quits (~ryantrink@89.247.249.243) (Ping timeout: 246 seconds) |
| 11:37:10 | <merijn> | probie: https://gist.github.com/merijn/8152d561fb8b011f9313c48d876ceb07 |
| 11:37:50 | merijn | increases the value of his "time saved on explaining the different meanings of cabal"-counter |
| 11:39:36 | × | danse-nr3_ quits (~francesco@151.57.190.75) (Ping timeout: 245 seconds) |
| 11:40:12 | × | hippoid quits (~hippoid@user/hippoid) (Quit: WeeChat 3.8) |
| 11:40:57 | × | Pickchea quits (~private@user/pickchea) (Quit: Leaving) |
| 11:42:28 | × | pandeyan quits (~pandeyan@135-180-53-134.fiber.dynamic.sonic.net) (Quit: ZNC 1.8.2 - https://znc.in) |
| 11:45:25 | <probie> | That failed to answer my question, probably because I'm not particularly bright |
| 11:46:12 | <probie> | but my current guess is that if there exists package X that's a dependency, whether X uses backpack or not is irrelevant to whether or not stack can install it |
| 11:46:24 | → | anpad joins (~pandeyan@user/anpad) |
| 11:46:39 | <Rembane> | probie: I know way too little about Stack + backpack, but there's a very long thread about it here: https://github.com/commercialhaskell/stack/issues/2540 |
| 11:47:06 | <probie> | in which case "stack users won't be able to use it" seems wrong. It seems like all they won't be able to do is instantiate backpack sigs |
| 11:50:19 | → | danse-nr3_ joins (~francesco@151.57.190.75) |
| 11:53:01 | → | notzmv joins (~zmv@user/notzmv) |
| 11:54:22 | <dminuoso> | probie: Oh its not necessarily about proselytising, but rather about maintenance and ownership. |
| 11:54:42 | <dminuoso> | The more exotic the tools used to build the product, the less people will contribute or be able to pick it up later on. |
| 11:54:53 | <dminuoso> | I know, in this channel this is a heretic thing to say. |
| 11:55:41 | <dminuoso> | It's much more fun to compile to categories with dependent types, using highly undocumented cabal features.. |
| 11:56:40 | → | dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net) |
| 11:57:22 | <tomsmeding> | and use TH in the process |
| 12:09:05 | → | barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) |
| 12:11:47 | → | xff0x_ joins (~xff0x@ai086045.d.east.v6connect.net) |
| 12:13:27 | → | fweht joins (uid404746@id-404746.lymington.irccloud.com) |
| 12:16:14 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 12:25:56 | → | smalltalkman joins (uid545680@id-545680.hampstead.irccloud.com) |
| 12:26:38 | × | danse-nr3_ quits (~francesco@151.57.190.75) (Read error: Connection reset by peer) |
| 12:26:51 | → | danse-nr3_ joins (~francesco@151.57.136.214) |
| 12:40:04 | → | [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 12:46:17 | × | slaydr quits (~slaydr@2601:1c2:980:4ea0::43b3) (Read error: Connection reset by peer) |
| 12:46:47 | × | Guest5320 quits (~finn@176-151-21-224.abo.bbox.fr) (Ping timeout: 264 seconds) |
| 12:48:22 | <jackdk> | hasn't backpack been out for yonks though? |
| 12:49:18 | <merijn> | jackdk: Yes |
| 12:49:24 | <merijn> | probably close to a decade or longer |
| 12:57:34 | → | ft joins (~ft@p508db151.dip0.t-ipconnect.de) |
| 12:59:39 | → | pyooque joins (~puke@user/puke) |
| 12:59:39 | puke | is now known as Guest8530 |
| 12:59:39 | × | Guest8530 quits (~puke@user/puke) (Killed (platinum.libera.chat (Nickname regained by services))) |
| 12:59:39 | pyooque | is now known as puke |
| 13:18:07 | × | gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.1) |
| 13:24:08 | → | Zambyte joins (~user@c-73-114-31-74.hsd1.ma.comcast.net) |
| 13:24:36 | → | wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com) |
| 13:24:36 | × | wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host) |
| 13:24:36 | → | wroathe joins (~wroathe@user/wroathe) |
| 13:24:50 | <Profpatsch> | I want to replace a bunch of allocation bracket functions with a single ResourceT block |
| 13:26:03 | <Profpatsch> | is ResourceT.allocate forkIO killThread a viable way to wrap a thread that has a sub-task which does not need cleanup itself? |
| 13:36:55 | → | comerijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 13:38:28 | × | kimiamania6 quits (~681cf57f@user/kimiamania) (Quit: PegeLinux) |
| 13:39:09 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 13:39:51 | → | kimiamania6 joins (~681cf57f@user/kimiamania) |
| 13:39:56 | × | merijn quits (~merijn@097-099-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 13:40:15 | <Profpatsch> | Hm, seems to work |
| 13:40:28 | <Profpatsch> | (it’s just for a dumb heartbeat log output) |
| 13:47:58 | × | barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed) |
| 13:55:16 | <Inst_> | bleh, going back to translating "Big Book of Small Python Projects" into Haskell |
| 13:56:12 | <Inst_> | i'm trying to do a vigniere cipher, but via HOF instead of manual recursion |
| 13:57:14 | <Inst_> | ehh, the probable solution is foldr |
| 13:58:51 | → | barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) |
| 14:00:05 | <int-e> | zipWith and cycle? |
| 14:02:38 | → | lainon joins (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) |
| 14:03:37 | × | lainon quits (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) (Client Quit) |
| 14:08:00 | <tomsmeding> | ^ |
| 14:14:49 | × | jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Quit: ZNC - https://znc.in) |
| 14:17:06 | × | juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 245 seconds) |
| 14:18:01 | <Profpatsch> | Hm, is there any multiplication that can determine wraparound on Iont? |
| 14:18:03 | <Profpatsch> | *Int? |
| 14:18:13 | <Profpatsch> | Maybe a newtype that throws an exception? |
| 14:19:19 | → | jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) |
| 14:23:15 | → | Midjak joins (~Midjak@82.66.147.146) |
| 14:24:41 | <c_wraith> | I suppose you could do that, but detecting it in ways that aren't architecture-specific is an incredible slowdown. |
| 14:26:00 | <Profpatsch> | I just had to double and checked whether the result is smaller, which should be pretty easy |
| 14:26:05 | <Profpatsch> | It’s not a tight loop anyway |
| 14:26:37 | <Profpatsch> | Kind of a weird excercise anyway dunno why I’m spending time on this lol |
| 14:26:44 | <Profpatsch> | Mostly out of interest I guess |
| 14:28:15 | <c_wraith> | the most general way to detect it is look for the sign of the output being wrong. |
| 14:28:57 | <c_wraith> | add two positive numbers and get a negative? multiply a negative number by a positive number and get a positive? |
| 14:28:59 | → | juri_ joins (~juri@84-19-175-187.pool.ovpn.com) |
| 14:29:03 | → | thegeekinside joins (~thegeekin@189.217.90.138) |
| 14:33:19 | → | Arima_Kun joins (~Arima_Kun@45.124.5.97) |
| 14:33:57 | × | waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 245 seconds) |
| 14:36:34 | × | misterfish quits (~misterfis@87.215.131.102) (Ping timeout: 260 seconds) |
| 14:36:44 | × | Arima_Kun quits (~Arima_Kun@45.124.5.97) (Client Quit) |
| 14:37:02 | → | ripspin joins (~chatzilla@1.145.156.103) |
| 14:41:52 | <Inst_> | int-e: i'm trying to skip non-alphanumerical characters |
| 14:47:33 | × | juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 246 seconds) |
| 14:52:09 | × | jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Quit: ZNC - https://znc.in) |
| 14:54:01 | → | jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) |
| 14:57:57 | × | jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Client Quit) |
| 14:59:27 | → | juri_ joins (~juri@84-19-175-187.pool.ovpn.com) |
| 15:00:25 | → | shriekingnoise joins (~shrieking@186.137.175.87) |
| 15:02:20 | <EvanR> | perform the operation on an intermediate Integer and check the "actual result" for overflow xD |
| 15:04:14 | <EvanR> | Inst_, span and break? |
| 15:09:01 | <janus> | anybody at munihac? i landed a bit late, not sure where people are now |
| 15:11:18 | × | barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed) |
| 15:13:12 | → | barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) |
| 15:17:12 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) |
| 15:21:29 | × | bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Remote host closed the connection) |
| 15:21:46 | <Inst_> | is there a better way to do it? |
| 15:22:11 | <Inst_> | i mean, i'm pretty satisfied with using foldr on the cycled key |
| 15:22:33 | <EvanR> | in a sense foldr can do anything |
| 15:22:37 | <Inst_> | and using right fold as left fold |
| 15:23:14 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 15:23:15 | × | acidjnk quits (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) (Ping timeout: 246 seconds) |
| 15:23:20 | × | alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Ping timeout: 250 seconds) |
| 15:23:50 | → | gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
| 15:23:55 | <Inst_> | so you have an outside accumulator that's the actual text, and the cycled key as what's being folded over, with the lambda being keyed to process the accumulator |
| 15:24:05 | <Inst_> | mildly annoyed that foldr1 doesn't work with this |
| 15:25:32 | <EvanR> | if you're talking about accumulators then you probably (a form of) foldl |
| 15:25:39 | <EvanR> | probably want* |
| 15:25:52 | <Inst_> | iirc you can't use an outside accumulator... |
| 15:26:03 | <EvanR> | what does that mean |
| 15:26:26 | <Inst_> | well, i think you can do it that way |
| 15:27:15 | <Inst_> | you know the foldr trick wherein you have (foldr fun (const foo) list1 list2), right? |
| 15:27:27 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Ping timeout: 246 seconds) |
| 15:27:50 | <Inst_> | well tbh maybe i can exploit laziness and the fact that seq won't force the evaluation beneath a tuple |
| 15:27:53 | <EvanR> | no but that's looks groovy before I've had coffee |
| 15:28:25 | → | nick4 joins (~nick@2600:8807:9084:7800:6937:8c50:52d4:31ba) |
| 15:28:51 | <Inst_> | so i can still have an infinite list with seq, just it can't be on the top level, right? |
| 15:28:51 | <EvanR> | if you have 2 parallel accumulators that's just a foldl using a tuple |
| 15:29:35 | <Inst_> | iirc even if you seq a list, it won't trigger a bottom, right? You'd need force from deepseq to trigger a bottom from an infinite list? |
| 15:29:44 | <geekosaur> | yes |
| 15:29:51 | <geekosaur> | `seq` is only to WHNF |
| 15:30:14 | <EvanR> | > [undefined] `seq` '👍' |
| 15:30:16 | <lambdabot> | '\128077' |
| 15:32:34 | <Inst_> | but tbh foldr stil lworks better if i'm working with lists, no? |
| 15:33:01 | <Inst_> | since the foldr can lazily generate the list, whereas foldl' will have to complete the list before it can produce any output? |
| 15:33:03 | <EvanR> | foldr is pretty bad when adding up a list for example |
| 15:33:15 | <EvanR> | unless you're scanning for all intermediate sums |
| 15:33:22 | <Inst_> | i mean foldr (:) is performant, no? |
| 15:33:30 | <Inst_> | foldr (:) [] |
| 15:33:36 | <EvanR> | that's lazy |
| 15:33:47 | <EvanR> | which is good |
| 15:34:49 | <EvanR> | foldl and foldl' don't work on infinite lists |
| 15:35:15 | <Inst_> | the problem is that i don't feel like map is powerful enough for it, i.e, there's an implicitly mutating accumulator here |
| 15:35:26 | <EvanR> | :t mapAccum |
| 15:35:26 | <Inst_> | was looking at map accum, but not familiar with it, was thinking scanr / scanl, but not used to it |
| 15:35:27 | <lambdabot> | error: |
| 15:35:27 | <lambdabot> | • Variable not in scope: mapAccum |
| 15:35:27 | <lambdabot> | • Perhaps you meant one of these: |
| 15:35:31 | <EvanR> | :t mapAccumR |
| 15:35:32 | <lambdabot> | Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) |
| 15:35:50 | <EvanR> | :t mapAccumL |
| 15:35:51 | <lambdabot> | Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) |
| 15:36:18 | <EvanR> | it's map with an accumulator |
| 15:36:47 | <Inst_> | maybe mapaccum is the best solution here |
| 15:37:27 | → | econo_ joins (uid147250@id-147250.tinside.irccloud.com) |
| 15:38:58 | → | bontaq joins (~user@ool-45779b84.dyn.optonline.net) |
| 15:39:59 | × | mmhat quits (~mmh@p200300f1c716433cee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 4.0.1) |
| 15:40:20 | × | titibandit quits (~titibandi@user/titibandit) (Remote host closed the connection) |
| 15:41:27 | × | juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 246 seconds) |
| 15:42:28 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 15:49:14 | → | JanusTroelsen[m] joins (~janustmat@2001:470:69fc:105::3:7e89) |
| 15:53:18 | → | juri_ joins (~juri@84-19-175-187.pool.ovpn.com) |
| 15:54:13 | × | danse-nr3_ quits (~francesco@151.57.136.214) (Read error: Connection reset by peer) |
| 16:00:29 | × | nick4 quits (~nick@2600:8807:9084:7800:6937:8c50:52d4:31ba) (Ping timeout: 246 seconds) |
| 16:00:51 | × | dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 245 seconds) |
| 16:00:56 | <ski> | Inst_ : why accumulator ? |
| 16:02:44 | → | jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) |
| 16:04:24 | × | Ross[m] quits (~zhichuche@2001:470:69fc:105::3:584b) (Remote host closed the connection) |
| 16:07:23 | <Inst_> | let's say you're doing a vigenere cipher |
| 16:07:32 | <Inst_> | the way i'm doing it is that i'm encoding the key as a list of ints (offsets) |
| 16:08:38 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 16:09:09 | <Inst_> | bleh, my brain is dead |
| 16:10:27 | <ski> | sounds reasonable, so far |
| 16:11:10 | <Inst_> | maybe there's an easier way to do it |
| 16:11:17 | <Inst_> | i need zip to be able to skip whitespace and symbols, etc |
| 16:11:44 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 16:11:50 | <ski> | hm, i see |
| 16:12:06 | <ski> | so you're keeping the key as the accumulator, yes ? |
| 16:12:54 | → | _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
| 16:13:02 | <Inst_> | yeah |
| 16:13:08 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 16:13:25 | <Inst_> | anyways, moved onto a different problem, which is figuring out how to get haskell win32 to replicate the clipboard copy function |
| 16:14:10 | → | mei joins (~mei@user/mei) |
| 16:14:38 | <EvanR> | are you using win32 bindings or something |
| 16:15:12 | <Inst_> | should I be using something else? |
| 16:15:22 | <EvanR> | no just wondering |
| 16:15:22 | <Inst_> | "type HANDLE = Ptr ()" |
| 16:19:38 | → | nick4 joins (~nick@50.86.118.19) |
| 16:22:49 | <Inst_> | https://hackage.haskell.org/package/Clipboard |
| 16:22:51 | <Inst_> | this is just a better idea |
| 16:24:51 | <Inst_> | okay, does not support Wayland |
| 16:24:52 | <Inst_> | doip |
| 16:25:01 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 245 seconds) |
| 16:26:31 | <Inst_> | provisionally: |
| 16:26:32 | <Inst_> | https://paste.tomsmeding.com/RLzR9DHm |
| 16:26:46 | × | barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed) |
| 16:28:55 | <Inst_> | okay, and it works, with some typos |
| 16:30:48 | × | dtman34 quits (~dtman34@c-76-156-89-180.hsd1.mn.comcast.net) (Ping timeout: 240 seconds) |
| 16:30:53 | <EvanR> | \o/ |
| 16:31:57 | <Inst_> | btw why is there only mapAccumL not mapAccumL'? |
| 16:32:06 | × | nick4 quits (~nick@50.86.118.19) (Ping timeout: 245 seconds) |
| 16:32:16 | → | dtman34 joins (~dtman34@c-76-156-89-180.hsd1.mn.comcast.net) |
| 16:37:39 | <int-e> | because the result of the accumulator function is forced? (the pair has to be deconstructed) |
| 16:38:09 | <EvanR> | I see a 10 year old mailing list thread on the topic and it seems to be an episode in the debate on why sum should be foldl and not foldl' |
| 16:38:18 | <int-e> | s/accumulator/step/ |
| 16:38:40 | <EvanR> | deconstruct a pair doesn't force the accumulator though |
| 16:39:47 | <int-e> | But you have the power to do so inside the step function. |
| 16:40:05 | → | Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
| 16:40:08 | <int-e> | a `seq` c `seq` (a,c) |
| 16:41:01 | <int-e> | With foldl, you don't have that ability. |
| 16:41:10 | <EvanR> | I was about to say |
| 16:41:36 | <int-e> | So having `foldl'` is practically a necessity. |
| 16:43:04 | <int-e> | (Also, there are two elements in that pair so if you start offering strict versions of mapAccumL, do you force both or only one of them, or do you provide four variants? And how do you name them?) |
| 16:43:26 | <EvanR> | I see, foldl immediately recurses to the end of the list before doing anything else, mapAccumL sets up a chain of (non-lazy) tuples |
| 16:43:48 | <EvanR> | so your code is running at each step |
| 16:44:23 | <EvanR> | or... |
| 16:45:25 | <Inst_> | ffff |
| 16:45:54 | <Inst_> | jesus christ, someone talked me into using if then else for when you only have two alternatives, but even though it's more terse, i somehow feel that guards are still more readable overall |
| 16:45:56 | <int-e> | ffffine? |
| 16:46:20 | <int-e> | (too slow) |
| 16:46:55 | <dolio> | I usually prefer guards, I think. |
| 16:47:11 | <dolio> | Unless it's in the middle of some other expression. |
| 16:48:30 | <int-e> | yeah it's situational |
| 16:48:34 | <EvanR> | ok like scanl mapAccumL on list works as long as you carefully consume the result, and via magic of update frames, you don't hold on to old accumulators |
| 16:55:07 | <Inst_> | is it really smelly to immediately map into an IO action before binding it? |
| 16:55:26 | <Inst_> | say, transform <$> getLine |
| 16:55:39 | <EvanR> | miranda guards ftw https://paste.tomsmeding.com/LABOLtZy |
| 16:57:40 | <tomsmeding> | Inst_: that's a common pattern |
| 16:57:50 | × | fendor quits (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) (Remote host closed the connection) |
| 16:59:59 | <EvanR> | lines <$> getContents -- 😎 |
| 17:01:51 | <[exa]> | Inst_: is it really "before" binding it? |
| 17:02:25 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 17:02:45 | <EvanR> | stuff <- getLine <&> transform -- there you go |
| 17:03:48 | <Inst_> | afaik IO is strict, no? |
| 17:04:02 | <Inst_> | it's only lazy when you unsafeInterleaveIO it, and some IO functions have built-ins, no? |
| 17:04:08 | <[exa]> | it is, with respect to other IO actions |
| 17:04:09 | <Inst_> | erm, built-in unsafeInterleaveIO? |
| 17:06:38 | <[exa]> | but binding doesn't technically "do" anything so it's pretty hard to say "when" (or even if) it happens |
| 17:07:07 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 17:08:36 | <tomsmeding> | Inst_: if X is a normal IO action, then f <$> X will first fully complete X, and then apply f to the result |
| 17:09:01 | → | misterfish joins (~misterfis@84-53-85-146.bbserv.nl) |
| 17:09:17 | <tomsmeding> | indeed for things that implement "lazy IO", like getContents, readFile, and perhaps also getLine, there is some unsafeInterleaveIO happening so that the IO is happening on-demand as consumers need its result |
| 17:09:50 | <tomsmeding> | but f doesn't demand X's result -- if f's result is unused, still nothing happens |
| 17:10:13 | <tomsmeding> | or, well, IO's (>>=) evaluates the result of the LHS to WHNF, so something might happen, but probably not much |
| 17:10:23 | × | ripspin quits (~chatzilla@1.145.156.103) (Remote host closed the connection) |
| 17:10:52 | <tomsmeding> | but there's little difference between 'do { tmp <- getLine ; let stuff = transform tmp ; ...}' and 'do { stuff <- transform <$> getLine ; ... }' |
| 17:11:11 | <EvanR> | getLine from System.IO at least blocks until it gets a whole line |
| 17:11:15 | <tomsmeding> | I think not even a WHNF laziness difference, if IO's fmap is consistent with its (>>=) |
| 17:11:18 | <tomsmeding> | ah |
| 17:12:44 | <EvanR> | in some languages there's a style convention to put I/O statements like getLine on their own line, resulting in an increase in variable names |
| 17:12:56 | <EvanR> | instead of doing a lot on one line |
| 17:14:10 | <Inst_> | Some or most? |
| 17:14:38 | × | perrierjouet quits (~perrierjo@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 4.0.0) |
| 17:14:43 | <EvanR> | no I'm going to chalk that one up to bizarre cult-like behavior |
| 17:15:35 | <EvanR> | chaining operations together reduces variable naming |
| 17:17:53 | <Inst_> | but isn't variable naming useful? Like, some programmers don't believe in anonymous lambdas |
| 17:18:15 | <dolio> | Sometimes. Sometimes not. |
| 17:18:36 | <Inst_> | Going into Python, I get chortles when I insist on keeping the Haskell idiom of named lambdas and actually assigning them before I use them. |
| 17:18:40 | <dolio> | Just like parentheses. Sometimes they make things clearer. Sometimes they make things less clear. |
| 17:19:11 | <EvanR> | yeah you can't go into python acting like it's haskell |
| 17:19:27 | × | mbuf quits (~Shakthi@49.207.178.186) (Quit: Leaving) |
| 17:19:41 | <Inst_> | I've read in places actually naming your lambdas somehow improves performance |
| 17:19:55 | <EvanR> | that's annoying |
| 17:20:05 | <Inst_> | Python is annoying, what else is new? |
| 17:20:40 | <EvanR> | they should introduce an internal name on your behalf then xD |
| 17:21:07 | <EvanR> | make it two for good measure |
| 17:21:25 | → | jinsun joins (~jinsun@user/jinsun) |
| 17:21:38 | × | ubert quits (~Thunderbi@2a02:8109:abc0:6434:2722:db0d:9dca:9984) (Read error: Connection reset by peer) |
| 17:22:52 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 17:25:24 | → | captnemo joins (~captnemo@193.32.127.239) |
| 17:31:17 | → | nick4 joins (~nick@2600:8807:9084:7800:dc97:418d:c7fc:117f) |
| 17:36:52 | <EvanR> | int-e, https://mail.haskell.org/pipermail/libraries/2012-November/018766.html 🤔 |
| 17:36:57 | × | ystael quits (~ystael@user/ystael) (Ping timeout: 246 seconds) |
| 17:39:29 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:41:52 | × | misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 245 seconds) |
| 17:43:49 | × | comerijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 240 seconds) |
| 17:46:29 | → | danse-nr3 joins (~francesco@151.43.173.33) |
| 17:46:45 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 246 seconds) |
| 17:49:33 | × | dibblego quits (~dibblego@haskell/developer/dibblego) (Ping timeout: 246 seconds) |
| 17:49:53 | → | dibblego joins (~dibblego@116-255-1-157.ip4.superloop.au) |
| 17:49:53 | × | dibblego quits (~dibblego@116-255-1-157.ip4.superloop.au) (Changing host) |
| 17:49:53 | → | dibblego joins (~dibblego@haskell/developer/dibblego) |
| 17:50:05 | <int-e> | EvanR: oh hmm. I guess the issue then is that let !(x,y) = mapAccumL (\a b -> let !x = a+b in (x, ())) 0 [1..1000000 :: Int] gives you a big unevaluated thunk for x. |
| 17:51:14 | <int-e> | But if you evaluate the resulting `y` to the end, that will also evaluate x. |
| 17:51:24 | → | misterfish joins (~misterfis@84-53-85-146.bbserv.nl) |
| 17:51:37 | <EvanR> | aiui it depends on what you do next, look at x first and you're screwed. Process all of y you're not |
| 17:51:41 | × | Lewix quits (uid158496@id-158496.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
| 17:52:16 | <int-e> | yeah as I was trying to say |
| 17:52:29 | <EvanR> | that bang(x,y) doesn't do anything right |
| 17:52:41 | <dolio> | Right. |
| 17:52:56 | <dolio> | Oh wait, no, it does. |
| 17:52:59 | <int-e> | EvanR: well, it does *something*; it overrides the default laziness of `let`. |
| 17:53:23 | <EvanR> | default laziness? |
| 17:53:25 | <dolio> | It only does something with respect to code that wasn't written, though. |
| 17:53:28 | <int-e> | EvanR: but it doesn't do much in this context because `mapAccumL` is using a lazy-in-state state monad. |
| 17:53:40 | <int-e> | > let (x,y) = undefined in () |
| 17:53:41 | <lambdabot> | () |
| 17:53:43 | <int-e> | > let !(x,y) = undefined in () |
| 17:53:44 | <lambdabot> | *Exception: Prelude.undefined |
| 17:54:28 | <int-e> | So there's room for a mapAccumL variant that uses a strict-in-state state monad. |
| 17:55:12 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 245 seconds) |
| 17:56:23 | <EvanR> | would that hypothetically mean you don't have to be as careful with the results? |
| 17:58:42 | <dolio> | If mapAccumL gets inlined, does GHC just figure out the strictness? |
| 17:59:34 | <dolio> | Similar to sum on particular types. |
| 18:00:09 | × | nurupo quits (~nurupo.ga@user/nurupo) (Quit: nurupo.ga) |
| 18:00:20 | <int-e> | @where L.hs |
| 18:00:20 | <lambdabot> | what lambdabot has in scope is at https://silicon.int-e.eu/lambdabot/State/Pristine.hs |
| 18:00:24 | → | nurupo joins (~nurupo.ga@user/nurupo) |
| 18:01:05 | <int-e> | @let import Control.Monad.State.Strict as S' |
| 18:01:07 | <lambdabot> | Defined. |
| 18:01:56 | <dolio> | Strict State isn't strict in the state value. It just forces the tuple in (>>=) or something. |
| 18:02:08 | <EvanR> | let (x,y) = undefined in () ==> (), case undefined of (x,y) -> () ==> CRASH, case undefined of ~(x,y) -> () ==> (), ..... |
| 18:02:25 | → | merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 18:02:37 | <int-e> | > fst $ S'.runState (traverse (\a -> S'.modify (+a) >> get) [1,2,undefined]) 0 |
| 18:02:39 | <lambdabot> | [1,3,*Exception: Prelude.undefined |
| 18:02:54 | <int-e> | > fst $ S'.runState (traverse (\a -> S'.modify' (+a) >> get) [1,2,undefined]) 0 |
| 18:02:55 | <lambdabot> | *Exception: Prelude.undefined |
| 18:03:15 | int-e | is confused |
| 18:04:18 | <int-e> | Oh, wait, the lazy state monad is lazy in the (s,a) pairs produced by the intermediate actions. |
| 18:04:19 | <EvanR> | the last one is most strict |
| 18:04:42 | <EvanR> | yeah |
| 18:05:03 | <EvanR> | that's what I was originally looking at but didn't realize the "default laziness of let" |
| 18:05:06 | <int-e> | (It has been a while since I needed that information.) |
| 18:05:35 | <dminuoso> | jackdk: Yes, and largely undocumented. You have to refer to the original PhD thesis and Edwards repositories to know how to use backpack. |
| 18:05:36 | <int-e> | > runState (undefined >> put 2) 0 |
| 18:05:37 | <lambdabot> | error: |
| 18:05:38 | <lambdabot> | Ambiguous occurrence ‘runState’ |
| 18:05:38 | <lambdabot> | It could refer to |
| 18:05:46 | <int-e> | ah |
| 18:05:47 | <int-e> | @undef |
| 18:05:47 | <lambdabot> | Undefined. |
| 18:05:59 | <int-e> | @let import qualified Control.Monad.State.Strict as S' |
| 18:06:00 | <lambdabot> | Defined. |
| 18:06:05 | <int-e> | > runState (undefined >> put 2) 0 |
| 18:06:07 | <lambdabot> | ((),2) |
| 18:06:14 | <int-e> | > S'.runState (undefined >> S'.put 2) 0 |
| 18:06:15 | <lambdabot> | *Exception: Prelude.undefined |
| 18:06:44 | <EvanR> | I really need to upgrade my visual reasoning of evaluating chains of let (a,b) = ... |
| 18:07:38 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 240 seconds) |
| 18:07:40 | <int-e> | are you aware of selector thunks? |
| 18:07:46 | <EvanR> | nope |
| 18:09:59 | <int-e> | (They're obscure. Basically, functions like `fst` and `snd` have a special heap representation. The point is, if you have lots of chained let (a,b) = f (...) where f is lazy (like in the state monad), then `a` becomes, effectively, `fst (f (...))` so you could easily end up with thunks of the shape `fst (fst (...),...)` |
| 18:11:00 | <int-e> | When proceeding with lazy evaluation. That's not good. So the garbage collector has code to recognize that case and evaluate those selectors when their argument is a value (not a thunk). |
| 18:11:04 | × | acarrico quits (~acarrico@dhcp-68-142-49-163.greenmountainaccess.net) (Quit: Leaving.) |
| 18:11:27 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 18:11:39 | → | reio joins (~reio@86-90-81-176.fixed.kpn.net) |
| 18:11:51 | <int-e> | To do that, it has to know when a function is a selector, so selectors like `fst` have a special closure type in the RTS for that purpose. |
| 18:12:13 | × | justsomeguy quits (~justsomeg@user/justsomeguy) (Quit: WeeChat 3.6) |
| 18:13:04 | <int-e> | And it's somewhat brittle... inlining and let-floating can turn what would be selectors into more complicate closures that are no longer selectors and then the garbage collector can no longer evaluate them on the spot and that can cause space leaks that are really hard to understand :) |
| 18:13:17 | <int-e> | (this is basically how I learned about selector thunks) |
| 18:15:34 | <EvanR> | so a = fst(some thunk) and b = snd(SAME thunk), but at some point the argument may become a value, and even though no one demanding a, it can be simplified |
| 18:15:47 | <int-e> | yep |
| 18:16:14 | <int-e> | and b too |
| 18:16:46 | <EvanR> | and if that is compounded by recursion like in scanl, the gc can repeatedly come in to stop a from building up |
| 18:17:11 | <EvanR> | then what's an update frame? xD |
| 18:17:30 | → | acarrico joins (~acarrico@dhcp-68-142-49-163.greenmountainaccess.net) |
| 18:17:52 | <int-e> | That's something on the stack, not on the heap, keeping track of where to put return values of closures. |
| 18:17:55 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection) |
| 18:18:02 | <int-e> | I understand those less well than selector thunks. |
| 18:18:29 | <hololeap> | I'm looking for some in-depth info on how to profile a data structure for unwanted laziness |
| 18:19:25 | × | captnemo quits (~captnemo@193.32.127.239) (Quit: WeeChat 3.8) |
| 18:20:03 | <int-e> | But there is an optimization (during GC I think?) that collapses update frames on the stack if there are several for the same thunk (which are, IIRC, easy to detect because they'll always be consecutive update frames). |
| 18:20:26 | <EvanR> | wow the GC is doing a lot |
| 18:22:06 | <EvanR> | why would there be many update frames for the same thunk |
| 18:22:18 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 18:23:18 | <geekosaur> | "accumulator" for a fold? |
| 18:24:20 | → | notzmv joins (~zmv@user/notzmv) |
| 18:25:15 | <EvanR> | well I think my main confusion was coming from the selector thunks anyway, thanks for that |
| 18:26:48 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:32:44 | <EvanR> | > let Just () = Nothing in () |
| 18:32:46 | <lambdabot> | () |
| 18:33:12 | <EvanR> | is there a selector thunk which checks the sum type's tag too |
| 18:33:25 | <int-e> | no |
| 18:33:46 | <EvanR> | let Just a = Nothing in something something a something something, now what would a be |
| 18:34:33 | × | biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer) |
| 18:35:14 | <EvanR> | whatever it is, defensively evaluating it would be bad right |
| 18:35:19 | <int-e> | (It's not *overly* useful because it would basically only work when you know which constructor the return value will have... I mean we're talking about functions like `fromJust`. In which case, you can and arguably should refactor the code to not produce the constructor in the first place.) |
| 18:35:46 | <EvanR> | yeah but that code does something |
| 18:36:34 | <int-e> | While the chained selectors-on-tuples is actually common when writing loops-as-recursion |
| 18:36:48 | × | merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 18:37:35 | <EvanR> | > let Just a = Nothing in [1,2,a,4,5] |
| 18:37:37 | <lambdabot> | [1,2,*Exception: <interactive>:3:5-20: Non-exhaustive patterns in Just a |
| 18:37:50 | <EvanR> | > fromJust Nothing |
| 18:37:52 | <lambdabot> | *Exception: Maybe.fromJust: Nothing |
| 18:38:11 | <int-e> | it's just an ordinary thunk |
| 18:38:18 | → | biberu joins (~biberu@user/biberu) |
| 18:38:24 | <EvanR> | containing what, a case |
| 18:39:05 | <int-e> | It's more or less `let a = case Nothing of Just a => a in ...` |
| 18:39:28 | × | misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 240 seconds) |
| 18:39:33 | <EvanR> | groovy |
| 18:40:13 | <EvanR> | so selectors are specifically for data types with 1 constructor |
| 18:40:20 | <int-e> | IIRC the Haskell report actually has desugarings for this stuff (pattern matches, including irrefutable ones). |
| 18:40:53 | <int-e> | "irrefutable" being the report's term for what we call "lazy matching" |
| 18:42:44 | <geekosaur> | EvanR, don't forget field selectors |
| 18:43:10 | <int-e> | EvanR: selector thunks, yes. |
| 18:43:24 | <EvanR> | explicit use of field selectors produces a selector thunk too? |
| 18:43:41 | <int-e> | not if there is more than one data constructor |
| 18:43:48 | <EvanR> | got it |
| 18:44:19 | <int-e> | obviously this is a deep implementation detail of ghc |
| 18:44:48 | <int-e> | (though hugs also did thise kind of thing... and probably everybody else too, at least for pairs) |
| 18:48:48 | → | k`` joins (~user@152.7.255.193) |
| 18:49:26 | <k``> | Is there an easy way to do a reverse dependency search for packages? |
| 18:49:55 | <ncf> | https://packdeps.haskellers.com/reverse |
| 18:50:06 | <k``> | Thanks! |
| 18:50:11 | → | merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 18:50:45 | → | acidjnk joins (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) |
| 18:50:51 | × | danse-nr3 quits (~francesco@151.43.173.33) (Ping timeout: 245 seconds) |
| 18:51:17 | <k``> | Now I just need to figure out how much of the API they depend on... |
| 18:54:47 | × | merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 18:55:13 | × | trev quits (~trev@user/trev) (Quit: trev) |
| 19:02:03 | → | __monty__ joins (~toonn@user/toonn) |
| 19:05:48 | → | merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 19:06:38 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 240 seconds) |
| 19:08:53 | → | falafel joins (~falafel@2603-7000-a700-8710-770e-b4b3-5186-ab58.res6.spectrum.com) |
| 19:10:45 | × | merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 19:17:46 | <EvanR> | > if 4 > 9000; then "over 9000!"; else "" |
| 19:17:47 | <lambdabot> | "" |
| 19:17:51 | <EvanR> | > if 4 > 9000; then "over 9000!"; else ""; |
| 19:17:52 | <lambdabot> | <hint>:1:40: error: parse error on input ‘;’ |
| 19:19:48 | <geekosaur> | you don't actually need those, do you? |
| 19:20:02 | <geekosaur> | > if 4 > 9000 then "over 9000!" else "" |
| 19:20:04 | <lambdabot> | "" |
| 19:20:09 | <geekosaur> | that's what I thought |
| 19:20:26 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 19:20:37 | <monochrom> | But they are allowed because of DoIfThenElse which is now part of Haskell2010. |
| 19:20:38 | <mauke> | the semicola are optionally allowed in an if-then-else expression to make do-notation slightly less annoying |
| 19:20:56 | <geekosaur> | yeh |
| 19:21:25 | <EvanR> | DoIfThenElse? |
| 19:21:29 | <mauke> | did you know import lists allow trailing commata? |
| 19:21:55 | <monochrom> | In fact, DoIfThenElse is defined to just mean allowing ; so that it is a minimal change to the grammar. :) |
| 19:21:56 | <geekosaur> | EvanR, that alters indentation rules |
| 19:22:03 | <geekosaur> | iirc |
| 19:22:16 | <monochrom> | I have only tried export list trailing commas. |
| 19:22:36 | <monochrom> | Also I will raise the endiar war between "commata" and "commae" >:D |
| 19:22:36 | <geekosaur> | since it's an expression, `then` and `else` should be indented, but iirc `DoAndIfThenElse` relaxes that? |
| 19:22:48 | <monochrom> | raise? rage? wage? |
| 19:23:20 | <geekosaur> | "commoi" |
| 19:23:48 | geekosaur | is now known as greekosaur |
| 19:23:55 | <monochrom> | Yes, if you don't indent "then" and "else", then layout processing adds ";". Then DoAndIfThenElse just needs to say ";" is OK. |
| 19:24:17 | <monochrom> | It's an ingenious life hack. |
| 19:24:21 | greekosaur | is now known as geekosaur |
| 19:25:35 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 19:26:26 | × | gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Ping timeout: 250 seconds) |
| 19:26:36 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 19:28:35 | <EvanR> | wow that is sneaky as hell |
| 19:28:53 | <monochrom> | :) |
| 19:29:10 | <monochrom> | My thought when I first saw it. |
| 19:30:02 | <EvanR> | but no 3rd ; is needed? |
| 19:30:06 | <monochrom> | You don't even need to change the layout rules. |
| 19:30:07 | <EvanR> | (or allowed) |
| 19:30:23 | <monochrom> | You can have the 3rd ; in a do-block. |
| 19:30:54 | <mauke> | you don't want the statement after if-then-else to be swallowed by the else part |
| 19:31:00 | <monochrom> | > do if 4 > 9000; then "over 9000!"; else ""; |
| 19:31:01 | <lambdabot> | "" |
| 19:31:20 | <monochrom> | Your life is complete. :) |
| 19:31:32 | <EvanR> | and this is a haskell2010 thing |
| 19:31:36 | <monochrom> | Yes. |
| 19:32:04 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 250 seconds) |
| 19:32:07 | <mauke> | > do if do 4 > do 9000; then do "over 9000!"; else do ""; |
| 19:32:09 | <lambdabot> | "" |
| 19:32:25 | → | dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) |
| 19:32:39 | <EvanR> | > do do do do do "batman!" |
| 19:32:40 | <monochrom> | deep dodo |
| 19:32:40 | <lambdabot> | "batman!" |
| 19:32:52 | <mauke> | I don't know if you can fit any extra semicola in there now |
| 19:32:58 | <monochrom> | batmonad |
| 19:34:06 | <monochrom> | > do if do 4 > do 9000;;;;;; then do "over 9000!";;;;; else do "";;;;; |
| 19:34:07 | <lambdabot> | "" |
| 19:34:19 | <monochrom> | Beethoven Virus but semicolons. |
| 19:34:25 | → | mei joins (~mei@user/mei) |
| 19:35:31 | <mauke> | > do;; if do 4;; > do 9000;; then do "over 9000!";; else do;; do "";; |
| 19:35:32 | <lambdabot> | "" |
| 19:36:53 | <hololeap> | so, here you can see the flamegraph output of my command: https://eidetic.codes/hackport.html |
| 19:37:20 | <hololeap> | the actual command is: ./dist-newstyle/build/x86_64-linux/ghc-9.2.8/hackport-0.8.4.0/x/hackport/build/hackport/hackport --bash-completion-index 2 --bash-completion-word hackport --bash-completion-word merge --bash-completion-word Cabal +RTS -I0 -A128M -N -pj -hc -l |
| 19:38:46 | <hololeap> | the main block of relevant code is here: https://github.com/gentoo-haskell/hackport/blob/master/src/Hackport/Completion.hs#L82-L129 |
| 19:39:29 | <hololeap> | it seems like that's an excessive amount of GC.GC and IDLE.IDLE, but I don't really know |
| 19:41:31 | <hololeap> | and when I've asked in here before I either get "I don't know" or crickets, but surely there must be some information out there on how to investigate why there is so much garbage being generated |
| 19:45:03 | <hololeap> | in this case, it is reading a Trie from a binary file and running Trie.lookup on it |
| 19:45:19 | <hololeap> | https://github.com/gentoo-haskell/hackport/blob/master/src/Data/Trie.hs |
| 19:53:17 | <EvanR> | a lot of garbage *generated* seems par for the course |
| 19:53:34 | → | perrierjouet joins (~perrierjo@modemcable048.127-56-74.mc.videotron.ca) |
| 19:53:36 | <EvanR> | if it's not being collected soon then it's potentially a problem |
| 19:55:36 | → | Pickchea joins (~private@user/pickchea) |
| 19:57:19 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
| 19:57:28 | <hololeap> | is the GC.GC and IDLE.IDLE at the beginning some sort of unavoidable startup for the runtime? |
| 19:59:13 | × | jrm quits (~jrm@user/jrm) (Quit: ciao) |
| 20:00:34 | → | jrm joins (~jrm@user/jrm) |
| 20:01:11 | <int-e> | hololeap: hmm the idling may be waiting for external commands? |
| 20:01:20 | → | lainon joins (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) |
| 20:01:39 | <int-e> | you could try +RTS -I0 -RTS to disable the idle GC and see if that reduces the proportion of GC time |
| 20:02:01 | <int-e> | ("-I<sec> Perform full GC after <sec> idle time (default: 0.3, 0 == off)") |
| 20:02:21 | <hololeap> | hm, well it already is running with +RTS -I0 |
| 20:02:39 | <int-e> | ah, I missed that. |
| 20:03:02 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 20:04:40 | <int-e> | hmm, -N, how many cores will that end up using? |
| 20:06:31 | × | lainon quits (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) (Quit: Textual IRC Client: www.textualapp.com) |
| 20:06:35 | <hololeap> | 4 in this case, is that going to be a problem? -N is actually set in ghc-options: ... -with-rtsopts=-N |
| 20:07:33 | <int-e> | Well it might explain the idle thing... expecially if the actuaal work load has only one thread |
| 20:07:54 | <int-e> | So trying with -N1 seems to be a worthwhile experiment at least? |
| 20:08:02 | <hololeap> | yeah, I'll try that |
| 20:08:19 | <int-e> | It shouldn't dramatically affect the GC time though which is your real question |
| 20:08:44 | <int-e> | (I think) |
| 20:08:47 | <EvanR> | whoa https://github.com/sdiehl/write-you-a-haskell (not necessarily in 24 hours) |
| 20:10:17 | <int-e> | Hmm, 2+ years, unfinished? |
| 20:10:29 | <hololeap> | so the whole point of this is to add bash completion to the `hackport merge` command, which takes a package/version that exists in the hackage database. the list of package/versions is cached in a trie which is serialized via binary to a file. on subsequent runs, it should deserialize the cache file and run a lookup on the trie. |
| 20:10:59 | <hololeap> | with bash completion, adding a second or two feels really sluggish, so I was trying to squeeze a bit more speed out of it |
| 20:11:31 | <hololeap> | (just some background) |
| 20:11:32 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds) |
| 20:12:07 | <int-e> | hmm, a second or two... did you say how big the serialized data is? |
| 20:12:25 | <hololeap> | I think it's around 150,000 entries? |
| 20:13:01 | <hololeap> | but you can see from that flamegraph thing that quite a bit of time is spent at the beginning before it even enters main |
| 20:13:33 | <int-e> | I don't think you see that |
| 20:13:51 | <int-e> | I think you're seeing *total* times spent in various parts of the program |
| 20:14:02 | <hololeap> | oh, ok |
| 20:14:08 | → | alternateved joins (~user@77-254-166-50.dynamic.inetia.pl) |
| 20:14:09 | <int-e> | and GC.GC is first only because it's the biggest chunk |
| 20:14:53 | <hololeap> | I'm also interested in this because the understanding I gain will really help me in the future projects |
| 20:16:03 | <hololeap> | for instance, I was told adding `LANGUAGE Strict` to my Data.Trie is clumsy and may not do what I expect, but I wasn't told what the _proper_ solution there is either |
| 20:16:14 | <int-e> | I guess the generic recipe for reducing GC times without modifying the program is to increase heap size (both -A and -H may be relevant) |
| 20:17:18 | <davean> | hololeap: you can profile allocations. Also including what closures, etc allocates them - have you done such? Also I see comments above about -N, but have you tried disabling parallel GC? |
| 20:17:22 | × | tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: jdvkjb) |
| 20:17:54 | <hololeap> | davean: I'm not sure how to do any of this |
| 20:18:56 | <hololeap> | I see the -pa runtime argument in the chapter on profiling |
| 20:19:01 | × | acidjnk quits (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) (Read error: Connection reset by peer) |
| 20:19:03 | <davean> | add "+RTS -?" to your commend to get options (build with profiling enabled, and RTS options enabled) |
| 20:19:17 | <int-e> | why is the top user of runtime somewhere in hackage-security |
| 20:19:21 | <davean> | ps are about time, you want heap, which is h |
| 20:19:33 | <int-e> | (if the flame graph is to be trusted) |
| 20:20:23 | <davean> | int-e: I would expect that if not much was being done in the program at all. |
| 20:20:49 | <hololeap> | int-e: that's a good question and has to do with the way the program was originally structured |
| 20:21:22 | <int-e> | hololeap: the reason I'm asking is really that I'm wondering whether you're blaming the right thing for taking so much time |
| 20:21:54 | <hololeap> | int-e: I would love to know how to find out |
| 20:22:28 | → | acidjnk joins (~acidjnk@p200300d6e7072f06a5c472a3c7963a83.dip0.t-ipconnect.de) |
| 20:22:32 | <hololeap> | from the profiling data, rather than start chopping parts off until it goes fast |
| 20:22:41 | <int-e> | (and often, time correlates with allocations, and allocations trigger GCs, so it's all related to the high GC activity) |
| 20:22:51 | <int-e> | (well, potentially related) |
| 20:23:06 | <davean> | Is the GC activity high? Its a flame graph so i can't tell |
| 20:23:14 | <davean> | I'd kill for an actual graph |
| 20:23:24 | <hololeap> | davean: I can provide other files, what do you want |
| 20:23:25 | <int-e> | well the graph suggests 40%+ GC time |
| 20:23:28 | <jade[m]> | davean: pls don't |
| 20:23:55 | <davean> | hololeap: I mean the actual profile file would be great, but I'm not going to spend much time on this ATM |
| 20:24:28 | <hololeap> | davean: the .prof in json or what format? |
| 20:24:42 | <davean> | the .prof in standard format |
| 20:24:49 | <int-e> | tbh I'd like to see the percentages from `+RTS -s` just to support or refute the flame graph |
| 20:26:00 | × | reio quits (~reio@86-90-81-176.fixed.kpn.net) (Ping timeout: 246 seconds) |
| 20:27:59 | <davean> | actually I can generate all this myself unless its a quirk of your system - whats the repo, do you have a nix file for it, and what do you want profiled? I might do it between stuff tonight |
| 20:28:44 | <hololeap> | here's the output with +RTS -s: http://sprunge.us/VJ9cxA |
| 20:28:52 | <hololeap> | here's the .prof file: http://sprunge.us/3h8TNy |
| 20:29:29 | <hololeap> | davean, I don't have a nix file, but I'm using master from here: https://github.com/gentoo-haskell/hackport |
| 20:29:31 | <int-e> | so that confirms 40%-50% GC time |
| 20:29:42 | <geekosaur> | if this turns out to be in hackage-security then #hackage will want to hear about it |
| 20:30:07 | <davean> | Its only allocating like 357MiB, how long is this taking? |
| 20:31:12 | <hololeap> | well, +RTS -N1 -qg -RTS seemed to speed it up quite a bit: total time = 1.15 secs |
| 20:31:30 | <int-e> | "227MB copied during GC" is what makes GC expensive |
| 20:32:01 | <davean> | Yah but even that means this is a VERY slow system it is on - how big is the datafile? We can look at how it is parsed. |
| 20:32:13 | <davean> | You don't happen to be using lazy IO by any chance? |
| 20:32:47 | <hololeap> | I'm using encodeFile from Data.Binary |
| 20:33:00 | <hololeap> | encodeFile/decodeFile |
| 20:34:56 | <hololeap> | https://github.com/gentoo-haskell/hackport/blob/master/src/Hackport/Completion.hs#L115-L118 |
| 20:35:45 | <hololeap> | I forgot I put this into a compact region as an experiment, which doesn't seem to affect anything |
| 20:37:01 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 20:37:06 | <davean> | hololeap: and what is the actual command you're running that should be profiled? |
| 20:37:19 | <hololeap> | it's in the .prof file I just pasted |
| 20:37:25 | <davean> | If it isn't too much of a pain to get build I probably can look at it in a few hours. |
| 20:37:51 | <davean> | Ok, are any of the RTS options important? |
| 20:38:02 | <davean> | You have both -N and -N1 for example |
| 20:38:25 | <EvanR> | haskell report section on the context-free grammar doesn't mention whitespace at all. Is the idea that whitespace is dropped in the process of doing the layout algorithm |
| 20:38:27 | <hololeap> | -N is added in the cabal file via --with-rtsopts |
| 20:38:41 | <hololeap> | it was suggested that I turn it off for this |
| 20:39:13 | <hololeap> | I think that optparse-applicative is adding the -I0 -A128M |
| 20:39:19 | <geekosaur> | EvanR, it's typically removed during lexing, as it's either layout or a way to separate tokens |
| 20:39:20 | <mauke> | whitespace is the lexer's problem |
| 20:39:34 | <darkling> | Depends on your lexer rules. :) |
| 20:39:39 | <mauke> | which is why most grammars are useless for finding polyglots |
| 20:39:45 | <EvanR> | ok but the layout algorithm requires knowing all about whitespace to do its thing |
| 20:39:55 | → | merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 20:40:09 | <mauke> | I don't think layout cares about whitespace, really |
| 20:40:15 | <mauke> | just columns |
| 20:40:23 | <geekosaur> | right, but you'll note the layout algorithm is in terms of inserting special tokens, which means it happens during lexing for the most part |
| 20:40:28 | → | fgaz_ joins (1ff9197ed6@2604:bf00:561:2000::11ea) |
| 20:40:51 | <EvanR> | alright |
| 20:40:52 | <geekosaur> | remember the {n} asnd <n> tokens? |
| 20:41:01 | <int-e> | hololeap: Hmm, "trieFile >>= decodeFile >>= compact" ... GHC.Compact.compact is not going to pay off for you I think. |
| 20:41:24 | <hololeap> | int-e: yeah I found that out, but apparently left it in the commit |
| 20:41:24 | <EvanR> | yeah, it says they exist. I guess whitespace turned into {n} and <n> tokens prior to layout |
| 20:41:32 | <geekosaur> | yep |
| 20:42:51 | <EvanR> | though you might want to attach line and column numbers to tokens for reasons? |
| 20:43:07 | <dolio> | EvanR: BTW, you might be interested in the references here: https://github.com/haskell/happy/issues/235 |
| 20:43:10 | <geekosaur> | yes, and ghc for example does that |
| 20:43:27 | <int-e> | hololeap: I'm still confused though... shouldn't the whole cabal-install/hackage-security code path be skipped if the cache exists? |
| 20:44:58 | <hololeap> | int-e: yes it should, I haven't gotten to that yet. I was really just trying to understand the GC usage |
| 20:45:27 | <int-e> | hololeap: so, tentatively, I suspect `choice` may not be as lazy as you expect |
| 20:51:02 | <int-e> | > runWriter $ runMaybeT $ asum [lift (tell [1]) >> pure "Ok", lift (tell [2]) >> fail "Nope"] |
| 20:51:03 | <lambdabot> | (Just "Ok",[1]) |
| 20:51:15 | <int-e> | This... suggests that it's lazy enough. |
| 20:51:39 | <int-e> | (`choice` is defined as `asum`) |
| 20:52:15 | × | nick4 quits (~nick@2600:8807:9084:7800:dc97:418d:c7fc:117f) (Ping timeout: 246 seconds) |
| 20:52:40 | × | gry quits (quasselcor@botters/gry) (Ping timeout: 250 seconds) |
| 20:53:16 | <EvanR> | the final section of that chapter on syntax is about disambiguating infix expressions by using fixity and precedence. It is explained in terms of a "list of tokens" which are either infixexps from the grammar (which includes operators already), operators, and negative signs |
| 20:53:17 | <dolio> | > runWriter . runMaybeT $ fail "Nope" |
| 20:53:18 | <lambdabot> | (Nothing,()) |
| 20:53:31 | <int-e> | hmmmm. what does `optional` do here |
| 20:53:41 | <EvanR> | is the idea to use first get a parse tree however you can, then flatten infixexps into a list, and rearrange them? |
| 20:54:42 | <dolio> | EvanR: I think so. As I recall, fixity is handled as a post-pass, not during parsing. |
| 20:55:02 | <dolio> | Because you have to parse to find fixity declarations. |
| 20:55:13 | <EvanR> | interesting |
| 20:56:32 | <EvanR> | that adds another level to the common expectation for recursive modules to "just work" |
| 20:57:00 | <EvanR> | operators defined in module A used in module B which uses operators defined in module A |
| 20:57:22 | <int-e> | hololeap: maybe `decodeFile` fails? You'd never seen an error from that because `optional` suppresses it |
| 20:57:40 | <hololeap> | that's intentional |
| 20:58:06 | <int-e> | But it would cause you to go down the slow path. |
| 20:58:28 | <hololeap> | well, the slow path is like 20 seconds, so it's pretty noticable :3 |
| 20:58:31 | <int-e> | So in the interest of debugging, a message would be helpful there. |
| 20:58:35 | <hololeap> | fair |
| 20:59:34 | <hololeap> | also, outputting to stderr on tab completion can be pretty annoying |
| 21:00:12 | <hololeap> | but in the interest of debugging, that's fine, or outputting somewhere in /tmp |
| 21:00:20 | <int-e> | that's fair... |
| 21:00:51 | → | dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net) |
| 21:01:13 | × | kimiamania6 quits (~681cf57f@user/kimiamania) (Quit: PegeLinux) |
| 21:01:17 | × | infinity0 quits (~infinity0@pwned.gg) (Remote host closed the connection) |
| 21:01:24 | <int-e> | I just still don't understand why cabal-install/hackage-security show up in the flame graph here, if you're just reading that trie and then traversing it |
| 21:01:45 | → | kimiamania6 joins (~681cf57f@user/kimiamania) |
| 21:02:58 | × | cyphase quits (~cyphase@user/cyphase) (Ping timeout: 260 seconds) |
| 21:03:11 | → | gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) |
| 21:03:24 | → | infinity0 joins (~infinity0@pwned.gg) |
| 21:05:45 | <hololeap> | int-e, I refactored and there's no more hackage-security when it reads from the cache: https://eidetic.codes/hackport.html |
| 21:06:15 | <int-e> | No more IDLE.IDLE either? |
| 21:06:34 | <hololeap> | yeah I guess not... |
| 21:08:16 | × | coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot) |
| 21:09:00 | <int-e> | Of course the fact that it attributes anything to mkCompleter is dubious (it's a plain newtype data constructor) |
| 21:09:03 | → | drdo6 joins (~drdo@bl5-28-156.dsl.telepac.pt) |
| 21:11:23 | × | drdo quits (~drdo@bl8-153-185.dsl.telepac.pt) (Ping timeout: 264 seconds) |
| 21:11:23 | drdo6 | is now known as drdo |
| 21:11:44 | → | pavonia joins (~user@user/siracusa) |
| 21:11:51 | × | k`` quits (~user@152.7.255.193) (Ping timeout: 246 seconds) |
| 21:13:46 | × | dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 245 seconds) |
| 21:14:18 | × | merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 21:16:35 | <int-e> | hololeap: That said I'm prepared to believe that the deserialization is just that slow. A standalone program that just replicates the Trie data type and does the trieFile >>= decodeFile part could confirm. |
| 21:18:44 | <int-e> | Ah, with some care to force the result. |
| 21:20:15 | <int-e> | which, I guess, `compact` would do for you |
| 21:22:14 | <hololeap> | yeah, that sounds like a good idea, and with it isolated I could probably ask a better question in the haskell discourse or reddit |
| 21:22:50 | <hololeap> | in any case, just the suggestions I've received today sped it up quite a bit, so thanks everyone |
| 21:23:04 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 21:24:31 | <EvanR> | haskell reddit? |
| 21:25:48 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 21:25:52 | <EvanR> | yep there it is |
| 21:26:10 | × | _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection) |
| 21:26:11 | <int-e> | is there a haskell lemmy too? |
| 21:26:43 | <EvanR> | so the moderators quit |
| 21:32:58 | <Hecate> | int-e: kbin.social/m/haskell |
| 21:33:36 | <EvanR> | the minus sign, which means subtraction or negation (or comments) depending on who knows what, including whitespace. Seems like a lexical thing but random stackoverflow says it's more convenient to do in the parser, what a mess |
| 21:34:01 | <int-e> | Hecate: ah that looks a bit more lively than https://programming.dev/c/haskell (unavoidably there are several, hmm, let's call it seeds) |
| 21:35:05 | <EvanR> | it's cool that LexicalNegation did something... like make sections always work the way you think. But it's not in the haskell report here |
| 21:37:11 | <monochrom> | If you write "- 5" with spaces between - and 5, it is pretty difficult for lexers, easier for lexer to just output [Minus, Num 5] and let the CFG stage deal with it. |
| 21:43:01 | → | m21it joins (~m21it@2800:ac:8012:135a:9aa8:aa:24dc:5f7a) |
| 21:43:13 | <EvanR> | right, if I'm in the chinese room and see Minus then 5, then I could output negative 5. But if I see x then Minus then y, then x subtract y? Or x(negative y) |
| 21:43:46 | <EvanR> | how did haskell's ancestors do it |
| 21:44:48 | <EvanR> | who the heck came up with this notation |
| 21:45:21 | <dolio> | Distinguishing subtraction from negation isn't usually lexing. |
| 21:45:23 | → | cyphase joins (~cyphase@user/cyphase) |
| 21:45:36 | → | caryhartline joins (~caryhartl@168.182.58.169) |
| 21:46:09 | <EvanR> | it seems to depend on whitespace |
| 21:46:37 | <m21it> | Hello! Does anyone have an idea why 2 expressions here are giving the different results? I was sure they should be equivalent for the case where key is missing, and both should insert the value 321 with the key "WORLD" https://paste.tomsmeding.com/zVIswWjv |
| 21:49:17 | <dolio> | It is with LexicalNegation on, but I think it isn't in the report. |
| 21:49:18 | × | EvanR quits (~EvanR@user/evanr) (Remote host closed the connection) |
| 21:50:23 | → | EvanR joins (~EvanR@user/evanr) |
| 21:53:53 | × | michalz quits (~michalz@185.246.207.203) (Remote host closed the connection) |
| 21:53:58 | → | ryantrinkle joins (~ryantrink@89.247.249.243) |
| 21:57:13 | × | gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.1) |
| 22:04:10 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 250 seconds) |
| 22:05:17 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 22:07:52 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection) |
| 22:08:24 | <hololeap> | m21it, I'm not a lens expert and I had to look it up, but wouldn't `non 321` return a map which omits keys with a value of 321? |
| 22:09:03 | <hololeap> | I don't see how your first expression is supposed to insert ("WORLD", 321) |
| 22:09:50 | × | sagax quits (~sagax_nb@user/sagax) (Read error: Connection reset by peer) |
| 22:10:43 | → | mei joins (~mei@user/mei) |
| 22:11:19 | → | phma_ joins (~phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) |
| 22:13:50 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 22:13:55 | <ncf> | that's not what non does, but it also wouldn't insert a key |
| 22:14:11 | × | phma quits (~phma@host-67-44-208-87.hnremote.net) (Ping timeout: 245 seconds) |
| 22:14:29 | phma_ | is now known as phma |
| 22:17:29 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 22:17:54 | <EvanR> | dolio, would you say even recognizing negative literals for their literal value is usually deferred to parsing, in most languages |
| 22:18:41 | <EvanR> | outputting minus 5 instead of -5 |
| 22:19:04 | <dolio> | I think that's pretty common, yes. |
| 22:21:00 | <EvanR> | wow, minus followed by several spaces then a 5 is accepted in C... |
| 22:22:12 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds) |
| 22:23:59 | <ncf> | m21it: non 321 effectively translates between Maybe Int and Int, where 321 now represents the Nothing case. by mapping `id` over this new representation, you go from 321 to 321, i.e. from no value to no value |
| 22:25:48 | → | waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) |
| 22:30:31 | <m21it> | Yes, I was thinking that `non def` in this case does "insert" the `def` value in case where focus was on `Nothing`, and becoming focused on `Just def`. The `id` example was not the best because it does actually comply with identity law, but "insertion" actually happens if the function is not `id`: `ghci> x & at "WORLD" . non 321 %~ (+1)` does produce `fromList [("HELLO",123),("WORLD",322)]` |
| 22:30:42 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 22:31:18 | → | merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl) |
| 22:32:49 | <ncf> | Nothing <-> def |
| 22:32:58 | <ncf> | Just d <-> d where d /= def |
| 22:33:18 | <ncf> | note that there's no `Just def` in this picture |
| 22:33:33 | <ncf> | mapping id is doing Nothing -> def -> Nothing |
| 22:34:01 | <ncf> | mapping (+1) is doing Nothing -> def ↓ def + 1 -> Just (def + 1) |
| 22:39:48 | × | yuuta quits (~YuutaW@2404:f4c0:f9c3:502::100:17b7) (Ping timeout: 240 seconds) |
| 22:39:56 | <m21it> | Yeah, I do see the idea. My problem is probably the thinking like "I could totally use lens without full understanding of implementation details". Intuitive reasoning mostly works with them, but in some cases no - lens laws do matter |
| 22:41:13 | → | bilegeek joins (~bilegeek@2600:1008:b068:20a1:d82d:ec1b:27cf:aa75) |
| 22:42:49 | → | YuutaW joins (~YuutaW@mail.yuuta.moe) |
| 22:46:26 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection) |
| 22:51:36 | × | YuutaW quits (~YuutaW@mail.yuuta.moe) (Ping timeout: 246 seconds) |
| 22:52:01 | → | liftA2 joins (~user@2605:a601:a60d:5400:cdf2:29ba:eca9:602a) |
| 22:52:28 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) |
| 22:54:30 | <liftA2> | I was just looking at `text`, and it defines `smallChunkSize` to be `128 - chunkOverhead` . `chunkOverhead` is the number of bytes in 2 Words. So `smallChunkSize` is zero on most systems? Is there something I'm missing? |
| 22:55:11 | <liftA2> | Never mind, got my bits and bytes crossed. |
| 22:55:18 | → | YuutaW joins (~YuutaW@2404:f4c0:f9c3:502::100:17b7) |
| 22:56:01 | → | wroathe joins (~wroathe@user/wroathe) |
| 22:56:23 | <dolio> | EvanR: I'm hard pressed to think of an example where it would actually lead to perceived weirdness in most other languages. Most don't have situations like negation vs. subtraction section. |
| 22:57:29 | → | johnw_ joins (~johnw@69.62.242.138) |
| 22:57:54 | × | johnw quits (~johnw@69.62.242.138) (Ping timeout: 246 seconds) |
| 22:58:15 | × | bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Ping timeout: 246 seconds) |
| 23:02:31 | × | alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Ping timeout: 245 seconds) |
| 23:05:44 | × | merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds) |
| 23:07:11 | × | Zambyte quits (~user@c-73-114-31-74.hsd1.ma.comcast.net) (Remote host closed the connection) |
| 23:07:24 | → | Zambyte joins (~user@c-73-114-31-74.hsd1.ma.comcast.net) |
| 23:09:58 | ← | dmgk parts (~dmgk@user/dmgk) () |
| 23:10:38 | <dolio> | Or, like, in most languages `f -1` would not be confused with a function call, unless `f` is part of special syntax that would make `f - 1` also like a function call. |
| 23:11:06 | <dolio> | (Like `print - 1`) |
| 23:12:36 | × | acidjnk quits (~acidjnk@p200300d6e7072f06a5c472a3c7963a83.dip0.t-ipconnect.de) (Ping timeout: 246 seconds) |
| 23:13:17 | × | caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline) |
| 23:14:01 | × | Pickchea quits (~private@user/pickchea) (Quit: Leaving) |
| 23:19:13 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net) |
| 23:21:02 | → | azr4e1 joins (~azr4e1@2a00:23c7:9cbc:3401:45fb:9c68:12fe:262b) |
| 23:21:08 | × | ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 246 seconds) |
| 23:23:11 | → | ezzieyguywuf joins (~Unknown@user/ezzieyguywuf) |
| 23:24:12 | → | jero98772 joins (~jero98772@2800:484:1d7f:5d36:7b44:d981:f67d:5b1a) |
| 23:24:47 | × | jero98772 quits (~jero98772@2800:484:1d7f:5d36:7b44:d981:f67d:5b1a) (Remote host closed the connection) |
| 23:24:48 | <EvanR> | in reading wikipedia about precedence and parsing algorithms I see a table saying that + - * / are left associative and ^ is right associative. Are these choices good / bad / doesn't matter in haskell? |
| 23:24:50 | × | mechap quits (~mechap@user/mechap) (Ping timeout: 260 seconds) |
| 23:26:07 | <EvanR> | also + and * having associativity seems weird |
| 23:26:19 | <darkling> | It doesn't matter for + and *. It very much matters (by convention) for -, / and ^ |
| 23:26:47 | → | Luj5 joins (~Luj@2a01:e0a:5f9:9681:3e8f:d5c0:40b7:2d50) |
| 23:27:13 | × | Luj quits (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb) (Read error: Connection reset by peer) |
| 23:27:13 | Luj5 | is now known as Luj |
| 23:27:16 | → | gry joins (quasselcor@botters/gry) |
| 23:27:28 | <EvanR> | oh yeah... multiple / in a row... right |
| 23:27:47 | <darkling> | You can use the other associativity for the latter three, but you're going to confuse people. |
| 23:28:16 | <EvanR> | i would have expected a^b^c to be (a^b)^c I don't know why |
| 23:28:49 | <EvanR> | maybe because of the way / works |
| 23:28:50 | <geekosaur> | it makes more sense if you think about the other representation |
| 23:29:24 | <geekosaur> | (with superscripts) |
| 23:29:30 | <darkling> | I think it's the other way around because (a^b)^c is just a^(b*c) and there's a good syntax for that already. |
| 23:29:37 | <int-e> | > (2^2)^2 == 2^(2^2) |
| 23:29:38 | <lambdabot> | True |
| 23:29:43 | <EvanR> | lol |
| 23:29:53 | <darkling> | int-e: Stop that. ;) |
| 23:33:07 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 245 seconds) |
| 23:34:22 | <DigitalKiwi> | > (2^3)^4 == 2^(3^4) |
| 23:34:24 | <lambdabot> | False |
| 23:34:33 | <DigitalKiwi> | KiwiCheck |
| 23:35:01 | <EvanR> | > 1^(2^3) == (1^2)^3 |
| 23:35:02 | <lambdabot> | True |
| 23:35:19 | <EvanR> | so far associativity is winning 2 to 1 |
| 23:35:22 | darkling | cries |
| 23:36:04 | <DigitalKiwi> | tears of laughter |
| 23:36:30 | <int-e> | @check \a b c -> (a :: Double) + (b + c) == (a + b) + c |
| 23:36:31 | <lambdabot> | *** Failed! Falsifiable (after 6 tests and 4 shrinks): |
| 23:36:31 | <lambdabot> | 4.300390628860152 0.7865356995813799 -0.7580302228566115 |
| 23:36:58 | <int-e> | darkling: there you go, + is not associative; you're welcome. |
| 23:37:06 | <darkling> | :D |
| 23:37:15 | <EvanR> | I eat my words |
| 23:37:41 | <DigitalKiwi> | 6 tests out of how many |
| 23:37:51 | <int-e> | 6 |
| 23:38:08 | <EvanR> | that means 5 tests passed, that's pretty good considering |
| 23:38:09 | <int-e> | it stops at 100 tests |
| 23:38:11 | <DigitalKiwi> | oh wait it found 1 after six tests |
| 23:38:15 | <DigitalKiwi> | i thought it found six lol |
| 23:38:48 | <int-e> | > 0.1 + (0.2 + 0.3) == (0.1 + 0.2) + 0.3 |
| 23:38:49 | <lambdabot> | False |
| 23:38:50 | <DigitalKiwi> | so 5/6 |
| 23:39:24 | <DigitalKiwi> | > 5/6 > 2/3 |
| 23:39:25 | <lambdabot> | True |
| 23:39:27 | <EvanR> | asking for software to work better than 5 in 6 is just entitlement |
| 23:39:38 | <int-e> | ouch |
| 23:39:39 | <ddellacosta> | that's what my LLM told me |
| 23:39:47 | <DigitalKiwi> | EvanR: it's better than you thought! |
| 23:39:51 | <darkling> | "Oh, that's nothing, says Man, who goes on to prove that black is white, and gets himself run over on the next zebra crossing" |
| 23:39:52 | <int-e> | EvanR: so you own a Tesla |
| 23:39:58 | <EvanR> | lol |
| 23:40:30 | <DigitalKiwi> | saw a torched car driving my pax on the interstate and said "huh that doesn't look like a tesla" |
| 23:40:31 | <ddellacosta> | darkling, lovely Douglas Adams quote |
| 23:40:35 | <geekosaur> | you don't even need a Tesla for that |
| 23:41:04 | <darkling> | ddellacosta: I justfinished reading The Salmon of Doubt. :) |
| 23:41:10 | × | fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 23:41:15 | <geekosaur> | cars have been capable of bluescreening on you for a couple decades |
| 23:41:56 | <geekosaur> | tesla just failed to learn the lessons every other car manufacturer did the hard way |
| 23:42:16 | <darkling> | s/failed to learn/deliberately ignored/ |
| 23:43:53 | → | sagax joins (~sagax_nb@user/sagax) |
| 23:46:54 | × | gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Ping timeout: 246 seconds) |
| 23:50:00 | × | Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Quit: Leaving.) |
| 23:51:03 | → | mauke_ joins (~mauke@user/mauke) |
| 23:52:38 | × | mauke quits (~mauke@user/mauke) (Ping timeout: 246 seconds) |
| 23:52:38 | mauke_ | is now known as mauke |
| 23:55:52 | → | wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com) |
| 23:55:53 | × | wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host) |
| 23:55:53 | → | wroathe joins (~wroathe@user/wroathe) |
All times are in UTC on 2023-07-07.