Logs on 2025-10-20 (liberachat/#haskell)
| 00:03:54 | × | craunts795335385 quits (~craunts@136.158.7.194) (Read error: Connection reset by peer) |
| 00:04:10 | → | craunts795335385 joins (~craunts@136.158.7.194) |
| 00:05:36 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:10:47 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 00:13:51 | × | machinedgod quits (~machinedg@d75-159-126-101.abhsia.telus.net) (Ping timeout: 256 seconds) |
| 00:21:24 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:24:05 | → | tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net) |
| 00:26:02 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 00:29:53 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 00:32:09 | → | weary-traveler joins (~user@user/user363627) |
| 00:37:11 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:41:55 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 00:42:17 | × | otto_s quits (~user@p4ff274f9.dip0.t-ipconnect.de) (Ping timeout: 244 seconds) |
| 00:44:18 | → | otto_s joins (~user@p5b044609.dip0.t-ipconnect.de) |
| 00:48:30 | → | werneta joins (~werneta@71.83.160.242) |
| 00:50:28 | → | qqe joins (~qqq@185.54.23.200) |
| 00:50:56 | × | trickard quits (~trickard@cpe-57-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 00:51:08 | → | trickard_ joins (~trickard@cpe-57-98-47-163.wireline.com.au) |
| 00:51:22 | × | simplystuart quits (~simplystu@c-75-75-152-164.hsd1.pa.comcast.net) (Ping timeout: 246 seconds) |
| 00:52:57 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:53:50 | → | gustrb joins (~gustrb@191.243.134.87) |
| 00:55:15 | × | flipflops quits (~cmo@2604:3d09:207f:8000::d1dc) (Ping timeout: 252 seconds) |
| 00:56:24 | → | flipflops joins (~cmo@2604:3d09:207f:8000::d1dc) |
| 00:56:25 | × | trickard_ quits (~trickard@cpe-57-98-47-163.wireline.com.au) (Ping timeout: 264 seconds) |
| 00:59:06 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 01:01:23 | → | trickard_ joins (~trickard@cpe-57-98-47-163.wireline.com.au) |
| 01:03:52 | × | flipflops quits (~cmo@2604:3d09:207f:8000::d1dc) (Ping timeout: 260 seconds) |
| 01:09:59 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:10:50 | × | xff0x quits (~xff0x@2405:6580:b080:900:d8fa:98a4:1ba0:2054) (Ping timeout: 248 seconds) |
| 01:15:31 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 01:23:25 | × | inline quits (~inline@ip-178-202-059-161.um47.pools.vodafone-ip.de) (Ping timeout: 264 seconds) |
| 01:27:22 | × | acidjnk quits (~acidjnk@p200300d6e71719659d28c4899d9c5d95.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
| 01:27:32 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:32:25 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 01:41:54 | trickard_ | is now known as trickard |
| 01:43:19 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:48:37 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 01:49:58 | × | ttybitnik quits (~ttybitnik@user/wolper) (Quit: Fading out...) |
| 01:56:45 | × | weary-traveler quits (~user@user/user363627) (Quit: Konversation terminated!) |
| 01:57:01 | → | weary-traveler joins (~user@user/user363627) |
| 01:59:07 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:03:57 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 02:04:48 | → | xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) |
| 02:08:09 | × | werneta quits (~werneta@71.83.160.242) (Quit: Lost terminal) |
| 02:10:32 | → | ephilalethes joins (~noumenon@113.51-175-156.customer.lyse.net) |
| 02:14:54 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:18:38 | → | jxv joins (~simulacru@2600:1700:5040:a200:846b:56ef:4da8:a13) |
| 02:21:40 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 02:23:05 | × | trickard quits (~trickard@cpe-57-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 02:23:18 | → | trickard_ joins (~trickard@cpe-57-98-47-163.wireline.com.au) |
| 02:26:37 | × | jxv quits (~simulacru@2600:1700:5040:a200:846b:56ef:4da8:a13) (Quit: Textual IRC Client: www.textualapp.com) |
| 02:29:40 | → | peterbecich joins (~Thunderbi@172.222.148.214) |
| 02:31:22 | × | td_ quits (~td@i5387091E.versanet.de) (Ping timeout: 248 seconds) |
| 02:33:00 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:33:23 | → | td_ joins (~td@i53870936.versanet.de) |
| 02:33:35 | trickard_ | is now known as trickard |
| 02:36:01 | × | anpad quits (~pandeyan@user/anpad) (Ping timeout: 264 seconds) |
| 02:36:37 | × | peterbecich quits (~Thunderbi@172.222.148.214) (Ping timeout: 264 seconds) |
| 02:38:25 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 02:48:47 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:51:41 | → | khumba joins (~khumba@user/khumba) |
| 02:53:31 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 02:54:47 | × | annamalai quits (~annamalai@157.49.239.48) (Ping timeout: 256 seconds) |
| 03:04:37 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:07:54 | → | anpad joins (~pandeyan@user/anpad) |
| 03:09:08 | × | khumba quits (~khumba@user/khumba) () |
| 03:09:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 03:10:59 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:15:38 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 03:16:13 | × | anpad quits (~pandeyan@user/anpad) (Ping timeout: 264 seconds) |
| 03:17:33 | × | qqe quits (~qqq@185.54.23.200) (Quit: Lost terminal) |
| 03:24:34 | → | khumba joins (~khumba@user/khumba) |
| 03:25:43 | × | img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in) |
| 03:26:12 | → | poscat0x04 joins (~poscat@user/poscat) |
| 03:26:47 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:27:00 | → | img joins (~img@user/img) |
| 03:27:09 | → | werneta joins (~werneta@71.83.160.242) |
| 03:27:54 | × | poscat quits (~poscat@user/poscat) (Ping timeout: 248 seconds) |
| 03:31:19 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 03:40:05 | → | peterbecich joins (~Thunderbi@172.222.148.214) |
| 03:42:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:47:24 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 03:48:50 | → | anpad joins (~pandeyan@user/anpad) |
| 03:52:20 | → | aforemny joins (~aforemny@2001:9e8:6cc7:6800:bfb8:1818:7f09:9156) |
| 03:52:40 | × | aforemny_ quits (~aforemny@2001:9e8:6cea:8700:cf12:fc7b:8ca1:78b9) (Ping timeout: 246 seconds) |
| 03:58:20 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:59:13 | × | tomboy64 quits (~tomboy64@user/tomboy64) (Read error: Connection reset by peer) |
| 03:59:28 | → | tomboy64 joins (~tomboy64@user/tomboy64) |
| 04:05:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 04:06:56 | × | werneta quits (~werneta@71.83.160.242) (Quit: Lost terminal) |
| 04:09:43 | → | wickedjargon joins (~user@120.29.79.98) |
| 04:12:00 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:16:57 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 04:22:35 | × | synchromesh quits (~john@2406:5a00:2412:2c00:3da8:1103:8261:15b5) (Read error: Connection reset by peer) |
| 04:23:20 | → | synchromesh joins (~john@2406:5a00:2412:2c00:75ff:6dec:5332:48f7) |
| 04:27:48 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:28:53 | → | annamalai joins (~annamalai@2409:4072:601a:bdd2::2602:e0ac) |
| 04:32:42 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 04:43:14 | → | michalz joins (~michalz@185.246.207.221) |
| 04:43:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:48:26 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 04:59:23 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:01:05 | → | rvalue- joins (~rvalue@about/hackers/rvalue) |
| 05:01:07 | → | jreicher joins (~user@user/jreicher) |
| 05:01:39 | × | rvalue quits (~rvalue@about/hackers/rvalue) (Ping timeout: 244 seconds) |
| 05:04:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 05:05:21 | → | halloy9957 joins (~halloy995@ip72-208-127-103.ph.ph.cox.net) |
| 05:10:56 | → | rvalue joins (~rvalue@about/hackers/rvalue) |
| 05:11:55 | × | rvalue- quits (~rvalue@about/hackers/rvalue) (Ping timeout: 256 seconds) |
| 05:13:01 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:13:52 | × | infinity0 quits (~infinity0@pwned.gg) (Ping timeout: 246 seconds) |
| 05:14:01 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 05:14:17 | → | Googulator joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 05:15:51 | → | Googulator31 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 05:15:55 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Client Quit) |
| 05:15:58 | → | takuan joins (~takuan@d8D86B9E9.access.telenet.be) |
| 05:17:46 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 05:19:48 | × | EvanR quits (~EvanR@user/evanr) (Ping timeout: 252 seconds) |
| 05:21:04 | × | khumba quits (~khumba@user/khumba) () |
| 05:27:22 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 248 seconds) |
| 05:28:05 | → | notzmv joins (~umar@user/notzmv) |
| 05:28:48 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:34:36 | → | infinity0 joins (~infinity0@pwned.gg) |
| 05:36:01 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 05:42:24 | × | jreicher quits (~user@user/jreicher) (Read error: Connection reset by peer) |
| 05:45:25 | → | jreicher joins (~user@user/jreicher) |
| 05:45:43 | × | Googulator31 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 05:45:49 | → | Googulator22 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 05:46:18 | × | ephilalethes quits (~noumenon@113.51-175-156.customer.lyse.net) (Quit: Leaving) |
| 05:46:50 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:52:13 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 06:02:02 | → | Square joins (~Square4@user/square) |
| 06:02:38 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:05:27 | × | Square2 quits (~Square@user/square) (Ping timeout: 260 seconds) |
| 06:05:37 | → | Googulator96 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 06:05:40 | × | Googulator22 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 06:07:49 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 06:14:02 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:18:55 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 06:22:16 | × | craunts795335385 quits (~craunts@136.158.7.194) (Quit: The Lounge - https://thelounge.chat) |
| 06:29:50 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:31:36 | × | halloy9957 quits (~halloy995@ip72-208-127-103.ph.ph.cox.net) (Quit: halloy9957) |
| 06:35:12 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 06:42:24 | × | Googulator96 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 06:42:42 | → | Googulator96 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 06:44:13 | × | JimL quits (~quassel@89.162.16.26) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 06:45:37 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:47:21 | → | JimL joins (~quassel@89.162.16.26) |
| 06:48:37 | × | jmcantrell quits (~weechat@user/jmcantrell) (Ping timeout: 264 seconds) |
| 06:51:01 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 06:53:00 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 06:56:29 | → | gmg joins (~user@user/gehmehgeh) |
| 07:00:03 | × | caconym7478798 quits (~caconym@user/caconym) (Quit: bye) |
| 07:00:47 | → | caconym7478798 joins (~caconym@user/caconym) |
| 07:01:24 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 07:06:37 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 07:13:50 | → | Guest57 joins (~Guest57@95.214.217.190) |
| 07:13:52 | → | gustrb joins (~gustrb@191.243.134.87) |
| 07:14:45 | × | peterbecich quits (~Thunderbi@172.222.148.214) (Ping timeout: 252 seconds) |
| 07:15:03 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 07:15:13 | → | tromp joins (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) |
| 07:18:59 | → | kukimik joins (~kukimik@nat1.mga.com.pl) |
| 07:20:24 | × | kukimik quits (~kukimik@nat1.mga.com.pl) (Remote host closed the connection) |
| 07:21:37 | → | chele joins (~chele@user/chele) |
| 07:21:46 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 07:28:53 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 07:33:08 | → | EvanR joins (~EvanR@user/evanr) |
| 07:34:46 | <dminuoso> | Are liftXXX primitives perhaps misnamed? It just occured to me that `liftIO :: IO a -> SomeT IO a` doesnt really pull anything out, it rather stuffs something in! |
| 07:34:49 | × | weary-traveler quits (~user@user/user363627) (Remote host closed the connection) |
| 07:34:53 | <dminuoso> | stuffIO seems more appropriate. |
| 07:38:40 | <davean> | It lifts an IO |
| 07:38:45 | <davean> | Its what it lifts |
| 07:39:37 | <dminuoso> | To me lifting suggests rather pulling something out. |
| 07:41:42 | <davean> | SomeT is build on IO, and it is a higher universe of semantics |
| 07:41:52 | <davean> | You are lifting it into the greater semantic world |
| 07:42:14 | <davean> | SomeT contains IO. |
| 07:42:43 | × | tabemann quits (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Remote host closed the connection) |
| 07:42:47 | <dminuoso> | Well you're embedding a plain IO action into something richer, you're stuffing it into a richer description of a computation. |
| 07:43:08 | <davean> | No you aren't embedding it, it is *already embeded* SomeT has all of IO |
| 07:43:12 | → | tabemann joins (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) |
| 07:43:22 | <davean> | IO is a subsection of SomeT IO |
| 07:43:33 | <davean> | It specificly isn't embedding |
| 07:44:05 | × | emmanuelux quits (~emmanuelu@user/emmanuelux) (Remote host closed the connection) |
| 07:44:37 | <davean> | you can lower SomeT IO into just IO |
| 07:46:07 | → | srazkvt joins (~sarah@user/srazkvt) |
| 07:46:14 | <davean> | IO is the foundation of SomeT |
| 07:46:23 | <davean> | SomeT is what is built on top |
| 07:49:13 | → | Guest31 joins (~Guest57@95.214.217.190) |
| 07:49:36 | × | Guest57 quits (~Guest57@95.214.217.190) (Quit: Client closed) |
| 07:49:44 | × | Guest31 quits (~Guest57@95.214.217.190) (Client Quit) |
| 07:50:34 | <dminuoso> | davean: But at the same time, when we talk about transformers, we say we layer monads *ontop* of a base. In `SomeT IO` you generally call IO a base monad. |
| 07:51:05 | <davean> | Yes, exactly, hence lifting |
| 07:52:49 | × | trickard quits (~trickard@cpe-57-98-47-163.wireline.com.au) (Ping timeout: 264 seconds) |
| 07:53:08 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 07:55:05 | <davean> | IO is the base, SomeT is on top, thus we *lift IO into SomeT* |
| 07:55:21 | <davean> | Because it is semanticly beneith SomeT IO |
| 07:59:22 | → | acidjnk joins (~acidjnk@p200300d6e7171945c42b348415052731.dip0.t-ipconnect.de) |
| 08:05:00 | → | merijn joins (~merijn@77.242.116.146) |
| 08:05:53 | × | jreicher quits (~user@user/jreicher) (Ping timeout: 256 seconds) |
| 08:06:12 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 244 seconds) |
| 08:07:18 | × | img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in) |
| 08:08:25 | <monochrom> | The best thing about meaningful names is that there are so many meanings to choose from! |
| 08:08:35 | → | img joins (~img@user/img) |
| 08:10:37 | → | Googulator64 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 08:10:38 | × | Googulator96 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 08:17:46 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 08:18:43 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Client Quit) |
| 08:19:49 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 08:19:53 | → | fp joins (~Thunderbi@2001:708:20:1406::10c5) |
| 08:20:41 | → | gustrb joins (~gustrb@191.243.134.87) |
| 08:22:19 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 256 seconds) |
| 08:29:26 | → | kubrat joins (~kubrat@149.62.205.212) |
| 08:30:16 | × | mzg_ quits (mzg@abusers.hu) (Remote host closed the connection) |
| 08:30:40 | × | synchromesh quits (~john@2406:5a00:2412:2c00:75ff:6dec:5332:48f7) (Read error: Connection reset by peer) |
| 08:31:59 | → | synchromesh joins (~john@2406:5a00:2412:2c00:75ff:6dec:5332:48f7) |
| 08:32:26 | × | chromoblob quits (~chromoblo@user/chromob1ot1c) (Ping timeout: 248 seconds) |
| 08:34:08 | → | merijn joins (~merijn@77.242.116.146) |
| 08:34:55 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 08:37:37 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 265 seconds) |
| 08:39:09 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 08:39:44 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 240 seconds) |
| 08:40:58 | <dminuoso> | davean: I guess if we just think of monad transformers or just constructions that eventually embed as some kinds of pyramid, it seems rather arbitrary whether we imagine the pyramid to have its tip pointed downwards or upwards. |
| 08:43:05 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 08:45:37 | → | merijn joins (~merijn@77.242.116.146) |
| 08:45:38 | × | Googulator64 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 08:45:49 | → | Googulator64 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 08:46:56 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 240 seconds) |
| 08:47:07 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 08:48:20 | <davean> | dminuoso: don't think of it as a peramid, think of its a sphere with subspheres nested inside it |
| 08:48:27 | <davean> | expanding out from zero |
| 08:48:46 | <dminuoso> | davean: Sure, and in that model wouldnt we think of IO as the inner core? |
| 08:49:07 | <davean> | It *is* the inner core, its not that we choose to think about it, it is litterly enclosed by |
| 08:49:18 | <dminuoso> | If we take a given IO action, say `putStrLn "Hello world"`, then its the action of putting that core inside layers and layers until we have a matching sphere. |
| 08:49:26 | <dminuoso> | Rather than pulling it out. |
| 08:50:05 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 256 seconds) |
| 08:51:23 | <dminuoso> | This may just be the difference between operational and semantic thinking. |
| 08:51:41 | <davean> | No, putStrLn is already an object in IO, it has no other existance |
| 08:52:01 | <dminuoso> | Well I meant `liftIO (putStrLn "foo")` of course. |
| 08:52:48 | <davean> | Write, that projects from the IO space to the IO subspace of SomeT IO |
| 08:52:51 | <tomsmeding> | dminuoso: I think of liftIO as lifting "into SomeT", not "out of IO" |
| 08:53:00 | <davean> | Yah, it NEVER LEAVES IO |
| 08:53:04 | <davean> | It can't leave IO |
| 08:53:07 | <tomsmeding> | the sky above is larger than you, so lifting moves it into the larger thing |
| 08:53:44 | <davean> | it maps the IO subspace into the SomeT space, and specicily the IO subspace of said |
| 08:54:04 | <tomsmeding> | indeed, SomeT IO may well have more logic than IO itself, so also in that sense, it's "lifting" into a more exalted space of SomeT IO computations |
| 08:54:17 | <tomsmeding> | it's exactly what monochrom said |
| 08:55:22 | <davean> | what did monochrom say? |
| 08:55:33 | <tomsmeding> | 47 minutes ago |
| 08:55:40 | <dminuoso> | Dont all monad transformers put the base monad on the outside, in the sense that if we have some tranformer stack over IO, ultimately we have something like `IO ((M1 :.: M2 :.: ...) a)` (and possibly a lambda outside for Reader)? |
| 08:55:43 | <tomsmeding> | <monochrom> The best thing about meaningful names is that there are so many meanings to choose from! |
| 08:56:16 | <davean> | dminuoso: no, no, that is very much NOT what they do |
| 08:56:23 | <tomsmeding> | https://hackage.haskell.org/package/transformers-0.6.1.0/docs/Control-Monad-Trans-State-Strict.html#t:StateT |
| 08:56:33 | <tomsmeding> | StateT s m a ~= s -> m (a, s) |
| 08:56:34 | <dminuoso> | Ah I guess not. |
| 08:56:46 | <davean> | dminuoso: which I think is where your confusion is |
| 08:56:47 | <tomsmeding> | when you run them, you get a computation inside m, yes |
| 08:56:59 | <dminuoso> | davean: No, this is actually just a tangent I was starting to explore. |
| 08:57:19 | <tomsmeding> | and contrary to what davean is saying, I do not think your perspective is wrong, it's just a perspective that mismatches with what I think is the intended intuition behind "lift" |
| 08:57:26 | <dminuoso> | davean: Until now I was just focused more on thinking of transformers as a syntactical construct where IO resided in since thats how I think of how the effects compose. |
| 08:58:11 | <davean> | It isn't how the effects compose though, which gets really improtant with state and such |
| 08:58:19 | <dminuoso> | tomsmeding: Perhaps. liftIO is just one of the few things that never really clicked on the naming to me. |
| 08:58:58 | <dminuoso> | davean: Apart from ReaderT, I've never really used transformers much for a bunch of reasons. |
| 08:59:21 | <dminuoso> | Except for some local computation tricks. |
| 08:59:44 | <dminuoso> | Say something like runMaybeT $ do ... |
| 09:00:11 | → | __monty__ joins (~toonn@user/toonn) |
| 09:00:54 | <dminuoso> | Despite transformers being labeled with terms like "composition of effects", they are the antithesis of compositionality of library code. |
| 09:02:19 | <davean> | How so? |
| 09:04:01 | <srazkvt> | ig because instead of being able to call both functions for the wrapped monad, you need to lift the computations ? |
| 09:04:26 | <dminuoso> | If you use hard-wired transformers its really hard to compose different transformer code together. If you use mtl code you lack effect order specification. As a result you have a large variety of effect libraries that try to address these issues. |
| 09:04:47 | <dminuoso> | As a consequence hackage now is filled with code that ends up using any combination. |
| 09:05:37 | <dminuoso> | The only effect that is universally compatible with most libraries is pure IO. |
| 09:06:56 | <davean> | mtl you have a specific monad and then properties about it that you can use |
| 09:07:13 | → | merijn joins (~merijn@77.242.116.146) |
| 09:08:30 | × | fp quits (~Thunderbi@2001:708:20:1406::10c5) (Ping timeout: 256 seconds) |
| 09:12:26 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 248 seconds) |
| 09:21:26 | × | tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz) |
| 09:23:16 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 09:23:35 | <endokqr> | I am profiling (+RTS -p) a Haskell program that runs for quite some time and I am interested in data from the full run. Unfortunately, this makes the time huge! I thought I'd be able to adjust the resolution of the time profile with -i and/or -V, but this seems to have no effect. What am I misunderstanding? |
| 09:23:40 | → | merijn joins (~merijn@77.242.116.146) |
| 09:24:43 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 09:32:27 | → | fp joins (~Thunderbi@130.233.70.140) |
| 09:33:01 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 264 seconds) |
| 09:40:15 | → | merijn joins (~merijn@77.242.116.146) |
| 09:43:39 | × | trickard_ quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 09:43:52 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 09:47:59 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 09:50:27 | <dminuoso> | endokqr: -i is just the sampling rate, think of it how accurate/finely grained the data is. |
| 09:50:45 | <dminuoso> | In practice this controls the data size of the profiling data |
| 09:51:02 | <endokqr> | dminuoso, Yeah, and I would imagine by setting -i to e.g. "10 Hz" would give me fewer stack frames in the time profile. But whatever number I pass there I get the same 9.1 GB .prof file. |
| 09:51:35 | <dminuoso> | endokqr: No, the cost centers are collected regardless. The interval is just how often the RTS stops and writes a record. |
| 09:51:47 | → | mreh joins (~matthew@host86-146-25-125.range86-146.btcentralplus.com) |
| 09:52:21 | <dminuoso> | The "stack frames" what you describe is just the cost centers. |
| 09:52:31 | <endokqr> | Ooooh, okay. So the only solution for me is to either post-process the .prof file and try to recognise "unimportant" branches of the tree and prune them, or go in and try to assign cost centres more intelligently? |
| 09:52:38 | <dminuoso> | Yes. |
| 09:53:10 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 09:53:34 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Write error: Connection reset by peer) |
| 09:53:46 | <dminuoso> | endokqr: You might find https://github.com/fpco/ghc-prof-flamegraph of interest (haven't used it in a few years, but I think it should still work fine) |
| 09:54:34 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 09:54:49 | <endokqr> | That's what I'm aiming for, but on the full 9.1 GB file it eats all my 48 GB of RAM and then my system starts thrashing. |
| 09:55:22 | <endokqr> | But I could steal code from it to flatten the .prof file and then sample from it – that way I'm likely to get a subset of more interesting cost centres without difficult heuristics. |
| 09:55:43 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Write error: Broken pipe) |
| 09:56:32 | <dminuoso> | endokqr: Btw, it coulkd be sufficient to explicitly declare cost centers on branches you *dont* want to profile, as -fprof-auto (which I presume you are using) does not poke deeper if you attached a cost center. |
| 09:56:52 | <dminuoso> | In the profiling data it would just collapse it into a single cost center. |
| 09:57:16 | × | srazkvt quits (~sarah@user/srazkvt) (Quit: Konversation terminated!) |
| 09:58:57 | <dminuoso> | Or you control it per-module with {-# OPTIONS_GHC -fno-prof-auto #-} |
| 09:59:26 | <dminuoso> | This might give you enough routes to explore |
| 09:59:43 | <endokqr> | That would be a rather useful trick. I'm not yet entirely sure where I'd put those annotations because I don't know where the interesting stuff and where it's not, but maybe I could figure that out either by first downsampling or spending a few minutes to think about it. |
| 10:02:28 | × | SlackCoder quits (~SlackCode@208.26.91.234) (Remote host closed the connection) |
| 10:04:25 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 244 seconds) |
| 10:05:06 | → | jreicher joins (~user@user/jreicher) |
| 10:05:30 | → | merijn joins (~merijn@77.242.116.146) |
| 10:08:05 | → | mzg joins (mzg@abusers.hu) |
| 10:10:02 | × | xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 248 seconds) |
| 10:11:04 | → | CiaoSen joins (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) |
| 10:15:52 | trickard_ | is now known as trickard |
| 10:22:18 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 252 seconds) |
| 10:32:22 | × | Googulator64 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 10:32:37 | → | Googulator64 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 10:34:40 | → | merijn joins (~merijn@77.242.116.146) |
| 10:35:38 | × | trickard quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 10:35:52 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 10:56:06 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection timed out) |
| 10:56:31 | Googulator64 | is now known as Googulator |
| 11:00:17 | → | chromoblob joins (~chromoblo@user/chromob1ot1c) |
| 11:05:57 | → | qqe joins (~qqq@185.54.23.200) |
| 11:09:17 | → | weary-traveler joins (~user@user/user363627) |
| 11:13:18 | → | xff0x joins (~xff0x@2405:6580:b080:900:6316:ba02:9166:40eb) |
| 11:13:58 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 11:15:43 | → | Googulator87 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 11:15:43 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 11:21:54 | × | tromp quits (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 11:22:00 | × | chromoblob quits (~chromoblo@user/chromob1ot1c) (Ping timeout: 245 seconds) |
| 11:22:19 | → | inline joins (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) |
| 11:22:38 | → | chromoblob joins (~chromoblo@user/chromob1ot1c) |
| 11:24:55 | Googulator87 | is now known as Googulator |
| 11:25:59 | → | Googulator7 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 11:26:12 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 11:26:14 | Googulator7 | is now known as Googulator |
| 11:27:21 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 11:30:44 | → | Lycurgus joins (~juan@user/Lycurgus) |
| 11:36:54 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 244 seconds) |
| 11:37:06 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 11:37:31 | × | chromoblob quits (~chromoblo@user/chromob1ot1c) (Read error: Connection reset by peer) |
| 11:37:53 | → | chromoblob joins (~chromoblo@user/chromob1ot1c) |
| 11:37:59 | × | kubrat quits (~kubrat@149.62.205.212) (Ping timeout: 250 seconds) |
| 11:38:25 | Lord_of_Life_ | is now known as Lord_of_Life |
| 11:41:08 | → | srazkvt joins (~sarah@user/srazkvt) |
| 11:52:55 | → | inline_ joins (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) |
| 11:54:10 | → | inline__ joins (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) |
| 11:55:19 | trickard_ | is now known as trickard |
| 11:56:01 | × | inline quits (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) (Ping timeout: 244 seconds) |
| 11:56:20 | × | Lycurgus quits (~juan@user/Lycurgus) (Quit: alsoknownas.renjuan.org ( juan@acm.org )) |
| 11:57:56 | × | inline_ quits (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) (Ping timeout: 256 seconds) |
| 12:00:55 | → | kubrat joins (~kubrat@149.62.205.137) |
| 12:15:34 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 12:15:37 | → | Googulator54 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 12:15:40 | → | SlackCoder joins (~SlackCode@208.26.91.234) |
| 12:17:02 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 12:20:45 | → | Googulator74 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 12:21:01 | × | Googulator54 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 12:30:13 | × | Natch quits (~natch@c-92-34-15-120.bbcust.telenor.se) (Ping timeout: 244 seconds) |
| 12:35:42 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 12:37:38 | → | tromp joins (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) |
| 12:40:10 | × | synchromesh quits (~john@2406:5a00:2412:2c00:75ff:6dec:5332:48f7) (Read error: Connection reset by peer) |
| 12:41:40 | → | synchromesh joins (~john@2406:5a00:2412:2c00:75ff:6dec:5332:48f7) |
| 12:48:52 | <endokqr> | Appears non-trivial to post-process the profile data so I'm going to go with reducing the number of cost centres for now. Realised many of them are in third-party packages, which is useful information, but if it's preventing me from looking at the profile at all in a sensible way it's gonna have to go. Rebuilding dependencies without cost centres. (This also prevents the clever explicit cost |
| 12:48:55 | <endokqr> | centre hack from being very helpful!) |
| 12:51:40 | × | trickard quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 12:51:54 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 12:55:28 | × | hsw_ quits (~hsw@112-104-9-97.adsl.dynamic.seed.net.tw) (Remote host closed the connection) |
| 12:55:52 | → | hsw_ joins (~hsw@112-104-9-97.adsl.dynamic.seed.net.tw) |
| 12:56:42 | × | CiaoSen quits (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) (Ping timeout: 260 seconds) |
| 12:56:57 | → | simplystuart joins (~simplystu@c-75-75-152-164.hsd1.pa.comcast.net) |
| 12:57:43 | × | divlamir quits (~divlamir@user/divlamir) (Read error: Connection reset by peer) |
| 12:58:04 | → | divlamir joins (~divlamir@user/divlamir) |
| 13:01:36 | → | ttybitnik joins (~ttybitnik@user/wolper) |
| 13:12:40 | × | chexum_ quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 13:12:58 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 13:16:22 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 272 seconds) |
| 13:16:28 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 13:16:49 | × | Square quits (~Square4@user/square) (Ping timeout: 264 seconds) |
| 13:20:38 | → | Googulator50 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 13:20:42 | × | Googulator74 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 13:21:17 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 13:23:34 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 13:24:20 | → | FirefoxDeHuk59 joins (~FirefoxDe@109.108.69.106) |
| 13:24:37 | × | FirefoxDeHuk59 quits (~FirefoxDe@109.108.69.106) (Client Quit) |
| 13:25:58 | → | FirefoxDeHuk5 joins (~FirefoxDe@109.108.69.106) |
| 13:26:15 | × | FirefoxDeHuk5 quits (~FirefoxDe@109.108.69.106) (Client Quit) |
| 13:27:37 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 260 seconds) |
| 13:28:34 | → | FirefoxDeHuk joins (~FirefoxDe@109.108.69.106) |
| 13:28:52 | × | FirefoxDeHuk quits (~FirefoxDe@109.108.69.106) (Write error: Broken pipe) |
| 13:28:54 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 13:31:04 | → | FirefoxDeHuk65 joins (~FirefoxDe@109.108.69.106) |
| 13:31:34 | → | Zemy joins (~Zemy@2600:100c:b0a4:2b52:2c62:6eff:fe24:bb14) |
| 13:31:34 | × | Zemy_ quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer) |
| 13:32:05 | → | Zemy_ joins (~Zemy@72.178.108.235) |
| 13:36:22 | × | Zemy quits (~Zemy@2600:100c:b0a4:2b52:2c62:6eff:fe24:bb14) (Ping timeout: 260 seconds) |
| 13:37:32 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 260 seconds) |
| 13:37:36 | → | humasect joins (~humasect@dyn-192-249-132-90.nexicom.net) |
| 13:39:57 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 13:40:33 | × | Pozyomka quits (~pyon@user/pyon) (Ping timeout: 250 seconds) |
| 13:42:38 | → | Pozyomka joins (~pyon@user/pyon) |
| 13:43:54 | × | tt12310978324354 quits (~tt1231@2603:6010:8700:4a81:a4f6:acff:fe95:3803) (Ping timeout: 248 seconds) |
| 13:44:25 | → | Zemy joins (~Zemy@2600:100c:b0a4:2b52:30cd:7ff:fe22:3d41) |
| 13:44:26 | × | Zemy_ quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer) |
| 13:44:49 | → | Zemy_ joins (~Zemy@72.178.108.235) |
| 13:48:43 | × | Zemy quits (~Zemy@2600:100c:b0a4:2b52:30cd:7ff:fe22:3d41) (Ping timeout: 246 seconds) |
| 13:52:16 | × | SlackCoder quits (~SlackCode@208.26.91.234) (Ping timeout: 244 seconds) |
| 13:52:52 | → | myxos joins (~myxos@65.25.110.175) |
| 14:02:34 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 14:04:36 | × | srazkvt quits (~sarah@user/srazkvt) (Quit: Konversation terminated!) |
| 14:07:31 | × | FirefoxDeHuk65 quits (~FirefoxDe@109.108.69.106) (Quit: Client closed) |
| 14:22:09 | × | fp quits (~Thunderbi@130.233.70.140) (Ping timeout: 256 seconds) |
| 14:26:13 | → | fp joins (~Thunderbi@130.233.55.40) |
| 14:27:32 | × | fp quits (~Thunderbi@130.233.55.40) (Remote host closed the connection) |
| 14:28:32 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer) |
| 14:30:47 | → | fp joins (~Thunderbi@wireless-86-50-140-208.open.aalto.fi) |
| 14:31:41 | inline__ | is now known as Inline |
| 14:33:10 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 246 seconds) |
| 14:35:02 | × | tromp quits (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 14:35:47 | → | Googulator52 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 14:35:48 | × | Googulator50 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 14:35:53 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 14:37:49 | × | fp quits (~Thunderbi@wireless-86-50-140-208.open.aalto.fi) (Ping timeout: 264 seconds) |
| 14:40:35 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 14:45:37 | trickard_ | is now known as trickard |
| 15:00:37 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 264 seconds) |
| 15:01:40 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 15:07:00 | → | tromp joins (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) |
| 15:09:24 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 252 seconds) |
| 15:10:17 | × | wickedjargon quits (~user@120.29.79.98) (Ping timeout: 260 seconds) |
| 15:13:01 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 15:16:03 | × | ttybitnik quits (~ttybitnik@user/wolper) (Quit: Fading out...) |
| 15:19:43 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 240 seconds) |
| 15:22:02 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 15:25:42 | × | qqe quits (~qqq@185.54.23.200) (Quit: Lost terminal) |
| 15:28:40 | → | machinedgod joins (~machinedg@d75-159-126-101.abhsia.telus.net) |
| 15:28:59 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 244 seconds) |
| 15:29:18 | → | flipflops joins (~cmo@2604:3d09:207f:8000::d1dc) |
| 15:30:09 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 15:31:19 | × | trickard quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 15:31:33 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 15:33:10 | Googulator52 | is now known as Googulator |
| 15:33:39 | × | chromoblob quits (~chromoblo@user/chromob1ot1c) (Ping timeout: 250 seconds) |
| 15:34:03 | → | chromoblob joins (~chromoblo@user/chromob1ot1c) |
| 15:34:44 | × | humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection) |
| 15:37:48 | → | inline_ joins (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) |
| 15:37:56 | → | kuribas joins (~user@2a02-1810-2825-6000-f3eb-4fa2-cbb5-436b.ip6.access.telenet.be) |
| 15:41:12 | × | Inline quits (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) (Ping timeout: 256 seconds) |
| 15:47:35 | ladyfriday | is now known as mrmonday |
| 15:55:44 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 16:01:26 | × | inline_ quits (~inline@2a02:8071:57a1:1260:38c6:b31e:f98a:452e) (Ping timeout: 244 seconds) |
| 16:05:34 | × | flipflops quits (~cmo@2604:3d09:207f:8000::d1dc) (Ping timeout: 246 seconds) |
| 16:07:16 | → | AeIo joins (~AeIo@109.108.69.106) |
| 16:08:04 | × | AeIo quits (~AeIo@109.108.69.106) (Write error: Broken pipe) |
| 16:13:11 | <EvanR> | geekosaur, I heard matrix had an outage recently. Maybe the bridge hasn't been properly restored |
| 16:13:18 | <EvanR> | haven't seen anyone talk through it in a while |
| 16:13:41 | <geekosaur> | sm did yesterday |
| 16:13:49 | <EvanR> | oh |
| 16:14:24 | <geekosaur> | and there've been several conversations the past few days involving multiple Matrix users in #xmonad and #ghc |
| 16:15:46 | <geekosaur> | and I've seen a few more in other bridged channels I'm not normally in (e.g. #haskell-wasm); Matrix-side they're in my "low priority" list which I scan at least once a day to make sure things are okay |
| 16:20:43 | → | Googulator33 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 16:20:45 | × | Googulator quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 16:21:37 | × | td_ quits (~td@i53870936.versanet.de) (Ping timeout: 264 seconds) |
| 16:21:48 | × | chromoblob quits (~chromoblo@user/chromob1ot1c) (Read error: Connection reset by peer) |
| 16:22:17 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 256 seconds) |
| 16:23:41 | <haskellbridge> | <sm> I haven't noticed an outage EvanR |
| 16:24:14 | <EvanR> | it was sep 2 |
| 16:24:40 | <geekosaur> | yeh, I figured you meant that one |
| 16:25:05 | × | kuribas quits (~user@2a02-1810-2825-6000-f3eb-4fa2-cbb5-436b.ip6.access.telenet.be) (Remote host closed the connection) |
| 16:25:08 | <haskellbridge> | <sm> I have noticed chats seem quieter of late |
| 16:25:13 | <geekosaur> | same |
| 16:25:26 | <geekosaur> | and not only haskell chats |
| 16:26:52 | <geekosaur> | FP Discord also has seemed a bit quieter than usual of late, and not only about Haskell (there was a lot of OCaml and Racket chat that went away) |
| 16:27:25 | <haskellbridge> | <sm> maybe libera has some stats |
| 16:28:03 | → | td_ joins (~td@2001:9e8:19d3:4b00:581b:6633:814:8863) |
| 16:28:55 | <EvanR> | as the universe expands anyone separated by enough space recedes into the distance and decrease in frequency |
| 16:30:21 | <geekosaur> | dunno if libera does, but tomsmeding's log bot does |
| 16:30:50 | → | jmcantrell joins (~weechat@user/jmcantrell) |
| 16:32:32 | <geekosaur> | hm, maybe it doesn't any more |
| 16:32:41 | <geekosaur> | used to have a stats page for each channel |
| 16:33:24 | <geekosaur> | including things like a nick word cloud by message frequency. I guess he pruned it |
| 16:40:14 | × | weary-traveler quits (~user@user/user363627) (Remote host closed the connection) |
| 16:43:10 | <haskellbridge> | <Morj> You won't believe how quiet erlang chats are |
| 16:43:27 | <EvanR> | it's all about elixir discord |
| 16:43:32 | <haskellbridge> | <Morj> Very sad, I had to ask an llm to give me advice |
| 16:43:59 | <haskellbridge> | <Morj> Yea and an llm would also give elixir answers instead of erlang |
| 16:44:05 | <EvanR> | lol |
| 16:44:29 | <EvanR> | sounds like a blind spot |
| 16:45:16 | → | turlando joins (~turlando@user/turlando) |
| 16:45:26 | → | chromoblob joins (~chromoblo@user/chromob1ot1c) |
| 16:45:33 | <haskellbridge> | <Morj> «too far off the data distribution» is what they say |
| 16:45:45 | → | Googulator30 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 16:45:45 | × | Googulator33 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 16:47:45 | <haskellbridge> | <Morj> Actually I have no idea how far off the data distribution is haskell, because most questions I have are not even answered by humans |
| 16:48:34 | <EvanR> | they're answered by the type signature? xD |
| 16:48:52 | <haskellbridge> | <Morj> :D |
| 16:49:08 | <haskellbridge> | <Morj> No yeah but hoogle is so great. I miss it every day I write in rust |
| 16:49:30 | × | kimiamania99 quits (~92460e22@user/kimiamania) (Quit: PegeLinux) |
| 16:50:41 | → | flipflops joins (~cmo@2604:3d09:207f:8000::d1dc) |
| 16:59:11 | × | tromp quits (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:04:41 | <haskellbridge> | <doc> is there a way to auto derive instances like Num a => Num (Foo a) where { (+) = liftA2 (+); (-) = liftA2 (-); (_) = liftA2 (_); abs = fmap abs; fromInteger = pure . fromInteger; etc etc} where Foo is an applicative and all the methods just plumb fmap/liftA, liftA2, and pure… I read a thread on r/haskell abt this and it was recommended to write this out for each type you need this for, which is perfectly fine, but am curious if there's any... |
| 17:04:47 | <haskellbridge> | ... deriving magic that can do this |
| 17:06:04 | × | kubrat quits (~kubrat@149.62.205.137) (Quit: Client closed) |
| 17:07:06 | × | flipflops quits (~cmo@2604:3d09:207f:8000::d1dc) (Ping timeout: 252 seconds) |
| 17:08:31 | <geekosaur> | no auto derive, but you can in fact write an instance that works for any Applicative |
| 17:09:16 | <geekosaur> | the main argument against is that it leads to unexpected behavior, mostly due to ((->) e) being Applicative |
| 17:10:37 | × | Googulator30 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 17:10:42 | → | Googulator67 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 17:13:03 | <geekosaur> | instance (Applicative f, Num a) => Num (f a) where (+) = liftA2 (+); (-) = liftA2 (-); (*) = liftA2 (*); negate = fmap negate; abs = fmap abs; signum = fmap signum; fromInteger = pure . fromInteger |
| 17:13:22 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 17:14:06 | <geekosaur> | this and Num polymorphism means using that instance is a good way to induce insanity |
| 17:14:30 | <haskellbridge> | <doc> yep this was also mentioned on that discussion i read, to avoid having this general instance in scope |
| 17:14:54 | <geekosaur> | it shouldn't be difficult to write some TH to auto-derive it |
| 17:17:58 | → | kubrat joins (~kubrat@149.62.205.137) |
| 17:18:12 | → | qqe joins (~qqq@185.54.23.200) |
| 17:20:23 | × | kubrat quits (~kubrat@149.62.205.137) (Client Quit) |
| 17:31:05 | → | mastarija joins (~mastarija@89-164-108-176.dsl.iskon.hr) |
| 17:31:22 | → | tromp joins (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) |
| 17:32:12 | <mastarija> | Is there a way to recover the actual type from generics? The type names are written out as a type level string, but I'd like to somehow recover the original type. |
| 17:32:31 | <mastarija> | I'd like to construct a type level list of all the field types of a product type. |
| 17:33:59 | <mastarija> | I'm thinking it might be possible to hack a HasField + type family to get the fields since there's a functional dependency between the parent type, type level field name and the type of the field. |
| 17:34:37 | <mastarija> | But that will only work on product types that have field names (if it's even possible to use HasField like that). |
| 17:35:27 | <geekosaur> | I think the actual type is available, but not that way. Generics are built on Data.Data iirc, which should allow getting the actual type I think? |
| 17:36:09 | <mastarija> | Hm... interesting. I did not know that. |
| 17:37:47 | <geekosaur> | my recollection is Generics <- Data.Data <- Typeable, but while Typeable has the type available in some sense it's not powerful enough to make it directly available; the best you can do is its `cast` which produces a `Maybe targetType` |
| 17:38:17 | <geekosaur> | that said, it's entirely possible I remember wrong and Data.Data is the basis for a different generics implementation (SYB seems most likely in that case) |
| 17:38:32 | <mastarija> | Yeah. They mention something about that. |
| 17:38:33 | <tomsmeding> | I'm fairly sure Data.Data is not involved here |
| 17:38:41 | <tomsmeding> | Data.Data is untyped, and GHC.Generics is quite typed |
| 17:38:42 | <mastarija> | I think Typeable is not what I want. |
| 17:39:00 | <geekosaur> | it's not; like I said, it's not strong enough |
| 17:39:07 | <tomsmeding> | mastarija: which type exactly are you looking for? The type of a field? |
| 17:39:35 | <mastarija> | Like, my ultimate goal is to be able to make a `toTuple` / `fromTuple` instances where I could generically convert any product type into a tuple. |
| 17:39:51 | <mastarija> | But yes. Type of a field is what I'm looking for. |
| 17:39:58 | <tomsmeding> | the field types are simply there inside the Rec0 constructors |
| 17:40:16 | <mastarija> | When using `Rep` I unfortunatelly do not get that. |
| 17:40:21 | <mastarija> | Wait, really? |
| 17:40:26 | <tomsmeding> | % :seti -XDeriveGeneric |
| 17:40:26 | <yahb2> | <no output> |
| 17:40:32 | <tomsmeding> | % data A = A Int Bool deriving (Generic) |
| 17:40:32 | <yahb2> | <interactive>:63:31: error: [GHC-76037] ; Not in scope: type constructor or class ‘Generic’ |
| 17:40:37 | <tomsmeding> | % import GHC.Generics |
| 17:40:37 | <yahb2> | <no output> |
| 17:40:39 | → | ljdarj joins (~Thunderbi@user/ljdarj) |
| 17:40:40 | <tomsmeding> | % data A = A Int Bool deriving (Generic) |
| 17:40:40 | <yahb2> | <no output> |
| 17:40:43 | <geekosaur> | yes |
| 17:40:43 | <tomsmeding> | %% :k! Rep A |
| 17:40:43 | <yahb2> | https://paste.tomsmeding.com/UQWaOWBa |
| 17:40:53 | <tomsmeding> | note the Int and Bool in there |
| 17:41:05 | <tomsmeding> | I don't even see any string forms anywhere |
| 17:41:39 | <mastarija> | But will that work for a field that's another product? I just want to go one level deep. |
| 17:42:28 | <tomsmeding> | what do you mean? Do you have a simple example type? |
| 17:42:32 | <mastarija> | Huh. It does. |
| 17:42:35 | <dcpagan> | Did "join" used to be a class method that one could optionally define for a Monad instance? I could have sworn that I read somewhere that you could define a Monad instance by defining join instead of defining bind, since m >>= k = join $ fmap k m |
| 17:42:39 | <mastarija> | I don't know what I was thinking. |
| 17:42:50 | <monochrom> | I don't think join was ever a method. |
| 17:42:53 | <tomsmeding> | dcpagan: well you can always define (>>=) in terms of join yourself |
| 17:43:03 | <mastarija> | Yeah. I guess on Rec0 we are supposed to manually call Rep if we want to go deeper, right? |
| 17:43:11 | <mastarija> | Now it's coming back to me... |
| 17:43:15 | <tomsmeding> | if you want to recurse into a field, then yes |
| 17:43:55 | <mastarija> | Yeah. Thanks. I somehow misremembered stuff and got stuck thinking my thinking is correct xD |
| 17:43:57 | <monochrom> | Not sure what you read, but generally "could" could (pun!) be highly hypothetical as in "in another parallel universe" and/or "if I were World Dictator". |
| 17:44:30 | <dolio> | Is that a pun? |
| 17:47:20 | <monochrom> | Could be! |
| 17:47:25 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 264 seconds) |
| 17:47:33 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 17:53:17 | → | ephilalethes joins (~noumenon@113.51-175-156.customer.lyse.net) |
| 17:53:26 | × | ephilalethes quits (~noumenon@113.51-175-156.customer.lyse.net) (Remote host closed the connection) |
| 17:55:04 | → | flipflops joins (~cmo@2604:3d09:207f:8000::d1dc) |
| 18:05:43 | × | Googulator67 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 18:05:44 | → | Googulator7 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 18:09:35 | → | Natch joins (~natch@c-92-34-15-120.bbcust.telenor.se) |
| 18:10:54 | × | flipflops quits (~cmo@2604:3d09:207f:8000::d1dc) (Ping timeout: 252 seconds) |
| 18:11:44 | → | yabobay joins (~pizza@2a02:85f:fcd5:1601:439e:d9b3:6a5d:d567) |
| 18:12:13 | <yabobay> | is there a generic version of splitWith somewhere in the standard library? or at least one that works on String's? |
| 18:13:00 | <EvanR> | what do you mean by generic, maybe write the desired type signature |
| 18:14:44 | <yabobay> | (a -> Bool) -> [a] -> http://en.wikipedia.org/wiki/Special:Search?go=Go&search=a |
| 18:14:51 | <yabobay> | uh |
| 18:15:02 | <EvanR> | :t breakOn |
| 18:15:03 | <lambdabot> | error: |
| 18:15:04 | <lambdabot> | • Variable not in scope: breakOn |
| 18:15:04 | <lambdabot> | • Perhaps you meant one of these: |
| 18:15:17 | <EvanR> | :t break |
| 18:15:18 | <lambdabot> | (a -> Bool) -> [a] -> ([a], [a]) |
| 18:15:40 | <yabobay> | well what if i want it to break at every delimiter instead of just the first one |
| 18:15:50 | <yabobay> | and so return a list |
| 18:15:56 | <EvanR> | that is a pretty simple combination of break and scanl |
| 18:16:10 | <EvanR> | which I reimplemented a few times |
| 18:16:20 | <EvanR> | there is a package with a bunch of splitting utilities |
| 18:16:23 | <yabobay> | you can probably write it easily but gimme a moment to figure it out for fun |
| 18:16:32 | <EvanR> | it's called `split' |
| 18:16:52 | <yabobay> | you mean the package? |
| 18:16:55 | <EvanR> | yeah |
| 18:17:26 | <EvanR> | splitWhen :: (a -> Bool) -> [a] -> [[a]] is in there |
| 18:18:07 | × | tabaqui quits (~tabaqui@167.71.80.236) (Ping timeout: 260 seconds) |
| 18:19:06 | × | wbrawner quits (~wbrawner@static.56.224.132.142.clients.your-server.de) (Ping timeout: 248 seconds) |
| 18:21:11 | → | wbrawner joins (~wbrawner@static.56.224.132.142.clients.your-server.de) |
| 18:22:04 | <tomsmeding> | EvanR: are you sure it's scanl that you need? |
| 18:22:58 | <tomsmeding> | and no, such a function is not in the standard library |
| 18:23:14 | <tomsmeding> | which is very convenient for teachers, because then they can ask students to implement it :) |
| 18:23:43 | <EvanR> | well scanl will do it, but I found it easier to write a direct recursion |
| 18:23:47 | <monochrom> | Yeah if something is in the standard library, then I can only put it on exams. |
| 18:26:00 | → | Frostillicus joins (~Frostilli@pool-71-174-119-69.bstnma.fios.verizon.net) |
| 18:26:04 | <tomsmeding> | EvanR: what I'm confused about is how you sensibly combine scanl and break in this case; I could do it with either, but not sure how to usefully use both together |
| 18:26:22 | <tomsmeding> | you could do it with break and unfoldl |
| 18:26:59 | <EvanR> | @src unfoldl |
| 18:26:59 | <lambdabot> | Source not found. Sorry about this, I know it's a bit silly. |
| 18:27:30 | <EvanR> | yeah unfoldl would work |
| 18:27:55 | → | Lycurgus joins (~juan@user/Lycurgus) |
| 18:28:09 | <EvanR> | you just have to munge a Maybe as opposed to just analyzing the pair coming out of break |
| 18:29:58 | → | target_i joins (~target_i@user/target-i/x-6023099) |
| 18:30:24 | <tomsmeding> | scanl forces you to iterate over a particular list, and I'm not clear on what that list would be |
| 18:30:30 | × | Googulator7 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 18:30:40 | → | Googulator7 joins (~Googulato@92-249-221-245.pool.digikabel.hu) |
| 18:33:02 | <EvanR> | you're right, it would be a scanl to implement the entire shebang |
| 18:33:05 | → | tabaqui joins (~tabaqui@167.71.80.236) |
| 18:34:35 | → | rvalue- joins (~rvalue@about/hackers/rvalue) |
| 18:35:01 | × | rvalue quits (~rvalue@about/hackers/rvalue) (Ping timeout: 246 seconds) |
| 18:36:52 | <yabobay> | okkk i got it |
| 18:37:26 | <EvanR> | :t unfoldl |
| 18:37:27 | <lambdabot> | error: |
| 18:37:27 | <lambdabot> | • Variable not in scope: unfoldl |
| 18:37:27 | <lambdabot> | • Perhaps you meant one of these: |
| 18:37:34 | <EvanR> | :t unfoldr |
| 18:37:35 | <lambdabot> | (b -> Maybe (a, b)) -> b -> [a] |
| 18:37:43 | <EvanR> | @src unfoldr |
| 18:37:43 | <lambdabot> | unfoldr f b = case f b of |
| 18:37:43 | <lambdabot> | Just (a, b') -> a : unfoldr f b' |
| 18:37:43 | <lambdabot> | Nothing -> [] |
| 18:37:45 | <bwe> | Having a data constructor that carries only `Maybe _` records. How can I generically identify and collect only those records that are missing? Example: https://paste.tomsmeding.com/QNAkizLd |
| 18:39:01 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 264 seconds) |
| 18:39:33 | <bwe> | (I don't want to implement a case monster for MyCollectorA and MyCollectorB; I feel it could be done easily with HashMaps yet I loose with them the strictness of storing values to only specific records.) |
| 18:40:10 | <bwe> | (Maybe the closest bet would be some Validation package, so I'd appreciate it if someone with experience in that could point me to some that fits my use case.) |
| 18:41:41 | → | peterbecich joins (~Thunderbi@172.222.148.214) |
| 18:41:53 | <EvanR> | well to just write the function you could hit each field with *> Just "a", *> Just "b", *> Just "c" respectively, then catMaybes |
| 18:41:57 | rvalue- | is now known as rvalue |
| 18:42:13 | <EvanR> | but something tells me the whole question could be improved looking at the bigger picture |
| 18:43:11 | <EvanR> | ok, and there are a lot of fields |
| 18:43:37 | <EvanR> | doing stuff field by field like that might benefit from extensible records |
| 18:44:30 | <EvanR> | whose record type often comes with a functor f on every field that you can use in natural transformations |
| 18:44:31 | <bwe> | EvanR: The bigger picture is scraping some data from different sources using ld+json and meta / item properties. Since the data quality varies with different sources, I need to know which data is missing from the machine readable provided one. For them I need to supplement it by writing manual parsers. |
| 18:44:33 | <EvanR> | f = Maybe in this case |
| 18:44:55 | × | jmcantrell quits (~weechat@user/jmcantrell) (Ping timeout: 240 seconds) |
| 18:45:16 | ← | yabobay parts (~pizza@2a02:85f:fcd5:1601:439e:d9b3:6a5d:d567) (Konversation terminated!) |
| 18:46:00 | × | Lycurgus quits (~juan@user/Lycurgus) (Quit: alsoknownas.renjuan.org ( juan@acm.org )) |
| 18:46:41 | <EvanR> | if the data is not strictly structured maybe represent it using dynamic types, like the json Value type |
| 18:46:52 | <EvanR> | the parser for such a type is the validation |
| 18:48:14 | <bwe> | …which would go more into the direction of HashMaps, isn't it? Is there such thing like HashMap with only predefined keys (instead of free text)? |
| 18:49:26 | <EvanR> | yes, dependent map |
| 18:49:50 | <bwe> | Never heard about this. |
| 18:50:06 | <EvanR> | it's extensible record adjacent |
| 18:50:39 | → | SlackCoder joins (~SlackCode@208.26.91.234) |
| 18:51:10 | × | trickard_ quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 18:51:23 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 18:52:35 | <bwe> | So, which packages should I consider? |
| 18:56:41 | <EvanR> | let me try to clarify, just using something like the json Value (which might be a hashmap of more values) would be pretty unstructured |
| 18:57:22 | <EvanR> | dependent-map is more structured, and would let you do something with the original question in a well typed way, but might still be too rigid for whatever else you're trying to do |
| 18:58:28 | × | peterbecich quits (~Thunderbi@172.222.148.214) (Ping timeout: 246 seconds) |
| 19:00:01 | × | caconym7478798 quits (~caconym@user/caconym) (Quit: bye) |
| 19:00:42 | → | caconym7478798 joins (~caconym@user/caconym) |
| 19:00:53 | <bwe> | EvanR: json Value: Yes, because I would pattern match by String values anyway instead of concrete record names. |
| 19:02:15 | → | gustrb joins (~gustrb@191.243.134.87) |
| 19:02:22 | <EvanR> | yeah you could zip together the list of possible field names with the result of looking up that field |
| 19:02:47 | <EvanR> | and output the field name if it's missing, or nothing, and collect at the end |
| 19:03:18 | <bwe> | okay, I am thinking now I might roll a new, additional, minimal data constructor with non-Maybe, having all required fields, and if any isn't provided by the `Maybe a` upstream constructor, I let it emit a `These a b` type. |
| 19:04:08 | <EvanR> | having your formal record types be reserved for cases where all the require fields exist probably would simplify things |
| 19:04:20 | <EvanR> | up to that point use a more unstructured representation |
| 19:04:34 | <EvanR> | the bridge between them is the parser/validator |
| 19:04:58 | <bwe> | It's sort of the data transfer object vs. the non-Maybe variant. And the translator inbetween both should tell what's missing. |
| 19:05:09 | <bwe> | yeah, that'd be the parser/validator. |
| 19:05:33 | <bwe> | And I am searching for a way to do it differently than pattern matching over all fields or creating a case monster. |
| 19:06:10 | <EvanR> | have you seen how json value -> application type parsers are done? |
| 19:06:12 | <EvanR> | using applicative |
| 19:07:00 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 252 seconds) |
| 19:09:43 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:10:04 | <EvanR> | e.g. going from Object v = {x: 9, y: 3.14} to data Coord = Coord {x :: Double, y :: Double}, write Coord <$> v.:"y" <*> v.:"z" |
| 19:10:23 | <EvanR> | or a more involved parser if there are non trivial requirements on the json |
| 19:12:07 | <EvanR> | the above parser only yields a Coord if the x and y fields exist and parse into Doubles |
| 19:13:20 | × | trickard_ quits (~trickard@cpe-53-98-47-163.wireline.com.au) (Read error: Connection reset by peer) |
| 19:14:23 | <probie> | bwe: cobbled together, but if all the fields are `Maybe`, you can do this with generics https://play.haskell.org/saved/T08yEkzo |
| 19:16:00 | <mastarija> | Does anyone know if there are any utilities in the `base` package for working with type level lists? e.g. Concat type family? |
| 19:16:07 | → | trickard_ joins (~trickard@cpe-53-98-47-163.wireline.com.au) |
| 19:16:08 | <mastarija> | I feel like there was something. |
| 19:16:16 | × | qqe quits (~qqq@185.54.23.200) (Quit: Lost terminal) |
| 19:16:19 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 19:16:24 | <tomsmeding> | there's some basic stuff for Nats, but I don't recall anything for lists |
| 19:16:34 | <haskellbridge> | <loonycyborg> Only DataKinds |
| 19:16:36 | <haskellbridge> | <loonycyborg> and some supporting modules |
| 19:16:41 | <haskellbridge> | <loonycyborg> like Natural and Symbol |
| 19:17:00 | <mastarija> | Hm... I guess I've mixed that up with Symbol |
| 19:17:06 | <haskellbridge> | <loonycyborg> Even DataKinds on its own is pretty powerful though |
| 19:19:10 | → | tccq joins (~user@user/tccq) |
| 19:21:44 | <tccq> | Are there decent solutions for jump-to-def and complete symbol names in emacs these days? haskell-mode is good and I like C-c C-c for compilation but the completion doesn't work for locals as far as I can tell. Also even with hls+eglot, jump to def doesn't work for anything outside the current project. I assume that's for lack of source files for system libs? But not even being able to fetch the type seems somewhat harsh. What are |
| 19:21:44 | <tccq> | people's setups? |
| 19:24:58 | <bwe> | EvanR: No, I haven't looked how json value -> application type parser are done yet. But will do. |
| 19:24:58 | <monochrom> | I haven't needed jump-to-def for locals, so haskell-mode suffices for me. |
| 19:25:18 | <monochrom> | err, I haven't needed completion for locals. |
| 19:25:28 | trickard_ | is now known as trickard |
| 19:25:35 | <bwe> | probie: wow, didn't think that this would be possible. |
| 19:25:42 | → | Googulator8 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 19:26:03 | × | Googulator7 quits (~Googulato@92-249-221-245.pool.digikabel.hu) (Quit: Client closed) |
| 19:26:04 | <monochrom> | I can fetch types, global and local. |
| 19:26:55 | <tccq> | do you get jump to def for prelude or standard packages? |
| 19:27:02 | <monochrom> | No. |
| 19:27:47 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:30:34 | <tccq> | hmm. Maybe I will drop the lsp part and just try to configure haskell-mode better. Probably with htags and dabbrev I should be set |
| 19:32:32 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 19:34:45 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 19:34:54 | → | gustrb joins (~gustrb@191.243.134.87) |
| 19:39:28 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 244 seconds) |
| 19:40:06 | × | mastarija quits (~mastarija@89-164-108-176.dsl.iskon.hr) (Quit: Client closed) |
| 19:43:39 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:48:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 19:49:41 | × | AlexZenon quits (~alzenon@85.174.182.163) (Ping timeout: 256 seconds) |
| 19:53:29 | → | tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net) |
| 19:54:22 | × | Googulator8 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 19:54:37 | → | Googulator8 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 19:59:29 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:04:52 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 20:08:28 | → | gustrb joins (~gustrb@191.243.134.87) |
| 20:10:02 | → | ephilalethes joins (~noumenon@113.51-175-156.customer.lyse.net) |
| 20:13:49 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 264 seconds) |
| 20:15:17 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:15:27 | → | jmcantrell joins (~weechat@user/jmcantrell) |
| 20:15:37 | × | Googulator8 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 20:15:38 | → | Googulator52 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 20:18:41 | × | takuan quits (~takuan@d8D86B9E9.access.telenet.be) (Remote host closed the connection) |
| 20:20:08 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 20:21:13 | → | gustrb joins (~gustrb@191.243.134.87) |
| 20:22:39 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937) |
| 20:26:26 | → | peterbecich joins (~Thunderbi@172.222.148.214) |
| 20:26:56 | → | AlexZenon joins (~alzenon@85.174.182.163) |
| 20:27:01 | × | Frostillicus quits (~Frostilli@pool-71-174-119-69.bstnma.fios.verizon.net) (Ping timeout: 264 seconds) |
| 20:28:32 | <chromoblob> | DeepSeek stole its name from Haskell's DeepSeq |
| 20:28:47 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 256 seconds) |
| 20:31:03 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:35:34 | × | Googulator52 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 20:35:37 | → | Googulator47 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 20:35:44 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 20:37:37 | → | Square joins (~Square4@user/square) |
| 20:38:32 | → | Square2 joins (~Square@user/square) |
| 20:39:42 | <bwe> | EvanR: You are actually right. I am solving the wrong problem: Currently I parse ld+json (embedded machine readable data in html) to 'Maybe a' using Aeson. Only to then to re-use the 'Maybe a' records (dto) to extract the required fields and store them in a non-Maybe constructor. Why not parsing the values directly into a constructor where required fields have a non-Maybe type and optional one's a Maybe type? I get the errors of the missing bits for free w |
| 20:39:42 | <bwe> | ithout needing to reinvent the wheel. |
| 20:40:20 | <EvanR> | yes |
| 20:40:33 | <EvanR> | parse "don't validate" (parse = validate) |
| 20:42:09 | × | Square quits (~Square4@user/square) (Ping timeout: 252 seconds) |
| 20:42:20 | <bwe> | I wanted to finish the partly done parsing job by validating. |
| 20:47:01 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:47:37 | <EvanR> | partly done parsing *scream emoji* |
| 20:48:06 | <EvanR> | if it's really invalid then it shouldn't parse |
| 20:54:01 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 20:55:25 | × | peterbecich quits (~Thunderbi@172.222.148.214) (Ping timeout: 256 seconds) |
| 20:59:16 | → | ttybitnik joins (~ttybitnik@user/wolper) |
| 21:04:53 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:08:35 | <yin> | also, make illegal states unrepresentable |
| 21:08:54 | × | lisq_ quits (~quassel@lis.moe) () |
| 21:08:56 | <EvanR> | that might be more trouble than its worth |
| 21:09:04 | → | lisq joins (~quassel@lis.moe) |
| 21:09:39 | <EvanR> | like how the real projective plane is this weird space that needs 4 dimensions, or it's just a half a sphere, ignore the other half |
| 21:09:46 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 21:10:09 | × | michalz quits (~michalz@185.246.207.221) (Remote host closed the connection) |
| 21:10:41 | <EvanR> | actually 5 |
| 21:13:13 | <monochrom> | I only needed 3 back then. |
| 21:13:18 | <monochrom> | Inflation! |
| 21:14:12 | → | gustrb joins (~gustrb@191.243.134.87) |
| 21:14:37 | <EvanR> | it's a 2D space so you only need 2 really |
| 21:14:45 | <bwe> | EvanR: I admit initially the dto data constructor just collected the data. Design criterion was to not fail even if some fields can't be populated (for debugging purposes). Hence I ended up with the "everything is Maybe" dto constructor. Second requirement was then to roll a domain data constructor that has only required fields. Now, the hassle turns out to be how to translate between them. |
| 21:15:31 | <bwe> | EvanR: I wonder how I might be more aware next time when I am opening the pandoras box with validating instead of parsing. |
| 21:16:23 | <EvanR> | if it's business apps, I might just veer on the side of "this has no structure, even if some boss said on some date that it did" |
| 21:17:05 | <EvanR> | but if it really does, there's always versioning your data types and doing type checked migrations |
| 21:17:15 | <EvanR> | and there is a different parser for each version |
| 21:20:40 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:21:47 | × | target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving) |
| 21:25:20 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 21:25:37 | → | Googulator80 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 21:25:39 | × | Googulator47 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 21:27:57 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 21:33:49 | <EvanR> | monochrom, 2 dimensions to get in, 3 to visualize it with intersections, 4 without intersections, 5 to preserve distances and angles |
| 21:36:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:37:02 | → | emmanuelux joins (~emmanuelu@user/emmanuelux) |
| 21:41:25 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 21:52:17 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:55:50 | × | tccq quits (~user@user/tccq) (Remote host closed the connection) |
| 21:57:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 21:58:13 | × | gustrb quits (~gustrb@191.243.134.87) (Ping timeout: 264 seconds) |
| 21:59:58 | → | gustrb joins (~gustrb@191.243.134.87) |
| 22:03:35 | × | tromp quits (~textual@2001:1c00:3487:1b00:242b:79a0:e1f9:7ea5) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:08:04 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:10:48 | × | Googulator80 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 22:11:05 | → | Googulator80 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 22:13:03 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 22:14:22 | × | Tuplanolla quits (~Tuplanoll@91-159-187-167.elisa-laajakaista.fi) (Ping timeout: 260 seconds) |
| 22:23:52 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:26:25 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 22:30:29 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 22:38:45 | × | jreicher quits (~user@user/jreicher) (Ping timeout: 252 seconds) |
| 22:42:01 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:44:55 | → | pavonia joins (~user@user/siracusa) |
| 22:46:49 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 22:57:41 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:02:24 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 23:06:21 | → | weary-traveler joins (~user@user/user363627) |
| 23:08:07 | × | mreh quits (~matthew@host86-146-25-125.range86-146.btcentralplus.com) (Ping timeout: 240 seconds) |
| 23:09:13 | → | jreicher joins (~user@user/jreicher) |
| 23:13:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:15:38 | → | Googulator98 joins (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) |
| 23:15:42 | × | Googulator80 quits (~Googulato@2a01-036d-0106-03fa-0485-6a66-0733-0e38.pool6.digikabel.hu) (Quit: Client closed) |
| 23:18:32 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 23:28:57 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:30:37 | <Leary> | doc: `data Foo a = ... deriving Num via Ap Foo a` |
| 23:34:05 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 23:37:17 | × | jreicher quits (~user@user/jreicher) (Quit: In transit) |
| 23:39:17 | <Leary> | @tell mastarija You might want to use 'generics-sop' instead of plain `GHC.Generics`; it more-or-less already does what you want to do. |
| 23:39:17 | <lambdabot> | Consider it noted. |
| 23:44:45 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:45:45 | <monochrom> | EvanR: I haven't thought of that. Thanks. |
| 23:46:00 | → | straybits joins (~straybits@user/straybits) |
| 23:46:52 | <monochrom> | But we get to say things like "we were only allowed 3, and it was uphill both ways" :) |
| 23:49:42 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
All times are in UTC on 2025-10-20.