Home liberachat/#haskell: Logs Calendar

Logs on 2022-09-27 (liberachat/#haskell)

00:03:08 matthewmosior joins (~matthewmo@173.170.253.91)
00:03:10 seydar joins (~seydar@154-27-113-252.starry-inc.net)
00:04:59 × mmhat quits (~mmh@p200300f1c710d3a5ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.6)
00:05:31 ubert1 joins (~Thunderbi@178.165.197.10.wireless.dyn.drei.com)
00:06:46 × ubert quits (~Thunderbi@178.115.76.1.wireless.dyn.drei.com) (Ping timeout: 260 seconds)
00:06:46 ubert1 is now known as ubert
00:07:40 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
00:07:48 × burnsidesLlama quits (~burnsides@119247164140.ctinets.com) (Remote host closed the connection)
00:08:33 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 265 seconds)
00:08:36 nate3 joins (~nate@98.45.169.16)
00:08:43 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
00:09:11 matthewmosior joins (~matthewmo@173.170.253.91)
00:09:15 ellensol joins (~ellen@178-78-210-152.customers.ownit.se)
00:09:45 waleee joins (~waleee@h-176-10-137-138.NA.cust.bahnhof.se)
00:10:30 haxcpu is now known as ay
00:13:32 <DigitalKiwi> boo doctest doesn't find megaparsec
00:13:46 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
00:13:46 × ellensol quits (~ellen@178-78-210-152.customers.ownit.se) (Ping timeout: 260 seconds)
00:16:06 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds)
00:17:34 <DigitalKiwi> https://github.com/haskellari/cabal-doctest/blob/master/README.md#copyright
00:17:44 <DigitalKiwi> (really the last #note)
00:18:00 <EvanR> now set up continuous integration
00:19:29 <DigitalKiwi> i haven't figured out the nix shell bit yet lol
00:19:37 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
00:19:37 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
00:19:37 wroathe joins (~wroathe@user/wroathe)
00:21:04 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
00:21:13 × euandreh quits (~euandreh@179.214.113.107) (Ping timeout: 250 seconds)
00:21:39 euandreh joins (~euandreh@179.214.113.107)
00:22:04 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
00:24:02 rockymarine joins (~rocky@user/rockymarine)
00:28:50 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
00:29:34 dcoutts_ joins (~duncan@host86-151-44-255.range86-151.btcentralplus.com)
00:29:55 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
00:31:03 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
00:31:57 × dcoutts quits (~duncan@host86-151-44-255.range86-151.btcentralplus.com) (Ping timeout: 244 seconds)
00:34:32 matthewmosior joins (~matthewmo@173.170.253.91)
00:38:25 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 252 seconds)
00:41:11 burnsidesLlama joins (~burnsides@119247164140.ctinets.com)
00:42:15 rockymarine joins (~rocky@user/rockymarine)
00:44:20 Guest5033 joins (~Guest50@192.182.150.125)
00:46:47 × burnsidesLlama quits (~burnsides@119247164140.ctinets.com) (Ping timeout: 250 seconds)
00:47:33 <Guest5033> What's the best way to use the actor model in Haskell? Should I use a package (e.g. simple-actors) that offers built-in actor functionality, or should I just use concurrency primitives (e.g. MVars) to implement actors myself?
00:47:41 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
00:50:37 rockymarine joins (~rocky@user/rockymarine)
00:50:46 DigitalKiwi would think the best way to use the actor model in haskell is to not
00:51:14 <DigitalKiwi> more cheekily: use scalaz with akka? lol
00:52:00 <DigitalKiwi> oof https://hackage.haskell.org/package/hakka
00:52:15 Guest73 joins (~Guest73@p200300ef9718354c66b84bdd01ed06f1.dip0.t-ipconnect.de)
00:52:40 × Guest73 quits (~Guest73@p200300ef9718354c66b84bdd01ed06f1.dip0.t-ipconnect.de) (Client Quit)
00:52:43 <DigitalKiwi> https://hackage.haskell.org/package/stm-actor
00:57:25 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
01:00:08 <Guest5033> What's the case against the actor model? Is it that STM makes it safe to share data between threads?
01:02:12 <geekosaur> mostly that it's OOish and Haskell doesn't really do OO
01:04:16 <DigitalKiwi> do you need actors or do you want actors because that's what you're used to
01:04:53 <Guest5033> My use case is this:
01:05:46 <EvanR> the async library is pretty cool
01:05:49 <EvanR> if you wanna be practical
01:05:58 <EvanR> but just threads and mvars can do a lot too
01:06:33 <Guest5033> 1. fetch website data from several URLs at once using several threads
01:06:34 <Guest5033> 2. store an index of data from already-visited URLs
01:06:43 <EvanR> if you can find a precise definition of actor model that would also be cool
01:06:48 mvk joins (~mvk@2607:fea8:5ce3:8500::778c)
01:07:50 <DigitalKiwi> https://ghcmutterings.wordpress.com/2010/08/20/parallel-programming-in-haskell-with-explicit-futures/
01:08:07 × gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
01:08:45 <DigitalKiwi> brb coding a futures trading bot with futures
01:10:28 <DigitalKiwi> https://www.cs.tufts.edu/~nr/cs257/archive/simon-peyton-jones/contracts.pdf
01:10:38 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
01:10:57 jero98772 joins (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c)
01:10:58 <EvanR> Guest5033, that's pretty easy to do with just threads, the async library, or whatever
01:11:09 <EvanR> note, haskell threads, not pthreads
01:11:13 <DigitalKiwi> https://web.archive.org/web/20130814194431/http://contracts.scheming.org/
01:11:34 × Guest5033 quits (~Guest50@192.182.150.125) (Quit: Client closed)
01:12:21 × xff0x quits (~xff0x@2405:6580:b080:900:5a06:dee8:84af:56be) (Ping timeout: 250 seconds)
01:15:17 × dsrt^ quits (~dsrt@173-160-76-137-atlanta.hfc.comcastbusiness.net) (Remote host closed the connection)
01:16:45 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
01:17:49 caryhartline joins (~caryhartl@2600:1700:2d0:8d30:1160:bb30:e810:5f52)
01:17:53 burnsidesLlama joins (~burnsides@119247164140.ctinets.com)
01:22:25 × burnsidesLlama quits (~burnsides@119247164140.ctinets.com) (Ping timeout: 252 seconds)
01:25:07 kimjetwav joins (~user@2607:fea8:235e:b600:14cc:4122:217e:1d45)
01:25:15 dr_merijn joins (~merijn@86.86.29.250)
01:30:01 off^ joins (~off@173-160-76-137-atlanta.hfc.comcastbusiness.net)
01:31:12 ddellacosta joins (~ddellacos@143.244.47.90)
01:38:50 jinsun__ joins (~jinsun@user/jinsun)
01:38:50 × jinsun quits (~jinsun@user/jinsun) (Killed (zirconium.libera.chat (Nickname regained by services)))
01:38:50 jinsun__ is now known as jinsun
01:39:05 × nahcetan quits (~nate@98.45.169.16) (Read error: Connection reset by peer)
01:39:42 natechan joins (~nate@98.45.169.16)
01:40:59 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
01:40:59 × natechan quits (~nate@98.45.169.16) (Read error: Connection reset by peer)
01:41:36 natechan joins (~nate@98.45.169.16)
01:42:52 × Me-me quits (~me-me@user/me-me) (Quit: Disconnecting on purpose.)
01:43:19 × natechan quits (~nate@98.45.169.16) (Read error: Connection reset by peer)
01:43:23 Me-me joins (~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net)
01:43:28 neightchan joins (~nate@98.45.169.16)
01:44:52 × Me-me quits (~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net) (Changing host)
01:44:52 Me-me joins (~me-me@user/me-me)
01:49:02 burnsidesLlama joins (~burnsides@119247164140.ctinets.com)
01:49:56 × caryhartline quits (~caryhartl@2600:1700:2d0:8d30:1160:bb30:e810:5f52) (Quit: caryhartline)
01:50:02 × xstill_ quits (xstill@fimu/xstill) (Ping timeout: 265 seconds)
01:51:20 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
01:53:35 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 252 seconds)
01:54:08 × burnsidesLlama quits (~burnsides@119247164140.ctinets.com) (Ping timeout: 268 seconds)
01:54:59 × TonyStone quits (~TonyStone@2603-7080-8607-c36a-cc48-2eb7-9785-f03a.res6.spectrum.com) (Quit: Leaving)
01:57:32 xstill_ joins (xstill@fimu/xstill)
01:57:53 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
01:59:01 × dr_merijn quits (~merijn@86.86.29.250) (Ping timeout: 246 seconds)
02:01:09 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
02:04:00 × cyphase quits (~cyphase@user/cyphase) (Ping timeout: 264 seconds)
02:06:12 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
02:09:07 cyphase joins (~cyphase@user/cyphase)
02:09:11 frost joins (~frost@user/frost)
02:09:33 × zmt00 quits (~zmt00@user/zmt00) (Read error: Connection reset by peer)
02:10:44 zmt00 joins (~zmt00@user/zmt00)
02:15:42 TonyStone joins (~TonyStone@2603-7080-8607-c36a-cc48-2eb7-9785-f03a.res6.spectrum.com)
02:15:43 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 258 seconds)
02:17:03 × td_ quits (~td@muedsl-82-207-238-079.citykom.de) (Ping timeout: 268 seconds)
02:18:35 srk- joins (~sorki@user/srk)
02:18:50 td_ joins (~td@muedsl-82-207-238-071.citykom.de)
02:20:23 × off^ quits (~off@173-160-76-137-atlanta.hfc.comcastbusiness.net) (Ping timeout: 250 seconds)
02:20:43 × srk quits (~sorki@user/srk) (Ping timeout: 252 seconds)
02:21:06 srk- is now known as srk
02:21:44 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
02:21:44 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
02:21:44 finn_elija is now known as FinnElija
02:22:16 off^ joins (~off@173-160-76-137-atlanta.hfc.comcastbusiness.net)
02:24:40 × Ristovski quits (~Ristovski@hellomouse/perf/ristovski) (Remote host closed the connection)
02:25:37 Ristovski joins (~Ristovski@hellomouse/perf/ristovski)
02:26:37 luffy joins (~chenqisu1@183.217.203.170)
02:26:46 matthewmosior joins (~matthewmo@173.170.253.91)
02:27:59 nate3 joins (~nate@98.45.169.16)
02:34:30 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
02:36:19 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c) (Ping timeout: 248 seconds)
02:39:49 jero98772 joins (~jero98772@2800:484:1d80:d8ce:dac1:63d7:4353:6597)
02:46:11 king_gs joins (~Thunderbi@187.201.192.184)
02:47:55 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 258 seconds)
02:48:14 chexum joins (~quassel@gateway/tor-sasl/chexum)
02:50:06 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
03:00:01 × TonyStone quits (~TonyStone@2603-7080-8607-c36a-cc48-2eb7-9785-f03a.res6.spectrum.com) (Ping timeout: 260 seconds)
03:02:18 matthewmosior joins (~matthewmo@173.170.253.91)
03:03:25 × ddellacosta quits (~ddellacos@143.244.47.90) (Ping timeout: 246 seconds)
03:05:27 × king_gs quits (~Thunderbi@187.201.192.184) (Read error: Connection reset by peer)
03:05:44 king_gs joins (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d)
03:05:50 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
03:06:53 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
03:07:01 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 260 seconds)
03:07:57 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:dac1:63d7:4353:6597) (Remote host closed the connection)
03:10:04 × king_gs quits (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d) (Ping timeout: 246 seconds)
03:10:40 TonyStone joins (~TonyStone@2603-7080-8607-c36a-cc48-2eb7-9785-f03a.res6.spectrum.com)
03:14:51 rockymarine joins (~rocky@user/rockymarine)
03:16:43 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 250 seconds)
03:18:01 Guest3352 joins (~Guest33@pool-108-50-195-90.nwrknj.fios.verizon.net)
03:19:26 × Guest3352 quits (~Guest33@pool-108-50-195-90.nwrknj.fios.verizon.net) (Client Quit)
03:21:26 matthewmosior joins (~matthewmo@173.170.253.91)
03:25:30 × crns quits (~netcrns@user/crns) (Quit: brb)
03:25:48 crns joins (~netcrns@p4ff5e2e3.dip0.t-ipconnect.de)
03:25:48 × crns quits (~netcrns@p4ff5e2e3.dip0.t-ipconnect.de) (Changing host)
03:25:48 crns joins (~netcrns@user/crns)
03:39:45 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 265 seconds)
03:41:09 king_gs joins (~Thunderbi@187.201.192.184)
03:42:04 × luffy quits (~chenqisu1@183.217.203.170) (Remote host closed the connection)
03:42:45 luffy joins (~chenqisu1@183.217.203.170)
03:43:00 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 264 seconds)
03:44:23 × Vajb quits (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57) (Read error: Connection reset by peer)
03:44:40 Vajb joins (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi)
03:46:47 seydar joins (~seydar@154-27-113-252.starry-inc.net)
03:53:49 <Clinton[m]> What is `f` called below:... (full message at <https://libera.ems.host/_matrix/media/r0/download/libera.chat/ac6545487e2b0848620e62e9f87aa0c9fe37782f>)
03:55:44 dr_merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
03:55:57 <Clinton[m]> Looks like https://hackage.haskell.org/package/rank2classes-1.4.4/docs/Rank2.html actually. Anything more standard than this?
03:56:49 <pavonia> That's a strange type. What would a concrete instance of that look like?
03:58:26 <[Leary]> Clinton[m]: Do you mean (forall a. f a -> g a)? It's a flavour of higher order functor that's used here and there, but I'm not sure about what packages provide it. Hoogle's giving me hmap from HFunctor in functor-combinators.
03:58:42 silph joins (~silph@67-208-31-162.ip.tor.radiant.net)
03:59:35 <silph> hi. i'd like to ask a subjective question, not a technical question, that asks about people's personal experiences when learning their first functional language. am i allowed to ask such subjective questions here?
04:01:11 <jackdk> Clinton[m]: I've seen it in rank2classes, conkin, hkd, barbies, maybe others. Not sure if there's a canonical version.
04:01:42 <Clinton[m]> s/b/a/
04:01:57 <Clinton[m]> [Leary]: Whoops I do mean `f a -> g a`
04:02:27 <johnw> silph: we do prefer Haskell-related questions
04:02:28 <Clinton[m]> jackdk: is there anywhere that allows me to derive it via generic? Or is that impossible in general?
04:03:20 <silph> johnw do you have a suggestion of a place more appropriate to ask about learning FP languages in general?
04:03:35 <silph> (i tried the Functional Programming discord, but that wasn't an appropriate place)
04:03:44 <Clinton[m]> silph: johnw definition of "we" is an unusual one as it doesn't include myself
04:03:57 <johnw> Clinton[m]: channel ops
04:04:09 <johnw> silph: I might recommend https://www.reddit.com/r/functionalprogramming/
04:04:24 × luffy quits (~chenqisu1@183.217.203.170) (Ping timeout: 265 seconds)
04:04:35 <jackdk> Clinton[m]: rank2classes has TH for them, hkd has a `gftraverse` which can get you `FTraversable` which can then get you `FFunctor` and `FFoldable` via `ffmapDefault` and `ffoldMapDefault`
04:05:19 <Clinton[m]> jackdk: I'll try `hkd`. Template Haskell scares me. I prefer Generic. Thanks!
04:05:28 <pavonia> silph: There's also ##programming for general programming related questons
04:05:31 <silph> johnw i worry that reddit would be even more hostile to "chit chat" anecdote / personal-experience / subjective questions! i get the feeling that reddit really only wants technical questions. what do you think?
04:06:28 <silph> i think what i'm hoping for is a place where i can talk about the human / emotional side of learning programming. that is, there are a lot of places to get technical discussion, but i'm having toruble finding places to talk about personal / emotional discussion related to learning programming (and FP in general)
04:06:40 <johnw> silph: sadly, there is that risk
04:07:00 <Clinton[m]> silph: I didn't realise this channel wasn't a fan of general functional programming language questions (as Haskell is the most used functional programming language) but Reddit is usually good for such chit chat questions anyway. You could try the /haskell reddit also.
04:08:13 <silph> Clinton[m] i might risk trying to ask on /haskell . i'm worried about getting aggressive responses from people who only expect technical discussion and hate any vulnerability in talks. but on the other hand, i've read Haskell blogs that /do/ talk openly about their frustrations / surprise / failures in their own explorations -- which i enjoy!
04:08:36 <johnw> well, I will answer your question if you post it there, silph, maybe that will help set the tone
04:08:53 <silph> okay. i'll ask, and if it's inappropriate for this channel, you can let me know.
04:10:11 <sm> silph: you could try the haskell matrix room, it's quieter than here.
04:11:07 <silph> my question is basically: "tell me about how difficult it was for you to learn your first FP language. how much did you have to struggle?". my background is that i'm feeling extremely humbled when tryign to learn Haskell. part of it is that early resources were written in a way too advanced (or too unclear) for me to easily understand. now that
04:11:07 <silph> i've found better resources, i'm realizing that i'm far from being a mathematically clever person. i'm /struggling/. it takes me 10 minutes to decipher many paragraphs that authors seem to think are trivial to understand -- i have to make diagrams on paper, etc.
04:11:14 burnsidesLlama joins (~burnsides@119247164140.ctinets.com)
04:11:35 <sm> we get this kind of question on the haskell reddit all the time, no big deal
04:11:38 <jackdk> On /r/haskell, I'd much prefer to read an interesting discussion about learning than yet another *ill-posed* question from someone trying to finish an assignment at the last minute. (I have no problem with beginner or even homework questions, provided there's real effort spent and not "please do my work for me")
04:11:50 <johnw> Haskell does require a bit of a mental shift; it was very hard for me, when I came from C
04:11:52 <silph> so, my question is quite broad, but it has to do with feeling struggle when learning FP languages. what encourages you to keep up the struggle?
04:12:13 <johnw> Not all of us did keep up with the struggle. I quit on Haskell twice before trying the third time.
04:12:18 <silph> @sm (also, what is a "haskell matrix room"? i'm new to IRC, so maybe that's why i don't know)
04:12:18 lambdabot activates her slap-o-matic...
04:12:39 <silph> @johnw : do you remember what made it so hard for you, and then what helped you push the third time?
04:12:39 <lambdabot> Not enough privileges
04:12:44 <sm> same here, I bounced off haskell multiple times (getting a bit further each time)
04:13:04 <johnw> silph: everything "math" was completely foreign to me; I pushed the third time just because of how much fun my friend kept saying they were having
04:13:08 <monochrom> My first FP language was Lisp and it was easy for me, "finally something that makes sense".
04:13:35 <johnw> thinking "without iteration" is also hard at first
04:13:42 <sm> silph: matrix is a newer chat system, it'll be linked on haskell.org
04:13:47 <johnw> I didn't know what to do without a for loop, and I'd never relied on recursion before
04:13:54 <silph> @johnw it seems that h aving friends (or patient and welcoming people) might help. i've found that the haskell community tends to be more patient than other communities, when answering my tehcnical questions.
04:13:54 <lambdabot> Not enough privileges
04:13:56 <johnw> plus, variables
04:14:20 <jackdk> I blew through the initial stuff my university showed me (after a previous course had already taught recursion etc), and then stalled *hard* on "ok but how do I write a complete program?" I have definitely spent a lot of time working through evaluations on paper, drawing diagrams, etc. That's just what I have to do in order to shift my brain into the correct gear
04:14:22 <johnw> btw, we use "johnw: " on IRC, not @johnw. You're making me think that I have my op hat on :)
04:14:47 <monochrom> More specifically I was happy that it has recursion and it frees me from the chore of malloc and free.
04:14:54 <silph> (oh, what is the connotation when i use the at sign?)
04:15:08 ChanServ sets mode +o johnw
04:15:12 <johnw> this is my with an @ sign
04:15:15 <johnw> me*
04:15:18 <sm> silph: having mentors on chat really helps, in person mentors / user group helps even more
04:15:24 johnw sets mode -o johnw
04:16:01 <jackdk> Why did I stick with Haskell? I wanted types and purity, because it makes thinking about larger problems so much easier, and that was worth the effort.
04:16:19 <silph> i tried learnign from teh wikibook, and stopped about 80 pages in. i tried Learn You a Haskell for Great Good, and also stopped with that. i'm having more success with two certain textbooks, though, as of a week ago.
04:16:27 <johnw> in short, silph, I would say that it shouldn't discourage you at all to be having great difficulties. You are in good in that regard. Rather, it means that the surmounting of those difficulties will be especially sweet, if you keep at it.
04:16:34 × burnsidesLlama quits (~burnsides@119247164140.ctinets.com) (Ping timeout: 246 seconds)
04:16:42 <johnw> in good company*
04:16:43 <silph> sm: can you tell me what a "user group" is?
04:17:36 <sm> I meant an in person gathering , also called meetup. Might be less common now, unless you start one
04:17:37 <silph> johnw: i am enjoying when i feel like i'm learning a new concept. in my studying today, i feel like i actually understood Partial Application and Currying more than before; my understanding felt vague and fragile before.
04:18:07 <silph> sm: i didn't think that it might be possible for peopel to want to meet in person to talk about Haskell programming, outside of a big conference!
04:18:11 <johnw> My understanding of Monads and Applicatives was vague and fragile for maybe a year
04:18:43 <silph> jackdk: you mentioned that your Uni information on FProgramming was easy, but when you tried to make a "real program", you stalled.
04:18:48 <silph> i wonder if this is quite common when learning Haskell.
04:19:04 <sm> silph: try searching meetup.com for something in your area (or online, even; but these chat rooms are like a 24/7 meetup anyway)
04:19:33 <silph> i would like to ask a related question for those who program for a living: how do you find time to learn new programming frameworks or programming langauges?
04:19:44 <silph> i imagine having a family (for example) would take up a lot of your mental energy.
04:20:39 <sm> you learn a bit at a time, usually while doing something for work or fun. You (try to) balance it with other demands...
04:20:59 <silph> when i tried reading a book on Java Concurrency, i was able to do it, but i literally had to spend about 15 minutes /per page/. (aside: i can't tell if writing multithreaded java programs actually is as much of a nightmare as it seems to me -- the book didn't admit that it was difficult! -- or if i'm just not smart enough to do so!). i can't
04:21:00 <silph> imagine what a Full Time worker would do , trying to learn Java Concurrency /on top/ of their other duties..
04:21:08 <sm> there's other ways too. Your job might provide training or fund a course.
04:21:15 <silph> sm: ah, that would make it easier!
04:21:38 <jackdk> silph: I suspect that it is. I also stalled when trying to write large nontrivial OO programs, because scaling up from `main()` or whatever is not always obvious. For a Haskell example, I was fine with the `IO` type and its associated instances, but it took a while to hit the problems that various libraries solved, and then learn/use them properly.
04:21:46 <silph> the career world of programming seems to require so, so much constant learning.
04:21:54 <sm> a common mistake is to rush or try to learn too much before practice. It takes time.
04:22:03 <sm> and being selective
04:22:12 <silph> jackdk: it reassures me to hear you say that, in your experience, it really does take persistent effort; that these things aren't obvious to most people.
04:22:33 <johnw> yes, that describes it
04:22:38 <jackdk> Also, it is faster when you're learning the thing to wrangle the problem in front of you because you can "test fit" the things you are learning against a concrete problem.
04:22:51 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
04:22:59 <silph> (i took a look at at the official Enterprise Java textbook, and literally laughed out loud to see that itw as 908 pages long, with small text size, haha. and then i'm told on the Java discord that Enterprise Java is now not in favour, and that Spring has replaced it!)
04:23:21 <silph> jackdk: yeah, i can see how having a concrete problem you need to work on, will help you feel motivated.
04:23:45 <jackdk> It also means the learning feels justifiable on work time.
04:24:01 <silph> thanks for your perspectives. it does help encourage me to hear that mentors help, and taht it's quite normal to feel stalled or stuck at times. and that sometimes continuing to struggle and understand does pay off.
04:24:36 <jackdk> I should also point out that for the gnarly parts of books, many minutes/page is quite reasonable. I am working through a maths book with a mentor and some sections were very slow going and needed a lot of pen and paper to make them sink in.
04:24:38 talismanick joins (~talismani@2601:200:c100:c9e0::24ac)
04:25:00 <silph> i think my own learning of Haskell is more of a curiousity. i am looking forward to when i learn how you can write state in a langauge where pure functions are emphasised; i 'll have to wait until i get to the Monads chapter :)
04:25:12 <silph> jackdk: that's also reassuring for me to hear.
04:25:38 <silph> i know that i'm somewhat below average mathematical intelligence compared to the typical programmer (and especially the typical board-games-meetup attendee).
04:26:00 <silph> one thing i have appreciated about the Haskell community is that (in most cases), Haskell people seem to be more patient with "stupid" questions.
04:26:19 <silph> so i am reassured that even though i require extra time / effort to understand new mathematical concepts, that it's valid for me to try anyways.
04:26:31 <silph> an d the successes that i've learned (as small as they are) about Haskell, have been fun.
04:26:32 <johnw> I wouldn't even say it's extra
04:26:47 <silph> johnw: can you elaborate?
04:26:53 <johnw> I'd suggest you're overestimating others' learning pace
04:27:13 <silph> you really do think a /lot/ of peopel struggle?
04:27:20 <silph> (esp with their first FP language)?
04:27:21 <johnw> I do
04:27:52 <silph> one thing i am learning is that writing good textbooks for beginners isn't easy. it seems to tak ea lot of editting.
04:28:02 <silph> i know when i was a Java tutor, i forgot what it was like to learn Java for the first time.
04:28:13 <silph> very "simple" things, i didn't realize could be a problem, becuase i'm so used to it.
04:28:24 <silph> (some students didn't see the difference between round and square brackets, for example)
04:28:34 libertyprime joins (~libertypr@139.80.172.131)
04:29:05 <silph> i'm very grateful that between two textbooks, and IRC, i might be able to move forward at my own pace with learning Haskell.
04:29:13 <monochrom> My first non-homework, unsupervised, actually-useful programs each took multiple weekends. They were in BASIC, Pascal, and C. And they were when I was at age 16 or 20 so faster than adults.
04:29:33 <talismanick> Jumping straight into monads (specifically IO, which is weird in its own right) to "write programs that do things" means tackling the hard parts head-on and discarding the benefits of Haskell
04:29:49 <talismanick> If anything, you'd probably get there faster and get more out of it by studying the "easy because pure" parts first and working your way up to higher abstractions
04:30:02 × dr_merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 265 seconds)
04:30:03 <silph> monochrom: so it took a lot of effort! maybe learning even an imperative programming langauge is hard at first. i had my big brother, and colourful and fun 80s books with easy examples, to help me...
04:30:20 <talismanick> Combinators are pretty cool: https://www.youtube.com/watch?v=seVSlKazsNk
04:30:47 <monochrom> I do not think that "I finished a Haskell textbook but I struggle with creating something useful" is any different if you s/Haskell/any language/
04:31:35 <silph> monochrom: maybe i do underestimate how difficult it is to learn these skills.
04:31:39 <silph> and how much persistence it takes.
04:31:57 <silph> i guess it's different in school, becuase you can /see/ how difficult it is for /everyone/ (except the top 5% of students, who are geniuses...)
04:32:13 × Vajb quits (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer)
04:32:14 <talismanick> monochrom: Depends on your definition of "useful" - what would you even bikeshed over in Python or Go the way you can with higher-kinded types, GADTs, effects, etc?
04:32:16 <silph> but on the internet, it's harder to guage what is "normal" about how difficult it is to learn these skills.
04:32:22 <johnw> silph: very true
04:32:26 <talismanick> Or Scheme
04:32:48 Vajb joins (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57)
04:33:14 <monochrom> OK, one of the useful programs I wrote took a command line argument for a directory name, and recursed through the subdirectories to sum up file sizes.
04:33:23 <silph> i'd like to ask a final question (that is more objective), with the understnading that i'm going to be MUCH more patient with myself for my struggles!
04:33:34 <monochrom> Yes that "simple task" in Pascal or C took multiple weekends.
04:33:41 <silph> do you find patterns of what concepts beginners find most difficult to learn in their first (say) 6 months?
04:33:44 <silph> or is it quite varied?
04:33:58 <silph> that is: what should i be /extra/ patient when learning, and not be surprised that it'll take me extra time to learn?
04:33:59 <johnw> depends on their background
04:34:18 <silph> (i have mostly a Java background, with a little bit of C and SQL -- ie , beginner stuff i learned from community college)
04:34:34 <talismanick> monochrom: Well, C is a whole different matter... never used Pascal, but depending on the dialect, the ones most people think of are similarly low-level
04:34:46 <monochrom> I do not expect it to be any faster in Haskell for a Haskell student "I recently finished a Haskell textbook", as much as how Haskell is simpler than Pascal and C for that task.
04:36:13 <talismanick> But vs Python, Ruby, etc? By the time a book explains enough Haskell to write useful programs, books for those languages would have already delved well into examples for lack of language complexity
04:36:15 <silph> monochrom: i remember some Java students' brains melting, in  my tutoring, when i showed how a for loop could access every element in an array. the idea that "myArray[i]" could do different things with each iteration was brain-melting for them.
04:36:33 <silph> it took a lot of examples and letting them talk through their confusion, for some of them to eventually understand it.
04:36:37 <jackdk> Recursion is often a big one I saw students struggle with. The self-reference looks like nonsense at first (like how `x = x + 1` looks like nonsense in many imperative languages, until you unlearn what the equal sign means). Whether or not people struggle with induction _while learning FP_ depends on whether they've seen it in other contexts (self-referential jokes, proof-by-induction, recursion in other langauges)
04:36:48 <silph> so if something that simple takes effort, writing a full program in Pascal would take much more effort!
04:37:09 lisbeths joins (uid135845@id-135845.lymington.irccloud.com)
04:37:28 <monochrom> talismanick: Then you need to see this:
04:37:33 <monochrom> @quote monochrom FP.book
04:37:34 <lambdabot> monochrom says: If you read a haskell book or an FP book, by chapter 5 it's already doing data structures. It's chapter 10 in imperative books.
04:38:01 <silph> jackdk: i remember thinking i understood Recurision b/c of undrestanding how to do recurision-related problems in Java courses. but in the Haskell wikibook, i saw a recursion pattern that i never saw before, where an argument "accumulates" an answer. this blew my mind after i finally understood it!
04:39:17 <silph> jackdk: i also needed to adjust with how important the "empty" case is for a base case. in Java, for "int factorial(int n)", i was happy to let the base case be "if (n==1)" and another base case for "(if n == 0)", becusae that made more sense to me than making my base case only for (if n ==0)".
04:39:21 <talismanick> monochrom: I imagine that depends on the language used...
04:39:41 <silph> jackdk: so yes, the recursion and map/foldl etc chapters in the wikibook jtook a good 5 hours for me to understand!
04:40:46 <silph> thank you everyone for sharing your own perspectives and experiences. it helped put my own expectations into perspective, and encouraged me a lot!
04:40:50 <johnw> silph: one thing I'd like to suggest is to avoid reaching too quickly for IO, although it will seem a natural thing coming from Java or C
04:41:31 <jackdk> I wasted a lot of time trying to do things like set up top-level IORefs because I was trying to solve problems like an imperative programmer.
04:42:30 <silph> johnw: i'm reading from both Hutton's book ("Programming in Haskell") and Thompson's book ("Haskell: The Craft of Functional Programmoing"). they seem to delay IO until 1/3 of the way. (i find that when one book is confusing, the other book explains the concept more clearly)
04:43:06 <silph> jackdk: was it just continuing to solve problems with Haskell, that eventually taught you to think more like a functional programmer? or were there actual resources that modeled this for you?
04:43:20 <talismanick> silph: Is there anything you'd like to make with Haskell? For command line programs, Turtle's a good library
04:43:29 matthewmosior joins (~matthewmo@173.170.253.91)
04:43:53 <silph> on thing i'm curious about (but won't try to learn righ tnow) is how to program in a dynamically typed language. DTLanguages scare me a LOT. but Clojure people say its joyful, and that you use the REPL a lot, and it's kind of the opposite of "write out my types and then hook them together". so i wonder how people learn these different "ways" of
04:43:53 <silph> thinking, when programming?
04:43:56 <talismanick> Haven't had a chance to use it yet, but gi-gtk-declarative is clean-looking
04:44:20 <silph> talismanick: actually, i'm not too motivated to build things. right now, my motivation is learning that programming really can be different than C/C++/C#/Java/Python
04:44:40 <talismanick> https://hackage.haskell.org/package/turtle-1.6.1/docs/Turtle-Tutorial.html
04:44:53 <jackdk> I was lucky enough to get a job working in an established Haskell codebase, and that meant I could see what patterns looked like "in the large". I think that hacking on an established program is extremely useful.
04:44:58 <silph> talismanick: but i do understand, from people here, that building something can be very motivating.
04:45:10 <talismanick> silph: Oh, then definitely watch the talk on combinators I sent
04:45:23 <silph> jackdk: lol, was that scary, jumping into a Haskell workplace without being super confident in your own abilitiy to think functionally?
04:45:35 <silph> talismanick: i got it open on another Chrome tab :) i'll bookmark it.
04:45:49 <silph> thought i'm not sure if i know enough Haskell to underatnd it, but i'll try watching it anyways.
04:45:57 <jackdk> If you don't have an established program to hack on, I generally suggest a hack-and-slash text adventure because it usually causes a fun "build/play/extend" loop, and can scale all the way down to basic string I/O using only `base`.
04:46:36 <silph> jackdk: it's funny how "build a game" can be motivating.
04:46:52 <silph> in my fifth-semester class, i had to write Qbert in C++ (using very basic C++ features).
04:46:53 <jackdk> When I joined that job, I'd finished Haskell Programming from First Principles and was quite comfortable thinking functionally in the small. What I didn't have was experience thinking functionally at larger scales, application design, etc. So I think I felt OK.
04:46:59 titibandit joins (~titibandi@137.226.196.215)
04:47:18 <jackdk> HPFFP is a large book, and it took me many months to get through it all and do all the exercises.
04:47:25 <silph> jackdk: this makes sense to me, that you had enough of the foundations ("thinking in the small") to know that you could tackle the job.
04:47:28 mbuf joins (~Shakthi@49.205.84.15)
04:49:06 <silph> i'm starting to realize that actually learning how to program (even in QBASIC) is not necessasrily an easy skill, and the pathways for doing so aren't linear. it's a lot of experimentation, stop-and-start, stalling. and different resources work for different people.
04:49:29 <silph> maybe my brain will slowly learn to adjust.
04:50:09 <silph> (one of the things that still confuses me abotu Haskell, is when functions aren't givene type definitions. this happened sometimes in the wikibook. it was so hard for me to guess the type definition from context).
04:50:20 <silph> (but maybe my  brain will get better at this after a lot of exposure)
04:50:52 <jackdk> It will, but also if you don't know what type something has, you can often annotate it and see if GHC agrees with you.
04:51:03 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 252 seconds)
04:51:12 <silph> jackdk: thanks for the hint :)
04:51:21 <monochrom> The old generation had a saying that's very damaging today. "After you've learned the first language, picking up another language is easy." NO.
04:52:03 <monochrom> It was true in the 1960s when all languages you met were mimicking Algol 60. Then sure.
04:52:17 <[Leary]> silph: Going back to the original question, my background is purely mathematical (without an imperative mindset to unlearn) and I still struggled learning Haskell. But it was easy to keep motivated because the mind-twisting was a joy---everything difficult was equally fun. I almost wish I could learn it all over again.
04:52:18 <silph> monochrom: if imperative languages use largely-overlapping thinking, and Haskell uses quite a different field of thinking .. is ther a third category of programming languages that you've epxerienced?
04:52:44 <johnw> silph: there are logic languages, that's another type of brain trip
04:52:46 <silph> [Leary]: oh, i would have expected Haskell to be "so easy" for mathematicians! i guess that assumption is incorrect!
04:52:49 <monochrom> It's already false even back then if you jumped from Algol to Lisp or Prolog. So nevermind today where even Java is so different from C.
04:53:23 <monochrom> But here is what can work: After you've aced computer science, picking up another language is easy.
04:53:31 <silph> johnw: i don't hear much hype about Prolog or other logic languages at all..!
04:55:19 <talismanick> silph: They've had a quiet resurgence, between Kanren dialects and Datalog, with the rise of graph databases
04:55:27 <silph> (i have to admit, part of my curiousity of learning new programming langauges is hype. LISPers say that "source code is data is source code! it'll change your world!" and i get slightly curious. Rust'ers saying "once you become friends with the borrow checker, you'll get marvellous new insights!" and i get curious. Erlang-ists say "the Actor model
04:55:28 <silph> makes super-reliable systems!" and i get curious. Smalltalkers say "Alan Kay loves us" and i get curious, haha)
04:56:01 <silph> but for now, i'm focussing on Haskellers. it was the hype that drew me in.
04:56:15 <talismanick> Erlang is an echo of the concurrent logic programming languages of yore
04:56:22 <silph> and lucky for me, probably enough support (eg IRC) and beginner textbooks etc exist, to make it possible for even me to learn it.
04:56:30 <talismanick> hence why it's a bit of an ugly duckling among the functional languages
04:56:42 <silph> talismanick: this is something i never heard before, ie that Erlang has a connection with logic programming.
04:57:15 <talismanick> You look at the syntax of Erlang and Prolog, and they are suspiciously similar
04:57:35 <talismanick> https://vanemden.wordpress.com/2010/08/21/who-killed-prolog/
04:57:48 <talismanick> Van Emden was one of the pioneers of logic programming
04:58:03 <monochrom> Hrm, no wonder, now that I think about it. If you take logic programming and restrict unification to pattern matching, you get functional programming.
04:58:05 <silph> talismanick: also, i didn't even know that a database other than relational databases are being used. i vaguely know that there's a thing called "Not only SQL" databases , but i don't know anything about it. is that a "graph database"?
04:58:46 <talismanick> silph: NoSQL is anything that isn't SQL :)
04:59:08 <talismanick> Graph databases are one among several kinds, including document and columnar stores
04:59:19 <talismanick> I take it you know what a graph is?
04:59:23 <talismanick> In the context of CS
04:59:27 <silph> are graph, document, and columnar databases still used today?
04:59:36 <talismanick> Very much so!
04:59:45 <silph> i think so? i understand that a "graph" is a bunch of Nodes, and edges connecting those nodes. and sometimes these edges have direction and weight.
04:59:58 <silph> and a tree is an example of a graph, for example.
05:00:19 × king_gs quits (~Thunderbi@187.201.192.184) (Ping timeout: 248 seconds)
05:00:34 <talismanick> So, a graph representation is convenient for representing a collection of data which is interconnected in some ways but not so much so that it can be neatly partitioned into rows of a table
05:01:41 <silph> huh. could it be used for purposes that relational databases are usually used for? i wonder if querying such a database is very difficult, if the relationships between the data elements isn't as regular?
05:01:41 <talismanick> Like, if you took all of Facebook, "who's friends with who?"
05:02:12 <silph> talismanick: haha, my first mental model is just to think okf relational tables. but i can see it as a graph, too!
05:02:39 <silph> what are some advnatages of a graph model of databse, vs a relational model [in the cases when it makes more sense for the data to use a graph databse, of course]?
05:02:57 <talismanick> silph: In general, it's a tradeoff: easier storage, insertion, and representation, but more difficult queries
05:03:16 <talismanick> silph: lots of heterogeneous data
05:03:19 <silph> interesting! i really never heard fo a graph databse before!
05:03:30 <silph> do you remember how you first learned about it, or do you remember palces where it's commonly talked about?
05:03:31 seydar joins (~seydar@154-27-113-252.starry-inc.net)
05:03:39 <talismanick> uhhh... Hacker News?
05:03:45 <davean> silph: consider how you'd write a "is there a connection between A and B" in SQL
05:03:46 takuan joins (~takuan@178-116-218-225.access.telenet.be)
05:03:48 <davean> consider in a graph database
05:04:01 <silph> talismanick: ah, ok :) that makes sense that HN exposed you to do the idea!
05:04:17 <talismanick> I actually studied logic programming on my own out of sheer curiousity and later saw Datalog begin its steady ascent in popularity from the sidelines :)
05:05:31 <silph> davean: you're saying that it might be easier to see "is ther ea connection between A and B" in a graph database?
05:05:59 <davean> silph: I'm saying you need extensions to SQL to even try :-p
05:06:14 <silph> talismanick: haha, that must have been fun for you to see. it makes me think about how some technoclogies get popular from the margins, and how most stay in the margins.
05:06:37 <talismanick> let's say "X is an apple if X is round and X is red and X fell from a tree"
05:06:43 <silph> davean: fair enough. my SQL brain is very rusty, so i didn't see this when yo asked!
05:07:17 <silph> talismanick: ok, go on. (though, do pomegranites grow on trees, i wonder..?)
05:07:17 <talismanick> i.e. apple(X) <= round(X) & red(X) & fell_from(X,tree).
05:07:34 <talismanick> Are you familiar with propositional logic?
05:08:03 <silph> i did a TINY amount of Prolog in school, but not enough to see why it was useful :). but i'm told that pre-Neural Netwokr days, it was used a lot in Aritificual Intelligence.
05:08:40 <talismanick> let's say we're given a fact: "it" hit Newton on the head, bonked(newton, it)
05:08:41 × titibandit quits (~titibandi@137.226.196.215) (Read error: Connection reset by peer)
05:08:45 <silph> i'm not very famliar with propositional logic. only slightly, from one course. i learned about one way implies, two way implies ("iff"), contrapositive, and just a little bit about "for all" and "there exists"
05:08:50 <talismanick> we ask: apple(it)?
05:09:34 <talismanick> at this point, we're stuck with a possible value for X: apple(it) <= round(it) & red(it) & fell(it,tree)
05:09:42 <talismanick> this whole statement is true or false
05:09:50 <silph> so "bonked" is a proptery[? bad terminology i migh tbe using] that can be True or False.
05:10:23 <talismanick> the given fact is that "it" hit Newton on the head, which I wrote bonked(newton, it)
05:10:29 chomwitt joins (~chomwitt@2a02:587:dc14:f500:e9fb:e2de:445:6771)
05:10:38 <talismanick> or you could write hit(newton,it), whatever
05:10:39 <silph> you're saying that "bonked(newton, it)" is given as a true statement?
05:10:43 <talismanick> yeah
05:10:54 nate3 joins (~nate@98.45.169.16)
05:11:02 <silph> and the question is "is apple(it) True?"?
05:11:07 <talismanick> and we want to know if "it" is an apple, to determine if "it" is a valid way of filling out X
05:11:38 <Clinton[m]> Does anyone know about the `barbies` library here?... (full message at <https://libera.ems.host/_matrix/media/r0/download/libera.chat/5fd1c88fea664c910ccaf85a115c8edd835e5c46>)
05:11:41 <silph> i was taught (when learning Prolog) that the program, when executed, will go through all of the statements that are given as True, to answer the query.
05:11:51 <talismanick> with a truth table, you can show that "a implies b" is the same as "not a or b"
05:12:12 <talismanick> so, consider filling out our definition for "apple(it)":
05:12:20 <silph> talismanick: but i never learned how Prolog is actually used in the real world! but from what i hear you say, programming langauges like Datalog /are/ in fact being used by real people.
05:12:52 <talismanick> apple(it) || not round(it) || not red(it) || not fell(it,tree)
05:13:16 <silph> your definition you gave me for "apple(it)" is "apple(it) is true if "it is round" AND "it is red" and "it fell from a tree" "
05:13:39 <talismanick> so, now we can assert that "it" is an apple if we fail to find evidence in the database that it is not round or red or didn't fall from a tree
05:14:22 <talismanick> so, if you ask the program "apple(it)?", it will return true
05:14:34 <talismanick> but, and this is the important part,
05:14:54 <talismanick> you can ask it "apple(X)" and let it try to fill out values for X for you, using the same process!
05:15:28 <silph> in what fields does logic programming answer useful question? i'm thinking -- someone [a programmer? another program?] would have to popluate the program with a lot of true statements! i wonder what non-trivial questions you can ask a logic program that are amazing to get answers for.
05:15:52 <talismanick> it tries any value for X it can, hopping from one possible clause for it to the next, as if walking a graph, until it gives up and tells you that value for X!
05:15:54 <silph> "what possible objects in existance might be apples, given these true statements i told you about earlier"
05:15:59 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
05:16:35 <talismanick> Souffle Datalog is used for program synthesis
05:16:37 <silph> Clinton[m]: sorry to flood out your question... i hope i'm not flooding it out, anyways!
05:16:56 <silph> "program synthesis" is another term i never heard of before :)
05:17:17 <talismanick> generate a program that does what you want given some set of constraints
05:17:59 <silph> maybe a term for me to google!
05:18:07 <silph> thanks for the youtube link, talismanick. i'll watch it later this week.
05:18:13 <talismanick> np
05:18:20 <silph> and thank you everyone for sharing yoru expeirences about the learning process. it really encouraged me!
05:18:40 <silph> i'm going to part from this IRC channel right now, but i really do appreciate people's welcoming support and sharing of personal anecdotes.
05:18:42 <silph> bye!
05:19:14 × tomku quits (~tomku@user/tomku) (Ping timeout: 255 seconds)
05:19:21 king_gs joins (~Thunderbi@187.201.192.184)
05:20:19 × silph quits (~silph@67-208-31-162.ip.tor.radiant.net) (Quit: Client closed)
05:22:03 <[Leary]> Clinton[m]: Since it's complaining about the `Rec` constructor not being in scope, try importing it?
05:22:27 coot joins (~coot@213.134.165.79)
05:22:53 <[Leary]> I don't actually know the package, I'm just guessing.
05:28:10 titibandit joins (~titibandi@xdsl-212-8-150-57.nc.de)
05:31:32 <Clinton[m]> <[Leary]> "Clinton: Since it's complaining..." <- it's in a hidden module in the package. I guess it's bug report time
05:34:09 `2jt joins (~jtomas@105.red-88-17-232.dynamicip.rima-tde.net)
05:35:08 <[Leary]> Clinton[m]: It's re-exported by Data.Functor.Barbie.
05:35:37 × chomwitt quits (~chomwitt@2a02:587:dc14:f500:e9fb:e2de:445:6771) (Ping timeout: 268 seconds)
05:36:10 Goodbye_Vincent joins (cyvahl@freakshells.net)
05:38:51 × king_gs quits (~Thunderbi@187.201.192.184) (Read error: Connection reset by peer)
05:39:01 king_gs1 joins (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d)
05:41:20 king_gs1 is now known as king_gs
05:42:31 × libertyprime quits (~libertypr@139.80.172.131) (Ping timeout: 265 seconds)
05:47:21 razetime joins (~quassel@117.193.7.114)
05:50:01 × Ram-Z quits (~Ram-Z@li1814-254.members.linode.com) (Ping timeout: 246 seconds)
05:50:57 trillp joins (~trillp@2001:19f0:6401:b10:e09a:50b0:71c8:3a8e)
06:00:54 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 268 seconds)
06:02:12 × raym quits (~raym@user/raym) (Ping timeout: 264 seconds)
06:03:18 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
06:04:08 raym joins (~raym@user/raym)
06:04:43 matthewmosior joins (~matthewmo@173.170.253.91)
06:13:41 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
06:14:15 <ski> logic programming is quite cool. in some ways, it is similar to functional programming; in others, not so much. Prolog might be the best way to get into it, due to the amount of learning material for it, compared to other systems. but there are other routes, too. (Kanren,Mercury,Datalog (or deductive databases in general),Oz,Twelf (and lambdaProlog,Lolli),rule-based systems (e.g. using RETE, cf. business
06:14:21 <ski> rule engine/system,production rule system),answer-set programming,..)
06:19:54 zeenk joins (~zeenk@2a02:2f04:a311:2d00:6865:d863:4c93:799f)
06:26:31 dr_merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
06:26:59 × jonathanx_ quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 265 seconds)
06:29:22 thyriaen joins (~thyriaen@2a02:8109:8340:686c:7383:e0e2:ad95:9fce)
06:29:30 × king_gs quits (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d) (Remote host closed the connection)
06:29:47 king_gs joins (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d)
06:30:16 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
06:31:17 mc47 joins (~mc47@xmonad/TheMC47)
06:35:16 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
06:36:41 matthewmosior joins (~matthewmo@173.170.253.91)
06:37:09 rockymarine joins (~rocky@user/rockymarine)
06:40:36 × trillp quits (~trillp@2001:19f0:6401:b10:e09a:50b0:71c8:3a8e) (Quit: zzz)
06:40:49 × m5zs7k quits (aquares@web10.mydevil.net) (Ping timeout: 250 seconds)
06:42:58 jonathanx joins (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
06:43:29 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
06:44:37 m5zs7k joins (aquares@web10.mydevil.net)
06:47:19 acidjnk joins (~acidjnk@p200300d6e7137a8728215a7bf170f917.dip0.t-ipconnect.de)
06:48:31 libertyprime joins (~libertypr@118-92-64-32.dsl.dyn.ihug.co.nz)
06:50:04 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
06:51:29 Lycurgus joins (~juan@user/Lycurgus)
06:58:15 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
06:59:00 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Client Quit)
07:00:19 × dr_merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds)
07:00:57 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:01:18 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
07:03:03 kenran joins (~user@p200300df77304e009722e54b6bbb7be2.dip0.t-ipconnect.de)
07:05:28 <dminuoso> In a tree, are there commonly used names for branches that specifically start a) from the root, or b) at a leaf?
07:06:00 trillp joins (~trillp@2001:19f0:6401:b10:e09a:50b0:71c8:3a8e)
07:06:16 <dminuoso> Note, by branch I mean a sequence of connected nodes (unless there's also a more commonly used name here)
07:06:19 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
07:06:42 × poscat quits (~poscat@2408:8206:4823:6cd3:718a:f4cb:b156:91dd) (Ping timeout: 264 seconds)
07:07:28 poscat joins (~poscat@114.245.105.176)
07:09:40 × trillp quits (~trillp@2001:19f0:6401:b10:e09a:50b0:71c8:3a8e) (Client Quit)
07:09:58 michalz joins (~michalz@185.246.207.200)
07:11:08 <opqdonut> dminuoso: that's usually called a "path"
07:11:20 <opqdonut> (though technically a path is a sequence of edges, not vertices...)
07:12:05 lortabac joins (~lortabac@2a01:e0a:541:b8f0:54a2:286d:4b33:4572)
07:12:09 <dminuoso> Mmm right. "root path" and "leaf path" do not sound terribly
07:12:11 Ram-Z joins (~Ram-Z@li1814-254.members.linode.com)
07:16:47 rockymarine joins (~rocky@user/rockymarine)
07:16:51 <[_________]> "branches that start from the root" - isn't that a tree ? "branches that start at a leaf" - isn't that an empty set ?
07:18:46 <dminuoso> [_________]: Just ignore directionality. But if you want all paths to just point towards leafs, then consider a) a path that starts in the middle of the tree but stops *before* a leaf, b) a path that starts in the middle of the tree but extends towards a leaf, and b) a path that starts at the root node.
07:19:23 phma_ joins (~phma@host-67-44-208-193.hnremote.net)
07:20:47 × xstill_ quits (xstill@fimu/xstill) (Quit: Ping timeout (120 seconds))
07:21:03 xstill_ joins (xstill@fimu/xstill)
07:21:21 × lagash quits (lagash@lagash.shelltalk.net) (Ping timeout: 260 seconds)
07:21:47 × shriekingnoise quits (~shrieking@186.137.167.202) (Quit: Quit)
07:22:05 lagash joins (lagash@lagash.shelltalk.net)
07:22:06 shriekingnoise joins (~shrieking@186.137.167.202)
07:22:37 <[_________]> if you want all paths, that's a) tree b) tree c) tree; it doesn't matter which node you choose as a root
07:23:05 <dminuoso> That is not helpful.
07:23:06 × phma quits (phma@2001:5b0:210b:aca8:56:2d35:7769:5de3) (Ping timeout: 260 seconds)
07:23:34 <dminuoso> That's like suggesting the phrase "substring" is silly because its also just a "string"
07:23:51 <[_________]> subtree ? :)
07:24:07 <dminuoso> b) and c) have particular relationships to the original tree, and I would like a terminology that emphasises on that relationshipo
07:28:56 × jmorris quits (uid537181@id-537181.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
07:28:58 <opqdonut> mathematically speaking a computer science tree is a "directed tree" or a "rooted tree"
07:29:03 × libertyprime quits (~libertypr@118-92-64-32.dsl.dyn.ihug.co.nz) (Quit: leaving)
07:29:11 nate3 joins (~nate@98.45.169.16)
07:29:18 <opqdonut> it has a designated root
07:29:29 <opqdonut> (which induces directions on all edges)
07:29:51 <opqdonut> dminuoso: one more thing to consider is are these paths directed, i.e. can you have a leaf-to-leaf path that goes "up", then "down"?
07:31:04 dr_merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
07:31:15 <dminuoso> Nope, all paths follow the ordering of the
07:32:44 <dminuoso> But I think I will just adopt "root path", "leaf path" and "complete path" (where the last one refers to a path that extends from a root all the way to a leaf, and as such is also both a root and leaf path)
07:32:48 <opqdonut> ok so then, in standard jargon, you're working with directed paths in a directed/rooted tree
07:32:57 <opqdonut> yeah root/leaf/complete paths sounds nice
07:34:18 <darkling> If we're inventing terms, then I'd also suggest "non-terminal path", for one that neither starts at the root nor ends at a leaf, and "partial path" for one that doesn't go all the way from the root to a leaf.
07:34:36 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
07:35:31 <darkling> So a partial path is anything not complete, and complete and non-terminal are disjoint.
07:35:37 × dr_merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 244 seconds)
07:35:47 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Exeunt juan@acm.org)
07:36:02 <darkling> Oh, and a complete path is both a root and a leaf path.
07:40:14 <dminuoso> Can you elaborate on partial path further? I do not understand what you mean by it.
07:40:27 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
07:40:35 cfricke joins (~cfricke@user/cfricke)
07:41:12 <[Leary]> 'Root path' and 'leaf path' don't sound right to my ear. I'd make that 'root-initial path' and 'leaf-terminal path'.
07:42:02 gmg joins (~user@user/gehmehgeh)
07:42:51 × `2jt quits (~jtomas@105.red-88-17-232.dynamicip.rima-tde.net) (Ping timeout: 244 seconds)
07:43:52 poscat0x04 joins (~poscat@2408:8206:4823:2a7:d78b:34b7:cd4f:29cd)
07:44:51 × poscat quits (~poscat@114.245.105.176) (Ping timeout: 252 seconds)
07:44:57 dr_merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
07:48:08 <Axman6> surely branch(es) that start at the root(s) are trunk(s)?
07:48:12 × razetime quits (~quassel@117.193.7.114) (Ping timeout: 265 seconds)
07:48:17 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
07:49:09 <dminuoso> Axman6: Oh I like that!
07:51:06 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
07:51:16 <Axman6> Speaking arboristically, of course
07:52:04 <Axman6> Or arboreally I guess, though I am trained in how to fell trees with a chainsaw, so I guess I could also be an arborist
07:53:21 <dminuoso> How do you get from being an arborist to writing Haskell?
07:54:11 <DavidBinder> Googling for deforestation, probably.
07:54:31 <dminuoso> Haha. Priceless.
07:54:34 `2jt joins (~jtomas@105.red-88-17-232.dynamicip.rima-tde.net)
07:54:49 <Axman6> damn, just walk in and drop a chracker like that? well done
07:54:54 <Axman6> cracker*
07:56:11 <Axman6> @remember DavidBinder dminuoso: How do you get from being an arborist to writing Haskell? DavidBinder: Googling for deforestation, probably.
07:56:11 <lambdabot> Done.
07:56:28 <DavidBinder> :)
07:57:22 × lisbeths quits (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
07:57:22 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 265 seconds)
07:57:39 <Axman6> To answer the question, I'm a volunteer in the State Emergency Service, and we do a fair amount of chopping up trees that've fallen on people's houses
07:58:20 <dminuoso> But then you are not trained in how to fell trees, but in how to unfell them right?
07:59:07 <Axman6> a semi-fallen tree may still need felling - and it's much harder to do so usually because the tree has already decided where it wants to go
07:59:12 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
07:59:21 <Axman6> an upright tree can usually be made to go where you want it to
07:59:37 <dminuoso> I guess its also somewhat more dangerous, because a lot of wood might be under intense pressure right?
08:00:05 <dminuoso> (or its tension rather)
08:01:11 <Axman6> chainsawing is all about tension and compression, and understanding what parts of the tree are in which state
08:01:47 lottaquestions_ joins (~nick@104.221.24.83)
08:02:23 yobson_ joins (~yobson@mail.jotron.com)
08:02:39 <Axman6> When I was first learning, I was working on a tree that I ended getting two saws stuck in - felt pretty shitty until the guy teahing us, who has a massive amount of experience, almost got his saw stuck too. turns out the whole tree was in compression so wanted to close up oin the saw, because it was laying down in an arch. We should've paid more attention to the Romans I guess
08:03:31 <darkling> Yeah, but then, what have they ever done for us, eh?
08:03:31 × lottaquestions quits (~nick@2607:fa49:503e:7100:ede3:2530:9317:b779) (Ping timeout: 244 seconds)
08:03:52 <Axman6> Not much recently, that's for sure
08:04:31 <dminuoso> They have contributed to this story https://twitter.com/foone/status/1572260363764400129
08:05:02 razetime joins (~quassel@117.193.7.114)
08:06:19 × shriekingnoise quits (~shrieking@186.137.167.202) (Quit: Quit)
08:06:42 × lottaquestions_ quits (~nick@104.221.24.83) (Quit: Konversation terminated!)
08:07:06 lottaquestions_ joins (~nick@2607:fa49:503e:7100:7430:a788:fee1:3622)
08:08:30 × jonathanx quits (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Ping timeout: 265 seconds)
08:09:19 <dminuoso> [Leary]: Thanks by the way, given how my code is turning out, that differentiation becomes very useful.
08:09:25 <dminuoso> I now have root-terminal and root-initial paths.
08:10:12 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
08:10:14 matthewmosior joins (~matthewmo@173.170.253.91)
08:11:36 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
08:13:20 × mvk quits (~mvk@2607:fea8:5ce3:8500::778c) (Ping timeout: 244 seconds)
08:13:54 DavidBinder9 joins (~DavidBind@event202.raeume.uni-konstanz.de)
08:14:18 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
08:14:35 jakalx joins (~jakalx@base.jakalx.net)
08:15:01 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
08:15:16 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
08:16:48 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
08:17:25 rockymarine joins (~rocky@user/rockymarine)
08:25:50 × ft quits (~ft@p3e9bc57b.dip0.t-ipconnect.de) (Quit: Lost terminal)
08:26:29 × titibandit quits (~titibandi@xdsl-212-8-150-57.nc.de) (Quit: Leaving.)
08:27:13 phma_ is now known as phma
08:28:46 matthewmosior joins (~matthewmo@173.170.253.91)
08:32:56 × DavidBinder9 quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
08:35:51 waldo joins (~waldo@user/waldo)
08:40:06 fjMSX joins (~hypni2p@2.92.213.55)
08:41:08 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
08:41:14 MajorBiscuit joins (~MajorBisc@145.94.161.115)
08:43:12 yobson___ joins (~yobson@mail.jotron.com)
08:43:13 × yobson_ quits (~yobson@mail.jotron.com) (Read error: Connection reset by peer)
08:43:46 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
08:46:08 jonathanx joins (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
08:46:57 ellensol joins (~ellen@ua-84-216-129-63.bbcust.telenor.se)
08:50:48 kuribas joins (~user@ptr-17d51en07nrswztiuk4.18120a2.ip6.access.telenet.be)
08:50:51 __monty__ joins (~toonn@user/toonn)
08:51:31 <kuribas> Free Monad effect systems are just dependency injection, and using them only for testing is just Mocking. Change my mind.
08:51:58 <kuribas> (and mocking should be avoided at all costs).
08:53:07 <tdammers> mocking is really just taking code out of its natural habitat and running it in a lab environment
08:54:21 <tdammers> the difference between "mocking" and "running a unit test against a function" is one of perspective - "mocking" typically implies that there are side-channel dependencies, i.e., we're testing something impure, which means that instead of just providing all inputs as arguments, we must provide some inputs as "environment"
08:54:49 rockymarine joins (~rocky@user/rockymarine)
08:55:54 <kuribas> mocking means replacing existing code with other code (usually to eliminate side effects).
08:56:35 <kuribas> You could call it a "lab environment".
08:56:52 <kuribas> However it is a fake lab, using cardboard, ducktape, etc...
08:57:23 <kuribas> It's a bit better with static types and dependency injection, since at least you can garantee that the interface is correct.
08:58:15 <ski> "Potemkin testing" ?
08:59:38 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
08:59:42 × olsner quits (~salparot@c83-252-230-207.bredband.tele2.se) (Ping timeout: 268 seconds)
09:00:56 <ski> i guess a deep embedding with a non- standard/intended interpretation is somewhat related
09:01:06 × jonathanx quits (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Remote host closed the connection)
09:01:16 zxx7529 joins (~Thunderbi@user/zxx7529)
09:01:23 jonathanx joins (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
09:02:31 <kuribas> but it feels to me that you havent factored out business logic from side effects.
09:02:50 <__monty__> Do you suggest testing on production servers instead?
09:02:51 <kuribas> And if all you code does is call side-effects, then it's just better to run an integration test.
09:03:21 <kuribas> __monty__: an integration environment mimicking production is always a good idea.
09:03:32 <kuribas> as in, taking real data and configuration.
09:03:41 <ski> (e.g. instead of calling `IO' stuff directly, in the primitives of your EDSL monad (and your run mostly runs the `IO' layer, after handing some initialization and finalization), you instead produce a data structure (and then your run interprets this into `IO') .. that way, you could provide an alternate interpretation, which might be used for mocking)
09:03:42 <dminuoso> mimicking production != mocking.
09:03:51 <kuribas> __monty__: of course not sending stuff to customers!
09:03:52 olsner joins (~salparot@c83-252-230-207.bredband.tele2.se)
09:04:04 <dminuoso> The relevant difference is that `mocking` is simulating things that are naturally out of your control.
09:04:19 <dminuoso> Its for external dependencies.
09:05:14 <kuribas> that's what integration is for
09:05:33 <kuribas> any external dependencies can also be used for testing as well.
09:05:39 <tdammers> no, integration testing is for verifying the interactions of multiple components.
09:05:56 <tdammers> and no, external dependencies can *not* always be used for testing
09:06:33 <dminuoso> Example: Lauch controls of nuclear missiles are not a good idea for testing nuclear missile guidance computer code.
09:06:34 <tdammers> if you're writing a missile control system, testing it against real missiles would be extremely expensive, and it would also introduce a lot of factors out of your control, such as for instance weather
09:06:43 dminuoso high fives tdammers
09:06:46 <tdammers> woo hoo
09:07:23 <tdammers> Even if you use dummy warheads - say you want to test how your control system fares in a 100-knot crosswind. What are you going to do, wait for a hurricane?
09:07:26 titibandit joins (~titibandi@xdsl-212-8-150-57.nc.de)
09:07:53 <dminuoso> In that analogy a wind tunnel would be a kind of weather mock.
09:08:10 <Clinton[m]> Given... (full message at <https://libera.ems.host/_matrix/media/r0/download/libera.chat/7fad18514757db4d84e7edce2db747709a5613dc>)
09:09:53 × frost quits (~frost@user/frost) (Quit: Ping timeout (120 seconds))
09:10:14 <dminuoso> Clinton[m]: No.
09:11:04 <dminuoso> Clinton[m]: `instance C ... => T (H...)` gives you an instance T (H ...) irrespective of whether `C ...` is met or not.
09:11:13 <MangoIV[m]> To come back to my problem from yesterday; someone here answered, that cabal doesn't consider pkg-config, however, I just read that the first thing that cabal does when trying to build its plan is to run `ghc-pkg --list-all` to list all available packages; if a package is already hidden there, I would assume cabal would not be able to find it when building its plan, is that correct?
09:11:46 <dminuoso> For example, `instance Ord x => Show a` is a Show instance matching literally *all* types, whether they have Ord or not.
09:11:58 <dminuoso> *instance Ord a => Show a` pardon me
09:12:43 <dminuoso> (In other word, instance context is not considered for instance resolution)
09:13:14 <int-e> MangoIV[m]: Cabal will consider all registered packages. The hidden/exposed distinction is for ghci.
09:13:38 <ski> Clinton[m] : when considering `C (Exists f)', it has no way of knowing which `a' was used inside a particular value of type `Exists f'. note that different values of that type can contain values of type `f a' for *different* types `a'
09:13:39 <MangoIV[m]> * To come back to my problem from yesterday; someone here answered, that cabal doesn't consider pkg-config, however, I just read that the first thing that cabal does when trying to build its plan is to run `pkg-config --list-all` to list all available packages; if a package is already hidden there, I would assume cabal would not be able to find it when building its plan, is that correct?
09:13:39 <MangoIV[m]> Sorry, I think I'm getting more and more confused, I think I confused pkg-config and ghc-pkg ugh
09:13:51 <MangoIV[m]> int-e: ok, thanks.
09:13:52 <dcoutts_> MangoIV[m]: and I'm not sure what you mean about pkg-config. Cabal does have some support for pkg-config packages.
09:14:30 <ski> Clinton[m] : so, e.g. to get `Show (Exists f)' you *need* to embed a `Show a' constraint (or something equivalent), *inside* the `Exists f' data type
09:14:49 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
09:14:53 <MangoIV[m]> dcoutts_: I think I confused pkg-config and ghc-pkg here.
09:15:07 <dcoutts_> ok :-) np
09:15:33 waldo_ joins (~waldo@user/waldo)
09:16:30 <[Leary]> Clinton[m]: I'm not sure, but it sounds like you might want `instance (forall a. C (f a)) => C (Exists f)`.
09:17:19 <ski> Clinton[m] : also, it still won't work for type classes with binary methods (classes `C t' with methods taking more than one `t' as an input) (except perhaps if you have enough constraints (`Typable' say), enabling you to compare the `a's). and classes with methods taking no `t' as input, but producing some, are also problematic (which `a' to pick ?) .. in some cases, it might work (`Read')
09:17:28 nschoe joins (~quassel@178.251.84.79)
09:17:34 × sagax quits (~sagax_nb@user/sagax) (Ping timeout: 246 seconds)
09:18:01 × ellensol quits (~ellen@ua-84-216-129-63.bbcust.telenor.se) (Quit: leaving)
09:18:02 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
09:18:14 × waldo quits (~waldo@user/waldo) (Ping timeout: 268 seconds)
09:18:24 <ski> Clinton[m] : btw, did you see i suggested the `some' package, the other day, as a response to your query about a version that didn't include a constraint ?
09:18:30 <ski> @hackage some
09:18:31 <lambdabot> https://hackage.haskell.org/package/some
09:18:48 <jackdk> Clinton[m]: the other option is to use the tools in https://hackage.haskell.org/package/constraints-extras-0.3.2.1/docs/Data-Constraint-Extras.html and write `instance Has c f => c (Exists f)`. It uses an auxiliary typeclass to enumerate the specific `c (f a)`s you need for that particular f.
09:19:17 × thyriaen quits (~thyriaen@2a02:8109:8340:686c:7383:e0e2:ad95:9fce) (Remote host closed the connection)
09:19:25 <jackdk> This is useful when the `f` is a tag GADT like you see in `dependent-sum` and `dependent-map`
09:19:32 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 265 seconds)
09:20:09 thyriaen joins (~thyriaen@2a02:8109:8340:686c:7383:e0e2:ad95:9fce)
09:20:10 <ski> Clinton[m] : anyway, that issue with existentials (later deciding one would like to bundle some more constraints for the hidden type), is one reason why one might want to prefer a version which has a parameter for the constraints (so one could write generic code, not always fixed to a particular set of constraints)
09:20:34 × thyriaen quits (~thyriaen@2a02:8109:8340:686c:7383:e0e2:ad95:9fce) (Client Quit)
09:23:21 <ski> [Leary] : hm, that might work too, in case there actually is an instance `forall a. C (f a)', for the `C' and `f' in question
09:23:41 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
09:24:23 <ski> (i guess e.g. `forall a. Eq (IORef a)' would be one such example .. any others that spring to mind ?)
09:26:27 Pickchea joins (~private@user/pickchea)
09:28:15 ellensol joins (~ellen@ua-84-216-129-63.bbcust.telenor.se)
09:28:24 <ski> Clinton[m] : your exact code for `blah' would work, with [Leary]'s suggestion. but the question is whether you'd be able to satisfy the context on the instance
09:28:28 × zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection)
09:30:02 luffy joins (~chenqisu1@183.217.203.170)
09:30:53 rockymarine joins (~rocky@user/rockymarine)
09:31:35 <ski> jackdk : such an instance, for a particular `c' ?
09:31:50 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
09:33:26 <kuribas> tdammers: that's a red herring, most people mocking don't have real world side-effects like a nuclear blast.
09:33:33 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
09:34:07 <kuribas> tdammers: and obviously you want to mock for that (contrived) case.
09:34:40 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
09:34:45 img joins (~img@user/img)
09:34:56 × ellensol quits (~ellen@ua-84-216-129-63.bbcust.telenor.se) (Read error: Connection reset by peer)
09:35:04 <kuribas> tdammers: but mocking and effect systems do not make this claim (to avoid irreversable real world interactions), but they use examples like "getting the time".
09:35:12 <jackdk> ski: come again?
09:35:20 <kuribas> tdammers: I don't see how "getting the time" is having a lasting impact on the world...
09:35:53 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 250 seconds)
09:36:25 × zxx7529 quits (~Thunderbi@user/zxx7529) (Quit: zxx7529)
09:36:51 <ski> jackdk : `instance Has c f => c (Exists f)' doesn't look like valid Haskell code to me. i was wondering if you meant it for particular values of `c' (or else maybe meant to write something between the `=>' and the `c')
09:38:15 <jackdk> ski: right, yes. some concrete capital C.
09:38:32 ski nods
09:39:21 <tdammers> kuribas: it's an extreme example, but I can come up with milder ones if you like
09:39:34 <kuribas> tdammers: please do :)
09:39:39 <tdammers> "getting the time" is actually a pretty good one
09:40:01 <tdammers> how do you test whether your code will work as designed during DST transition, when you're testing against an actual system clock?
09:40:20 <kuribas> tdammers: I just pass the time to the pure logic?
09:40:27 <tdammers> exactly
09:40:57 <kuribas> but that's not what I mean with "mocking".
09:40:58 <tdammers> and as long as your code is written in such a way that "get the current real-world time" is just accessing a pure input, that's fine
09:41:30 <tdammers> but at some point, your system will interact with a real hardware clock in some way, and somewhere between that and the pure logic on the inside, there's still room for errors, and you want to test that stuff
09:41:31 × luffy quits (~chenqisu1@183.217.203.170) (Ping timeout: 250 seconds)
09:41:48 <tdammers> or how about concurrent code? how do you test concurrency scenarios?
09:42:04 <kuribas> tdammers: sure. But that's an integration test, not mocking.
09:42:12 <__monty__> There's also more practical reasons. Spinning up a local DB for every test just takes longer than mocking the expected replies.
09:42:17 <jackdk> property-based state machine testing?
09:43:13 <kuribas> yeah, hedgehog has state maching testing
09:44:14 <kuribas> https://hedgehog.qa/article/haskell-state-machine
09:44:28 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
09:46:57 <tdammers> kuribas: no, that's not "integration testing", you're not interested in the integration between the actual real-time clock and your code, the goal is still to only test your own code
09:47:14 <tdammers> it's just that "your own code" has a real-time clock as a sidechannel dependency
09:47:52 <kuribas> "your system will interact with a real hardware clock in some way" <- that isn't solved with mocking.
09:48:18 rockymarine joins (~rocky@user/rockymarine)
09:48:20 <tdammers> OK, let's talk code
09:48:49 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
09:48:54 <tdammers> so you have your time logic that goes something like this: getAgeInYears :: Person -> UTCTime -> Int
09:49:24 <tdammers> Pretty straightforward, no? You get the person's birth date (which is part of the Person data type somehow), you take a current UTC time, and it gives you their age in years.
09:49:43 <tdammers> You don't need to mock anything to test this, you can just feed it whatever dates you want
09:49:46 <tdammers> that's great.
09:49:46 <kuribas> you need a timezone as well.
09:49:53 × jonathanx quits (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Ping timeout: 252 seconds)
09:49:58 <tdammers> sure, but let's ignore timezones for the moment
09:50:00 <dminuoso> kuribas: A very simple example: You use an external API that is not developed by yourself, and the service provider has no testing/staging environment, only production.
09:50:12 <dminuoso> That is an extremely common reality for a lot of developers.
09:50:29 <tdammers> let's just assume we have their birth date in UTC, and we're interested in biological age, not bureaucratic age
09:50:40 <tdammers> not the point anyway
09:50:53 <tdammers> but now we have some other function, say: printPersonAge :: Person -> IO ()
09:51:01 <tdammers> which goes something like this:
09:51:26 <kuribas> the service provider doesn't need "staging", you can just make a separate account for staging data.
09:51:44 <tdammers> printPersonAge p = do { t <- getCurrentUTCTime; printf "%s is %i years old.\n" (personName p) (getAgeInYears p t) }
09:52:08 <maerwald[m]> kuribas: ah... separate account for staging on a real blockchain?
09:52:12 <tdammers> we can't test this against arbitrary timestamps anymore, because getCurrentUTCTime is a sidechannel dependency
09:52:16 <dminuoso> kuribas: That is not always an option.
09:52:16 <maerwald[m]> Who's gonna pay for the tests
09:53:20 <dminuoso> kuribas: We're a mobile reseller, we have to interface with Telefonica for a variety of services (SIM registration, mobile number portability). This is not something you can really play with.
09:53:39 <dminuoso> Nor is this going to be cheap, as activating a SIM card is going to create a real cost for instance.
09:54:04 <dminuoso> So the only realistic option is to mock out the API, so our telefonica interfacing code can be tested to some degree.
09:54:28 <tdammers> you would even go and write a mock *client* in order to test your mock API
09:54:48 <tdammers> so then you have a mock talking to a mock, with no production code at all in your test case
09:55:25 <kuribas> dminuoso: sure, that looks like a good usecase.
09:55:38 <kuribas> dminuoso: but still you want to test before deploying code to custumers right?
09:55:44 <kuribas> dminuoso: or do you test in production?
09:56:10 ellensol joins (~ellen@emp-180-217.eduroam.uu.se)
09:58:10 <kuribas> if you have some service which is really expensive, takes a long time, or does something dangerous, then having some mocks does make sense.
09:58:16 <dminuoso> A mix of both. We have a staging environment which interfaces with external production APIs.
09:59:08 <tdammers> I've been in similar situations with an online bookstore, who used a third-party API for backordering books - again not something you can just play with, because your API calls lead to actual physical books being loaded into actual physical crates and onto actual physical trucks that drive across the country and then those actual physical books land on the doorsteps of actual physical people, and
09:59:10 <tdammers> someone has to actually pay for those books
09:59:44 <tdammers> credit rating checks are another example of APIs that you can't just play with, because all credit rating requests 1) cost money, and 2) contribute to the rating of the subject you're inquiring about
09:59:59 <dminuoso> So at some point we do try it out, and incur small costs. But its a manual process where its up to us to ensure we do not have active SIM cards left after the tests are done
10:00:57 <dminuoso> Simple request/response schemes are simple to mock though. It gets way more tricky when the API is stateful.
10:01:02 <tdammers> in the bookstore API case, we would never run automated tests against the real API, those would all run against a mock; but whenever we suspected that the mock wasn't faithful to the real API, we would occasionally order some books for real and just write them off
10:01:25 <tdammers> oh, and the concurrency thing is another prime example
10:01:42 × `2jt quits (~jtomas@105.red-88-17-232.dynamicip.rima-tde.net) (Remote host closed the connection)
10:02:06 <dminuoso> At any rate, mocking for external dependencies is frequently the only choice you have. Internally I would avoid it whenever possible.
10:02:10 <tdammers> the nasty thing about concurrency is that you often run into bugs that only occur when the stars align in a certain way, when the timing is juuuuust wrong, and those conditions can be rare but not rare enough to be acceptable
10:02:43 <tdammers> so you kind of need a way to doctor the universe such that the "terrible conditions" occur all the time
10:03:13 <dminuoso> Keeping mock behavior up-to-date with the actual behavior is going to create real headaches. *But*, if you do this in an automated fashion, you may get the benefit of doing partial integration tests.
10:03:14 <kuribas> tdammers: in that case, isn't property testing more useful?
10:03:20 <kuribas> tdammers: or something like tla?
10:03:33 <tdammers> kuribas: no, because property testing cannot bend time
10:03:51 <kuribas> it can "simulate" time
10:03:51 <dminuoso> That is, if you have tests asserting that your mock corresponds to the real thing behaviorally, then mocks for internal dependencies can be a really cool thing.
10:03:51 matthewmosior joins (~matthewmo@173.170.253.91)
10:04:02 <tdammers> that's one peculiarity of Haskell's execution model: our notion of "effects" does not include execution time / performance
10:04:06 <__monty__> tdammers: Wait what? People asking for your credit rating affects your credit rating? Negatively, I'm assuming?
10:04:13 <dminuoso> __monty__: Of course.
10:04:24 <tdammers> __monty__: that's undocumented and considered a trade secret, but, yes.
10:05:05 <tdammers> I think the idea is that when there's a lot of credit rating requests, but not a lot of actual credit being granted, then that's a red flag
10:06:22 <__monty__> Is this restricted to North America or does it go on behind the scenes everywhere?
10:06:43 <dminuoso> __monty__: I would expect most private credit rating agencies to use similar techniques.
10:06:44 <tdammers> this was the German "SCHUFA", so no, not North America
10:07:14 <int-e> ...when there's no law against it...
10:07:18 <dminuoso> It's absurd how SCHUFA manages to dodge GDPR regulators...
10:07:32 <int-e> . o O ( systemrelevant )
10:08:02 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
10:08:31 <tdammers> Oh, and it also matters *who* makes the request. If you take a loan from a bank, they will pretty much *always* check your credit rating, so that's not a red flag; but shops selling commodities will not need to issue a query until you have failed to pay your bills with them before and want to order from them again, so when a request like that comes in, it means you have been "misbehaving" before,
10:08:33 <tdammers> and that is going to count against you
10:09:40 <dminuoso> But differences between countries are interesting again.
10:09:55 <__monty__> This doesn't seem ripe for exploitation at all.
10:10:12 <dminuoso> Supposedly, having more credit cards improves credit rating in the US. Not being constantly in-debt is weighted negatively there.
10:10:31 <int-e> __monty__: tbf that's a given when banks are involved
10:10:41 <dminuoso> But I suppose its a mental model designed to train people into constantly overspending.
10:10:47 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 252 seconds)
10:10:47 <int-e> which they are, indirectly as it may seem
10:11:38 <int-e> dminuoso: But it's all rasonable: somebody asking for credit who's never needed it before is a red flag too. :-/
10:11:56 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
10:12:13 <dminuoso> I dont know about you, but to me someone constantly asking for credit indicates not having enough money.
10:12:19 <int-e> (I think the overspending is a problem. But it's profitable for banks as long as the people don't default. Which is pretty hard to do.)
10:13:09 zaquest joins (~notzaques@5.130.79.72)
10:14:43 <int-e> ("hard to do"... John Oliver did a piece on bankruptcy a year ago: https://www.youtube.com/watch?v=GzFG0Cdh8D8 ...it was interesting)
10:14:56 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
10:16:03 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 248 seconds)
10:17:08 gurkenglas joins (~gurkengla@p548ac72e.dip0.t-ipconnect.de)
10:17:52 jakalx joins (~jakalx@base.jakalx.net)
10:21:37 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds)
10:33:23 <kuribas> tdammers: I wonder, instead of mocking your book order API, couldn't you just have your code return data of type [BookOrder]?
10:34:29 <dminuoso> Yes, that's called mocking.
10:35:12 <dminuoso> But as I pointed out, simple request/response schemes are trivial to mock - often you can also record real request/responses and just replay them
10:39:01 matthewmosior joins (~matthewmo@173.170.253.91)
10:43:04 seydar joins (~seydar@154-27-113-252.starry-inc.net)
10:47:31 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 246 seconds)
10:50:36 <tdammers> kuribas: in principle yes, except that the interactions are more involved than just producing a list of book orders and throwing it over the fence
10:50:53 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
10:52:53 <tdammers> meaning that your backordering code needs some kind of state tracking, and it also needs to interleave database transactions with the API calls
10:53:14 <tdammers> and of course you can model all that in a pure DSL - but guess what, that's *exactly* how you would mock these things in Haskell
10:54:55 <kuribas> so, do you need a fancy effect system then?
10:56:48 xff0x joins (~xff0x@2405:6580:b080:900:a11c:672e:e426:9fe0)
11:00:27 seydar joins (~seydar@154-27-113-252.starry-inc.net)
11:03:57 rockymarine joins (~rocky@user/rockymarine)
11:07:52 kuribas` joins (~user@d51529c17.access.telenet.be)
11:09:47 frost joins (~frost@user/frost)
11:09:51 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
11:09:51 × kuribas quits (~user@ptr-17d51en07nrswztiuk4.18120a2.ip6.access.telenet.be) (Ping timeout: 268 seconds)
11:11:35 × talismanick quits (~talismani@2601:200:c100:c9e0::24ac) (Ping timeout: 244 seconds)
11:12:06 × david quits (~david@2a01:e34:ec2b:d430:44a:f5ca:9867:d69d) (Ping timeout: 244 seconds)
11:12:23 <tdammers> no, though if you're using one anyway, you might be able to use it for that
11:16:59 × ellensol quits (~ellen@emp-180-217.eduroam.uu.se) (Ping timeout: 265 seconds)
11:17:11 dminuoso wants a ScopedTypeVariableWithoutForall
11:17:20 <dminuoso> Call it ImplicitScopedTypeVariables if you want.
11:17:51 <dminuoso> Im somewhat surprised this has not been the default from all the way to the beginning.
11:18:29 × Ram-Z quits (~Ram-Z@li1814-254.members.linode.com) (Quit: ZNC - http://znc.in)
11:20:31 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
11:21:37 × kuribas` quits (~user@d51529c17.access.telenet.be) (Ping timeout: 250 seconds)
11:21:52 Ram-Z joins (~Ram-Z@li1814-254.members.linode.com)
11:22:24 rockymarine joins (~rocky@user/rockymarine)
11:24:01 <dr_merijn> dminuoso: That's intentional
11:24:25 <dr_merijn> dminuoso: Because the goal was "enabling this extension should not break working code in the module you enable it in"
11:24:47 × coot quits (~coot@213.134.165.79) (Quit: coot)
11:25:18 <dminuoso> dr_merijn: No rather, why ScopedTypeVariables with implicit forall wasnt the default at the beginning of the language.
11:25:24 <dr_merijn> ah
11:26:18 <dr_merijn> Because that's now how researchers wrote code in the preceding lazy languages? :p
11:27:10 <ski> dminuoso : yes, the whole extension is backwards
11:27:14 <[Leary]> I would rather we had MandatoryForall from the start.
11:28:55 ellensol joins (~ellen@emp-50-230.eduroam.uu.se)
11:29:30 <ski> (also, i'd like result type signatures with my `PatternSignatures', please)
11:30:17 <dminuoso> Sure, MandatoryForall + type variable scoping would be fine too.
11:30:21 <dr_merijn> I'd also like mandatory type signatures :p
11:30:22 <dminuoso> Perhaps even the best of all solutions.
11:30:42 nate3 joins (~nate@98.45.169.16)
11:30:43 <dminuoso> Since that quickly lets you identify where quantification occurs, and when you use a type variable from an outer scope
11:30:43 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
11:31:49 kuribas joins (~user@ptr-17d51en07nrswztiuk4.18120a2.ip6.access.telenet.be)
11:32:31 <dminuoso> Let UnicodeSyntax be enabled by default too, ∀x. is very rapidly written and does not consume too much width either.
11:33:29 <dr_merijn> dminuoso: It's only rapidly written by nerds like you (and maybe me xD), 90% of people don't have a clue how to type that without copy-paste :p
11:33:56 ellensol_ joins (~ellen@ua-84-216-129-63.bbcust.telenor.se)
11:34:04 <dminuoso> So? It's not mandated, non-nerds can type forall just fine.
11:35:23 <dr_merijn> The real crime is the . separator for forall being one character while ::, -> and => are 2
11:35:24 <kuribas> I don't know how to type it (without looking up some emacs commands).
11:35:29 <dr_merijn> Wrecks aligning shit
11:35:43 <kuribas> dr_merijn: I have this problem in idris :)
11:35:43 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
11:35:43 × ellensol quits (~ellen@emp-50-230.eduroam.uu.se) (Ping timeout: 268 seconds)
11:35:54 <dminuoso> dr_merijn: Okay, we should just make it: forall a..
11:35:57 <dminuoso> :>
11:36:00 <[Leary]> dr_merijn: = too. It should be :=.
11:36:03 <kuribas> dr_merijn: suddenly : and -> don't align
11:36:16 <dr_merijn> kuribas: I set up my mac to use the SEA interface to type LaTeX and get unicode :p
11:36:16 <kuribas> even though IMO swapping : and :: is a mistake in haskell.
11:36:31 <dr_merijn> [Leary]: Naah, that's ok, you don't generally need to align that
11:37:20 <dminuoso> dr_merijn: but honestly the . issue is easily solved by font-lock mode.
11:37:26 <dminuoso> Dont have emacs? Tough luck!
11:38:08 <dminuoso> Maybe I should actually font-lock forall to ∀
11:38:12 × waldo_ quits (~waldo@user/waldo) (Ping timeout: 264 seconds)
11:39:33 <dr_merijn> dminuoso: How does font-lock mode (whatever it is) solve the . issue?
11:41:56 rockymarine joins (~rocky@user/rockymarine)
11:42:13 <dminuoso> dr_merijn: You can alter how things get displayed, so you can display the syntactic "." from forall as say ".."
11:42:41 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
11:43:30 × yobson___ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
11:45:12 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
11:46:54 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
11:47:10 <dr_merijn> Vim can do that, but that seems like a crime against good taste :p
11:47:51 <dminuoso> Well, in your view of the world everyone is a criminal, so...
11:48:02 <dminuoso> (Except for yourself, perhaps?)
11:48:40 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
11:50:46 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer)
11:50:51 ski would like explicit `forall' prefixing the type signature to *inhibit* the tyvars scoping over the defining clauses
11:52:08 <dminuoso> I mean there is some rational argument to be made with the inverse. The forall gives an explicit binding site, and just like in value-world, introduction of an additional binding site shadows outer binders.
11:52:38 <dminuoso> It is a bit less convenient perhaps, but I feel like it would read a lot nicer
11:52:47 <ski> yes, with `foo :: forall a. ..a..', obviously `a' only ought to be in scope in `..a..', nowhere else
11:52:57 <ski> anything else is inconsistent
11:54:06 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
11:55:07 <[Leary]> By the same argument, arguments to a function shouldn't be in scope in where decls. Though I could get behind that.
11:56:21 <dminuoso> And then we should also get a separate letrec
11:56:24 <dr_merijn> [Leary]: That'd be a godawful regression in power that'd make a ton of my code way uglier ;_;
11:56:34 <dminuoso> And maybe a whererec
11:56:48 yobson joins (~yobson@mail.jotron.com)
11:57:38 <ski> [Leary] : no, because i read `foo x = ..y.. where y = ..x..' as `forall x y. (foo x = ..y.. where y = ..x..)', the `forall' scoping over both the main defining equation, and the attached `where'-claause
11:57:46 <dr_merijn> My hot take: letrec is stupid and 100% of people (at least those I asked :p) who complain about Haskell not having letrec are 1) not using -Wall (or disabling name shadowing) and 2) being sloppy with their name shadowing and thus entirely too blame for their own misery :p
11:58:09 fef joins (~thedawn@user/thedawn)
11:58:19 DavidBinder joins (~DavidBind@event202.raeume.uni-konstanz.de)
11:58:30 <ski> (you could also say `forall x. exists y.', if you prefer. it doesn't make a difference, since `y = ..x..' uniquely determines `y' (from `x'))
11:58:33 <[Leary]> ski: Then you can apply the same scoping logic to type arguments.
11:58:47 ellensol joins (~ellen@emp-50-230.eduroam.uu.se)
11:59:09 <ski> no, because `foo :: forall a. ..a..' is read as `foo :: (forall a. ..a..)'. `::' is the top-level construction in the AST
11:59:09 × ellensol_ quits (~ellen@ua-84-216-129-63.bbcust.telenor.se) (Ping timeout: 268 seconds)
11:59:38 × dr_merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Quit: restart)
12:02:51 <[Leary]> The AST isn't important. `foo :: Type; foo = ...` is just a nice syntax for `foo :: Type = ...`
12:03:01 <[Leary]> In that view, the forall clearly scopes over the expression body.
12:03:38 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
12:06:14 <[Leary]> s/Type/Foo
12:07:58 <[Leary]> I mean, the AST is important if you're only talking about some strict interpretation of the syntax. But semantically I think this is a better interpretation.
12:08:54 × DavidBinder quits (~DavidBind@event202.raeume.uni-konstanz.de) (Ping timeout: 252 seconds)
12:10:57 <dminuoso> Another thing that comes to mind, is that with the view that `foo :: ..a..` is a top level construct there should be no reason this comes into scope for an unrelated top level construct at all. You would need an explicit @a binder `foo @a = ...` (which I guess is on its way to GHC, I recall a proposal for it), and then pass it along manually.
12:11:12 matthewmosior joins (~matthewmo@173.170.253.91)
12:11:18 <dminuoso> Consistency would demand no type-signature scoping here.
12:11:47 lyle joins (~lyle@104.246.145.85)
12:13:59 × martin02 quits (~silas@141.84.69.76) (Ping timeout: 252 seconds)
12:15:39 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
12:18:33 × kenran quits (~user@p200300df77304e009722e54b6bbb7be2.dip0.t-ipconnect.de) (Changing host)
12:18:33 kenran joins (~user@user/kenran)
12:18:44 × off^ quits (~off@173-160-76-137-atlanta.hfc.comcastbusiness.net) (Remote host closed the connection)
12:18:53 matthewmosior joins (~matthewmo@173.170.253.91)
12:19:51 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 258 seconds)
12:20:07 rockymarine joins (~rocky@user/rockymarine)
12:21:54 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
12:26:28 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
12:27:23 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
12:27:52 × titibandit quits (~titibandi@xdsl-212-8-150-57.nc.de) (Quit: Leaving.)
12:31:08 × ec_ quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
12:31:08 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
12:31:08 × califax quits (~califax@user/califx) (Remote host closed the connection)
12:31:08 × jpds1 quits (~jpds@gateway/tor-sasl/jpds) (Read error: Connection reset by peer)
12:31:08 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
12:31:41 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
12:31:54 califax joins (~califax@user/califx)
12:32:00 jpds1 joins (~jpds@gateway/tor-sasl/jpds)
12:32:42 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
12:33:27 ec_ joins (~ec@gateway/tor-sasl/ec)
12:35:00 merijn is now known as dr_merijn
12:35:43 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
12:36:20 × troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 244 seconds)
12:36:46 × frost quits (~frost@user/frost) (Ping timeout: 252 seconds)
12:37:55 × lemonsnicks quits (~lemonsnic@cpc159519-perr18-2-0-cust114.19-1.cable.virginm.net) (Ping timeout: 248 seconds)
12:37:58 lemonsni- joins (~lemonsnic@cpc159519-perr18-2-0-cust114.19-1.cable.virginm.net)
12:39:12 <dminuoso> maerwald[m]: By the way. One thing I must get right. Recall how we talked about Monsanto and kill genes that prevent crops from producing seeds that can grow into plants again?
12:39:30 <dminuoso> It turns out that this is not an evil thing. Its something farmers should *want*.
12:39:53 <dr_merijn> dminuoso: To be fair, it can be both ;)
12:40:00 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
12:40:02 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
12:40:08 <dminuoso> Yeah but it's not evil at all.
12:41:07 × kenran quits (~user@user/kenran) (Quit: ERC 5.4.1 (IRC client for GNU Emacs 29.0.50))
12:41:41 <dminuoso> The reason you buy Monsanto crops is because you want extremely efficient yield from H1 crop. If that crop generates volunteer plants, it can decimate your profit margin rather quickly.
12:41:53 kenran joins (~user@user/kenran)
12:42:14 <dminuoso> It's just another mechanism to increase yield.
12:42:56 × kenran quits (~user@user/kenran) (Client Quit)
12:49:55 × EvanR quits (~EvanR@user/evanr) (Remote host closed the connection)
12:50:00 ph88 joins (~ph88@95.90.247.31)
12:50:22 EvanR joins (~EvanR@user/evanr)
12:50:55 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.6)
12:52:30 rockymarine joins (~rocky@user/rockymarine)
12:55:31 <ski> "In that view, the forall clearly scopes over the expression body." -- i still don't agree. i parse `foo :: Foo = ...' as `(foo :: Foo) = ...'. and even if we're not to think of the `::' as subordinate to `=' (so `::'-`=' being some kind of ternary/mixfix operator here), i would still think of it like `(foo) :: (Foo) = (...)'
12:56:13 <ski> otoh, with `forall a. (foo :: Foo; foo = ...)' or even `forall a. (foo :: Foo = ...)', the situation is different
12:57:02 <ski> dminuoso : considering the type-signature doesn't need to be grouped near the defining equations, yes
12:57:08 <ski> [Leary] ^
12:57:49 <dminuoso> I guess there is some point to that, you can actually put the type signature at the bottom of the file, but have its scope extend very illogically to some portion of the file.
12:59:06 × king_gs quits (~Thunderbi@2806:103e:29:ac5e:a16e:4ac9:a89b:4d) (Quit: king_gs)
12:59:10 <ski> also, there's `foo,bar :: T; foo = ...; bar = ...'
12:59:28 <dminuoso> Heh you were faster than me here. :)
12:59:46 <ski> .. about to type the same ? :)
12:59:54 <dminuoso> Yeah.
13:01:06 <dminuoso> I was considering something slightly more elaborate with quantification - `foo,bar :: forall t. ..t..` - but I was a bit stuck how to conjure a surprising example out of this
13:02:08 <dminuoso> Another thing is, if memory serves right the Haskell report does not forbid duplicate type signatures.
13:02:32 ph88^ joins (~ph88@95.90.247.31)
13:03:18 waleee joins (~waleee@h-176-10-137-138.NA.cust.bahnhof.se)
13:04:15 phma_ joins (phma@2001:5b0:210b:aca8:55c3:ae:c6b9:e9a1)
13:04:34 <ski> > let t,t :: (); t = () in t
13:04:36 <lambdabot> error:
13:04:36 <lambdabot> Duplicate type signatures for ‘t’
13:04:36 <lambdabot> at <interactive>:1:5
13:05:12 × acidjnk quits (~acidjnk@p200300d6e7137a8728215a7bf170f917.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
13:05:45 × ph88 quits (~ph88@95.90.247.31) (Ping timeout: 265 seconds)
13:07:54 <ph88^> hey guys, i get an error like myprogram.EXE: C:\path\logfile: openFile: invalid argument (Invalid argument) when i copy that filepath and look for the file with powershell i can find the file. How can i debug this problem ?
13:07:56 × gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 265 seconds)
13:07:56 × phma quits (~phma@host-67-44-208-193.hnremote.net) (Ping timeout: 265 seconds)
13:07:58 ellensol_ joins (~ellen@ua-84-216-129-63.bbcust.telenor.se)
13:08:15 × ellensol quits (~ellen@emp-50-230.eduroam.uu.se) (Ping timeout: 252 seconds)
13:08:41 waldo joins (~waldo@user/waldo)
13:10:38 bontaq` joins (~user@ool-45779fe5.dyn.optonline.net)
13:10:45 tomku joins (~tomku@user/tomku)
13:11:33 <geekosaur> "invalid argument" isn't file not found. it's more likely you specified invalid open flags (possibly something not properly supported on Windows)
13:13:15 bontaq` is now known as bontaq
13:14:16 × dr_merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Quit: leaving)
13:16:19 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
13:17:15 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Client Quit)
13:17:25 × causal quits (~user@50.35.83.177) (Quit: WeeChat 3.6)
13:18:00 merijn joins (~dr_merijn@86-86-29-250.fixed.kpn.net)
13:18:30 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
13:19:06 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
13:19:13 matthewmosior joins (~matthewmo@173.170.253.91)
13:21:25 jonathanx joins (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
13:21:55 merijn is now known as dr_merijn
13:22:55 Joao003 joins (~Joao003@187.85.87.1)
13:23:08 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 265 seconds)
13:23:09 <Joao003> I'm a newbie pls help me
13:25:04 jero98772 joins (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c)
13:27:46 <geekosaur> what is your issue? (it's usually better to just start woith your actual question)
13:29:44 <Joao003> everything
13:31:39 acidjnk joins (~acidjnk@p200300d6e7137a8728215a7bf170f917.dip0.t-ipconnect.de)
13:32:07 <geekosaur> @where cis194
13:32:07 <lambdabot> https://www.seas.upenn.edu/~cis194/spring13/lectures.html
13:32:49 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
13:32:57 <geekosaur> this is a good online course with exercises (unlike LYAH which is a good tour but doesn't really teach you much because it doesn't have exercises)
13:33:33 chexum joins (~quassel@gateway/tor-sasl/chexum)
13:33:58 <geekosaur> that said, "everything" doesn't tell anyone much. are you having problems with a particular part of Haskell, or just looking for learning resources?
13:34:19 <geekosaur> or maybe in a Haskell course and just plain lost
13:35:02 troydm joins (~troydm@176.37.124.197)
13:35:09 × mesaoptimizer quits (apotheosis@user/PapuaHardyNet) (Quit: nyaa~)
13:35:19 mesaoptimizer joins (apotheosis@user/PapuaHardyNet)
13:36:15 × raym quits (~raym@user/raym) (Quit: gonna try a theme change)
13:37:45 raym joins (~raym@user/raym)
13:37:53 × raym quits (~raym@user/raym) (Client Quit)
13:38:59 kenran joins (~user@user/kenran)
13:41:12 × waldo quits (~waldo@user/waldo) (Ping timeout: 264 seconds)
13:42:28 kenran` joins (~user@user/kenran)
13:45:23 edm joins (sid147314@id-147314.hampstead.irccloud.com)
13:45:34 × ellensol_ quits (~ellen@ua-84-216-129-63.bbcust.telenor.se) (Read error: Connection reset by peer)
13:45:50 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
13:45:50 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
13:45:50 wroathe joins (~wroathe@user/wroathe)
13:46:23 × kenran quits (~user@user/kenran) (Ping timeout: 268 seconds)
13:48:47 × jpds1 quits (~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
13:50:11 jpds1 joins (~jpds@gateway/tor-sasl/jpds)
13:50:19 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 258 seconds)
13:50:41 chexum joins (~quassel@gateway/tor-sasl/chexum)
13:52:01 kenran` is now known as kenran
13:54:16 jakalx parts (~jakalx@base.jakalx.net) ()
13:54:26 jakalx joins (~jakalx@base.jakalx.net)
13:56:03 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
13:56:29 ellensol joins (~ellen@emp-50-230.eduroam.uu.se)
13:57:41 <dminuoso> Mmm, say I have a bunch of polymorphic IsTree operations (but no RULES) that are mildly large that are going to be used at only two types. Two specialisation pragmas would be ideal right?
13:58:02 <dminuoso> It feels like INLINABLE does not buy me much if I dont have RULES (or expect the code to optimize well with outer code)
13:58:45 × jpds1 quits (~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
14:00:35 × ellensol quits (~ellen@emp-50-230.eduroam.uu.se) (Ping timeout: 248 seconds)
14:01:05 titibandit joins (~titibandi@xdsl-212-8-150-57.nc.de)
14:01:31 raym joins (~aritra@user/raym)
14:01:39 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 248 seconds)
14:02:17 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
14:03:21 × kenran quits (~user@user/kenran) (Remote host closed the connection)
14:03:26 rockymarine joins (~rocky@user/rockymarine)
14:03:50 kenran joins (~user@user/kenran)
14:04:11 <ph88^> geekosaur, i was using openFile filepath ReadMode which works in an older version of my program
14:04:20 <dminuoso> Alternatively, if I specify both INLINABLE and SPECIALISE, will I get the specialized unfoldings available as well?
14:06:00 jpds1 joins (~jpds@gateway/tor-sasl/jpds)
14:06:26 <geekosaur> ph88^, odd. any chance you have older build artifacts sitting around, maybe?
14:07:28 <ph88^> geekosaur, ye the old binaries are available ... i'm putting some print statements in the old version of the code and rebuild them to compare the input path once again
14:08:42 <geekosaur> I didn't mean that, I meant older objects possibly confusing the build. hard for me to imagine it breaking like that otherwise, unless something else changed (ghc version, etc.)
14:08:53 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:54a2:286d:4b33:4572) (Quit: WeeChat 2.8)
14:09:45 <geekosaur> I'd also check the pathname going in except that I think Windows doesn't have invalid-for-open filetypes (e.g. AF_LOCAL sockets, Xenix name files)
14:13:49 shriekingnoise joins (~shrieking@186.137.167.202)
14:13:50 waldo joins (~waldo@user/waldo)
14:13:59 <geekosaur> hm, except maybe directories. on unix that would get EISDIR instead of EINVAL…
14:16:44 × gay9 quits (~quassel@94-168-123-190.static.v4.ziggozakelijk.nl) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
14:17:59 × waldo quits (~waldo@user/waldo) (Ping timeout: 250 seconds)
14:19:53 fserucas joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
14:21:52 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
14:23:58 <ph88^> geekosaur, i cloned the repository again, ghc version is the same. "C:/Users/ph88/log\\SAPR742EDL.IS4" works "C:/Users/ph88/log\\SAPL756HG1.IS4" fails when i right click the file and check file attributes they are also the same (except filesize and contents)
14:24:03 × fserucas quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Remote host closed the connection)
14:24:27 fserucas joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
14:24:43 <ph88^> by the way i am trying to create 5585 handles on open files at once .. maybe it's because of this
14:24:54 <geekosaur> that I wouldn't know
14:25:29 <geekosaur> hm, Phyx isn't in #haskell. your question might be for them
14:25:59 <geekosaur> I don't see anything obvious (like a Windows device name) wrong
14:26:19 <ph88^> how could i put a breakpoint in the openFile function ?
14:27:11 × raym quits (~aritra@user/raym) (Quit: leaving)
14:27:40 raym joins (~aritra@user/raym)
14:28:16 × stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 258 seconds)
14:29:26 gurkenglas joins (~gurkengla@p548ac72e.dip0.t-ipconnect.de)
14:29:56 <geekosaur> https://downloads.haskell.org/ghc/9.2.3/docs/html/libraries/base-4.16.2.0/src/GHC.IO.StdHandles.html#openFile looks slightly weird on Windows, tries POSIX style first and then native
14:30:01 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
14:30:09 ellensol joins (~ellen@emp-50-230.eduroam.uu.se)
14:31:01 <ph88^> is it possible to put a breakpoint there and then step through the code ?
14:31:51 stiell_ joins (~stiell@gateway/tor-sasl/stiell)
14:31:54 <geekosaur> stepping probably requires source to base (therefore GHC)
14:32:16 Kaipii is now known as Kaiepi
14:35:09 × ellensol quits (~ellen@emp-50-230.eduroam.uu.se) (Ping timeout: 265 seconds)
14:35:27 <ph88^> i think i'm having this problem https://stackoverflow.com/a/683582
14:36:26 × seydar quits (~seydar@154-27-113-252.starry-inc.net) (Ping timeout: 268 seconds)
14:38:37 Sgeo joins (~Sgeo@user/sgeo)
14:40:35 yobson joins (~yobson@mail.jotron.com)
14:41:17 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
14:42:15 yobson joins (~yobson@mail.jotron.com)
14:43:23 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
14:46:34 david joins (~david@2a01:e34:ec2b:d430:44a:f5ca:9867:d69d)
14:48:00 × fserucas quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Remote host closed the connection)
14:50:33 phma_ is now known as phma
14:52:50 yobson joins (~yobson@mail.jotron.com)
14:53:24 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
14:53:44 × Joao003 quits (~Joao003@187.85.87.1) (Quit: Client closed)
15:01:13 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
15:04:21 × dr_merijn quits (~dr_merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 250 seconds)
15:04:40 matthewmosior joins (~matthewmo@173.170.253.91)
15:04:56 <ph88^> thanks for thinking along geekosaur i fixed the issue by not opening all handles up front but to wait until they are necessary
15:06:28 <ph88^> i'm using streamly to do some thing in parallel .. how can i give each parallel stream a name and then show the current active streams? similar how ghc shows the modules it's currently compiling ?
15:06:54 geekosaur doesn't know streamly, sorry
15:08:24 yobson joins (~yobson@mail.jotron.com)
15:09:47 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:10:19 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
15:10:26 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
15:10:57 ellensol joins (~ellen@emp-234-199.eduroam.uu.se)
15:12:50 yobson joins (~yobson@mail.jotron.com)
15:13:51 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:14:36 waldo joins (~waldo@user/waldo)
15:14:39 yobson joins (~yobson@mail.jotron.com)
15:15:25 × stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 258 seconds)
15:15:27 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:15:52 stiell_ joins (~stiell@gateway/tor-sasl/stiell)
15:18:36 × jonathanx quits (~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Remote host closed the connection)
15:18:54 yobson_ joins (~yobson@mail.jotron.com)
15:20:16 × yobson_ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:23:49 × ellensol quits (~ellen@emp-234-199.eduroam.uu.se) (Ping timeout: 268 seconds)
15:23:58 × fef quits (~thedawn@user/thedawn) (Remote host closed the connection)
15:23:58 × califax quits (~califax@user/califx) (Read error: Connection reset by peer)
15:23:58 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Write error: Connection reset by peer)
15:23:58 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Remote host closed the connection)
15:23:58 × jpds1 quits (~jpds@gateway/tor-sasl/jpds) (Read error: Connection reset by peer)
15:24:15 slack1256 joins (~slack1256@191.126.227.202)
15:24:24 califax joins (~califax@user/califx)
15:24:29 jpds1 joins (~jpds@gateway/tor-sasl/jpds)
15:24:58 ddb joins (~ddb@tilde.club)
15:25:00 × cheater quits (~Username@user/cheater) (Ping timeout: 264 seconds)
15:25:07 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
15:25:25 ChaiTRex joins (~ChaiTRex@user/chaitrex)
15:26:07 <slack1256> When using eventlog2html and a .eventlog for profiling, how do I recover the full cost-centre stack from a label? The old .hp format had a text line where it mapped the label like 3320 to a cost-center stack. I don't seen something like using `ghc-events show` on the eventlog.
15:26:44 yobson_ joins (~yobson@mail.jotron.com)
15:26:46 cheater joins (~Username@user/cheater)
15:27:46 × yobson_ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:29:44 yobson_ joins (~yobson@mail.jotron.com)
15:30:08 × yobson_ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:31:05 dr_merijn joins (~dr_merijn@86-86-29-250.fixed.kpn.net)
15:32:13 nate3 joins (~nate@98.45.169.16)
15:32:58 yobson joins (~yobson@mail.jotron.com)
15:34:02 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:37:09 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 244 seconds)
15:39:11 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
15:41:10 matthewmosior joins (~matthewmo@173.170.253.91)
15:43:07 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
15:43:14 ellensol joins (~ellen@ua-84-216-129-63.bbcust.telenor.se)
15:43:22 chexum joins (~quassel@gateway/tor-sasl/chexum)
15:43:37 × nschoe quits (~quassel@178.251.84.79) (Ping timeout: 246 seconds)
15:45:14 × waleee quits (~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 265 seconds)
15:47:13 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
15:47:20 matthewmosior joins (~matthewmo@173.170.253.91)
15:50:56 yobson_ joins (~yobson@mail.jotron.com)
15:51:59 × yobson_ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
15:59:49 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c) (Ping timeout: 250 seconds)
16:00:02 yobson joins (~yobson@mail.jotron.com)
16:01:14 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
16:03:22 yobson_ joins (~yobson@mail.jotron.com)
16:04:00 × MajorBiscuit quits (~MajorBisc@145.94.161.115) (Ping timeout: 264 seconds)
16:04:18 × yobson_ quits (~yobson@mail.jotron.com) (Remote host closed the connection)
16:05:07 jakalx parts (~jakalx@base.jakalx.net) ()
16:08:20 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
16:08:25 × ec_ quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
16:09:00 jakalx joins (~jakalx@base.jakalx.net)
16:09:23 Guest62 joins (~Guest62@host-95-250-40-158.retail.telecomitalia.it)
16:09:44 <Guest62> I’m having issues setting up Xmonad, can I get some help here?
16:11:05 ec_ joins (~ec@gateway/tor-sasl/ec)
16:11:34 <Guest62> Where can I get support cause this place looks pretty dead
16:11:59 × Guest62 quits (~Guest62@host-95-250-40-158.retail.telecomitalia.it) (Client Quit)
16:12:14 Guest62 joins (~Guest62@host-95-250-40-158.retail.telecomitalia.it)
16:12:31 <johnw> Guest62: we're not dead, but we're here for Haskell language discussion; Xmonad as an application should have its own support channels somewhere -- but here is not that place, unfortunately.
16:12:43 jero98772 joins (~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff)
16:13:18 <yushyin> Guest62: https://xmonad.org/community.html
16:14:44 <slack1256> Guest62: XMonad's community tends to coordinate via the xmonad mailing list. I always get answers on there.
16:15:15 <Guest62> I’m trying to ask for support on their irc chat but it’s silent
16:15:23 <slack1256> Yeah, not that popular.
16:15:39 <Guest62> Can I DM in case you know anything about xmonad?
16:15:45 <Guest62> i have been trying for 2 days staright
16:16:04 <slack1256> Guest62: I prefer not, I at work rn. I came for answers myself :laughs:.
16:16:31 <Guest62> This whole Xmonad stuff is making me wanna jms ngo
16:16:40 <Guest62> I meant kms
16:17:22 × Guest62 quits (~Guest62@host-95-250-40-158.retail.telecomitalia.it) (Quit: Client closed)
16:17:35 × acidjnk quits (~acidjnk@p200300d6e7137a8728215a7bf170f917.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
16:17:42 <yushyin> have a little patience, not all irc channels are active around the clock
16:17:58 <slack1256> He went away...
16:18:22 <yushyin> no patience there :D
16:20:38 yobson joins (~yobson@mail.jotron.com)
16:21:05 × yobson quits (~yobson@mail.jotron.com) (Remote host closed the connection)
16:23:34 × biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer)
16:25:39 × kenran quits (~user@user/kenran) (Remote host closed the connection)
16:26:15 coot joins (~coot@213.134.165.79)
16:27:32 Tuplanolla joins (~Tuplanoll@91-159-69-34.elisa-laajakaista.fi)
16:28:18 biberu joins (~biberu@user/biberu)
16:29:21 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
16:29:56 chexum joins (~quassel@gateway/tor-sasl/chexum)
16:31:37 × ellensol quits (~ellen@ua-84-216-129-63.bbcust.telenor.se) (Read error: Connection reset by peer)
16:31:59 × califax quits (~califax@user/califx) (Remote host closed the connection)
16:33:31 califax joins (~califax@user/califx)
16:35:45 yobson_ joins (~yobson@mail.jotron.com)
16:36:32 DavidBinder joins (~DavidBind@46-253-189-142.dynamic.monzoon.net)
16:37:21 × DavidBinder quits (~DavidBind@46-253-189-142.dynamic.monzoon.net) (Client Quit)
16:39:15 <monochrom> Entitled presumptious millenials.
16:39:27 <zzz> what is kms ngo?
16:39:29 tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
16:39:55 <c_wraith> the ultimate in self-indulgent drama
16:40:03 × yobson_ quits (~yobson@mail.jotron.com) (Ping timeout: 248 seconds)
16:40:16 <zzz> kill many suspicious non governmental orgs?
16:40:31 <monochrom> In undegrad academia the PIazza course forum system is pretty popular. I had to explain to my students why I refuse to use it.
16:40:33 <Franciman> killy myself probablyu
16:40:51 × coot quits (~coot@213.134.165.79) (Quit: coot)
16:41:23 Henson joins (~kvirc@207.136.101.195)
16:42:02 <monochrom> Among other anti-theses to pedagogy, it is designed to foster a competition of "who gives answers most quickly". It brainwashes students to believe in instant gratification. "If you don't get an answer in 2 minutes, the forum is dead."
16:42:22 <zzz> monochrom: does it make you wanna kms ngo?
16:42:56 <Franciman> apparently, monochrom, it's not due to the nature of the forum, but to the nature of modern society and internet
16:43:05 mmhat joins (~mmh@p200300f1c7062305ee086bfffe095315.dip0.t-ipconnect.de)
16:43:08 <Franciman> everything RIGHT NOW everything FAST or it's not worth it
16:43:20 <monochrom> And here is my economic explanation of why Piazza is designed this way. Its income comes from connecting students with head hunters. Its income does not come from improving pedagogy.
16:43:59 <ph88^> does anyone know what is the fastest regex library in haskell ?
16:44:00 <monochrom> If you make money from getting more students to sign up, clearly you optimize for kissing up, not teaching.
16:44:54 <Franciman> monochrom: that's literally what universities do
16:44:57 <EvanR> monochrom, you're not coping with the technological singularity well
16:45:00 <Franciman> getting more students to sign up
16:45:00 <monochrom> I don't know what's "kms ngo" either.
16:45:17 <Franciman> does it imply that your job is optimised to kissing up
16:45:19 <Franciman> and not to teaching?
16:45:38 <EvanR> exponential increase in students, grades, degrees, until ???
16:46:30 <monochrom> Franciman, you're right about the department of management one floor below my department of computer, math, and stats. :)
16:47:18 <monochrom> Somehow my department worries about the opposite problem that too many students sign up and we need more ways to screen them and pick out the best ones.
16:47:57 <Henson> if they were frustrated with xmonad, kms probably means "kill myself", but I'm not sure what ngo stands for
16:48:11 <Franciman> maybe it was
16:48:13 <Franciman> kms ngl
16:48:35 <monochrom> Indeed if a management course grade is below B, their department starts asking questions. Whereas if a CS course grade is above C, my department starts asking questions!
16:48:48 <slack1256> More like ngmi
16:49:06 <Franciman> cringe
16:49:08 <Franciman> kek
16:49:15 <monochrom> And indeed it is true that some managment profs actually give too many hints before an exam to help students get higher grades.
16:49:45 <Henson> does anybody use Doom Emacs for Haskell development in NixOS with lsp-haskell?
16:50:03 <slack1256> Henson: Close, spacemacs but NixOS and lsp-haskell.
16:50:03 <monochrom> OK I'll stop, it has been offtopic heh.
16:50:07 <slack1256> Works wonders!
16:50:32 <Henson> slack1256: is that installed as a NixOS package, or is spacemacs installed from its own repository?
16:50:40 <monochrom> Does Doom Emacs mean you use wasd for cursor movements? >:)
16:50:55 <EvanR> I hope doom emacs is what it sounds like
16:50:55 <Henson> monochrom: hahahaha!
16:50:57 <monochrom> (vi totally missed that opportunity haha)
16:51:07 <EvanR> that's vivivi
16:51:07 <slack1256> Henson: Emacs from the nixpkgs repository. I just `git clone` spacemacs onto ~/.emacs.d
16:52:10 <Henson> slack1256: Do you install the lsp-mode and lsp-haskell modules using NixOS, or does spacemacs have a package installation function that installs its own modules?
16:52:27 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
16:52:46 yobson joins (~yobson@mail.jotron.com)
16:52:51 <slack1256> I tell emacs to run everything through the `nix develop` or `nix-shell`
16:53:32 <slack1256> On the `nix develop` environment I have lsp-haskell installed.
16:53:36 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
16:54:25 <slack1256> Henson: https://pastebin.com/n3q9kS5b
16:55:02 <Henson> slack1256: the problem I have is that Doom Emacs is installed via "git clone" and it installs its own Emacs packages. Vanilla Emacs is installed via Nix and loads Doom Emacs just fine. However, when I am inside a nix-shell doing development, the PATH variable for haskell-language-server and the other Haskell dev tools isn't propagated into the X11 version of Emacs. The console version works...
16:55:12 <slack1256> Then when I am on a folder that has a shell.nix file or flake.nix file, I run (eval setup-nix-develop-environment).
16:55:49 <Henson> slack1256: fine but the X11 version does not. It's unable to find the various Haskell tools to make lsp-haskell work.
16:56:18 <monochrom> Perhaps you have to launch your emacs by a nix-shell command in a terminal, as opposed to clicking an icon...
16:56:58 <monochrom> Either that or make an icon that runs said nix-shell command, but that's a lost art...
16:57:00 <Henson> monochrom: I launch it from the terminal from within the nix-shell, but I haven't tried using nix-shell to launch emacs itself
16:57:14 <slack1256> Henson: If you use the code sample I just sent you, it will work
16:57:15 <monochrom> Ah OK then I don't know.
16:57:39 <slack1256> You have to let lsp-emacs know how to modify its PATH.
16:58:03 rockymarine joins (~rocky@user/rockymarine)
16:58:09 <slack1256> The other alternative is to use direnv.
16:58:22 <Henson> slack1256: I am new to Emacs, just started learning last week. Can you tell me where to put that code sample. Do I need to manually activate it? Do I have to launch Emacs in a certain way to make it work?
16:58:56 <slack1256> Mmm on doom emacs is different. Spacemacs has a .spacemacs file where you put your config.
16:59:23 <Henson> slack1256: ok, so you just put that code sample somewhere it will get loaded on startup
16:59:30 <slack1256> Right.
16:59:35 × titibandit quits (~titibandi@xdsl-212-8-150-57.nc.de) (Quit: Leaving.)
16:59:39 <monochrom> Oh hey direnv looks interesting and something I might have always wished for!
16:59:40 × califax quits (~califax@user/califx) (Remote host closed the connection)
16:59:55 <Henson> slack1256: are there any special launching instructions, or do you just start emacs from within a nix-shell and it will work?
17:00:16 <slack1256> And when you want to activate it, you have to run M-: (eval setup-nix-shell-environment) RET
17:00:37 <slack1256> Henson: I *don't* launch emacs inside of nix shell session!
17:01:11 <slack1256> I launch emacs and then I let it a sub- nix-shell session where it has access to HLS.
17:01:46 <slack1256> Inside the nix-shell session, you don't have permissions to use the X11 socket IIRC.
17:01:52 califax joins (~califax@user/califx)
17:02:47 <Henson> how do you tell emacs which shell.nix file to use for its environment?
17:04:25 <slack1256> Right, I run the M-: (eval setup-nix-shell-enviroment) RET from the main proyect folder
17:05:30 <slack1256> First time it will take a while, as it downloading the environment.
17:06:24 <Henson> slack1256: ok, I'll give that a try
17:06:27 Henson crosses his fingers
17:07:51 <slack1256> Henson: I know it is bad to give advice and go away, but I have to let my doggy on a walk. I will msg tomorrow to see if you did make it.
17:07:58 × slack1256 quits (~slack1256@191.126.227.202) (Remote host closed the connection)
17:08:50 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
17:10:18 econo joins (uid147250@user/econo)
17:11:14 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
17:13:41 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 265 seconds)
17:14:37 × mbuf quits (~Shakthi@49.205.84.15) (Quit: Leaving)
17:15:22 mastarija joins (~mastarija@2a05:4f46:e03:6000:eff5:a18a:103b:db59)
17:16:39 matthewmosior joins (~matthewmo@173.170.253.91)
17:20:10 × zeenk quits (~zeenk@2a02:2f04:a311:2d00:6865:d863:4c93:799f) (Quit: Konversation terminated!)
17:22:27 <mastarija> Does anyone know if it's possible to measure inner angles of a Trail in diagrams in a simple manner?
17:23:03 <mastarija> Or get lengths of all Trail segments
17:25:48 <[exa]> mastarija: you can get points from it using ToPath, right?
17:27:05 <[exa]> (also maybe trailOffsets etc)
17:27:05 <mastarija> I can get a `Path` :)
17:27:13 × raym quits (~aritra@user/raym) (Ping timeout: 265 seconds)
17:27:32 Midjak joins (~Midjak@82.66.147.146)
17:27:47 zoomer123 joins (~zoomer123@24.133.173.162)
17:27:49 <byorgey> mastarija: did you see my answers in #diagrams?
17:27:50 <mastarija> Yes, trailOffsets can be used to get points, but I was wondering if it's possible to get length of an arc
17:27:57 <mastarija> byorgey: yes
17:28:14 × vglfr quits (~vglfr@145.224.100.190) (Read error: Connection reset by peer)
17:28:24 <mastarija> byorgey: however, if I have bezier, I can't really calculate the correct angle
17:28:25 vglfr joins (~vglfr@145.224.100.190)
17:28:53 <byorgey> oh, sorry, I didn't know you were referring to bezier segments
17:29:01 <mastarija> if I have a straight segment and then continue with a bezier, I'd like to get angle between them
17:29:02 <byorgey> it should be possible but I'd have to think about it a bit harder
17:29:19 <mastarija> I was wondering if there was something ready made
17:30:32 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
17:31:15 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
17:31:19 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
17:32:28 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 246 seconds)
17:34:01 <EvanR> bezier have simple forms for their tangent vectors
17:34:10 × zoomer123 quits (~zoomer123@24.133.173.162) (Quit: Client closed)
17:34:14 img joins (~img@user/img)
17:35:59 <mastarija> EvanR: what do you mean?
17:36:28 <mastarija> You mean they are simple to calculate, or there is a concept called "simple forms"?
17:36:34 <mastarija> :)
17:36:43 <monochrom> dot-producting two tangent vectors gives you cos(the angle). The tangent vector for the straight line segment is easy. The tangent vector for the beizer segment has known formulas.
17:36:47 <EvanR> if I can do the calculus it means its simple
17:37:14 <monochrom> Yeah the English sense of "simple".
17:37:15 <EvanR> like, if diagrams doesn't do it for you... it could xD
17:37:28 <mastarija> Ok, so they are simple to calculate, got it. I assumed that's the case.
17:37:43 <mastarija> I was just looking for a possible ready to go solution in diagrams :P
17:38:08 <monochrom> Ah
17:38:15 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
17:38:32 <EvanR> it's because cubic bezier are formed from cubic polynomials
17:38:54 <EvanR> so like... bring down the power times the coef decrement the power... stuff
17:38:59 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
17:39:03 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
17:39:26 matthewmosior joins (~matthewmo@173.170.253.91)
17:39:33 × califax quits (~califax@user/califx) (Ping timeout: 258 seconds)
17:39:34 <EvanR> you don't even need transcendental math xD
17:39:44 califax_ joins (~califax@user/califx)
17:39:51 <EvanR> (ok, the inverse cosine monochrom mentioned)
17:39:58 <mastarija> Although, I'm not sure how to get appropriate form in diagrams, since all coordinates are relative
17:40:13 <mastarija> I'd have to get absolutely calculated path for that somehow.
17:40:37 <EvanR> definitely something that needs to be integrated into the lib
17:41:01 califax_ is now known as califax
17:41:48 <monochrom> You know what, differentiation means relative coordinates are enough.
17:42:31 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 250 seconds)
17:43:17 <EvanR> yeah a vector doesn't have the concept of where it is based
17:43:44 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
17:47:40 raym joins (~aritra@user/raym)
17:52:09 <byorgey> mastarija: there is an easy way in diagrams to get the tangent at the end of a bezier segment, at least
17:52:28 <byorgey> I forget what it is called though. Some class like Tangent or tangentOf or tangentAt or something like that
17:53:34 × raym quits (~aritra@user/raym) (Remote host closed the connection)
17:53:56 × kimjetwav quits (~user@2607:fea8:235e:b600:14cc:4122:217e:1d45) (Remote host closed the connection)
17:54:28 fef joins (~thedawn@user/thedawn)
17:57:51 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
17:58:21 × yobson quits (~yobson@mail.jotron.com) (Ping timeout: 260 seconds)
17:58:49 raym joins (~aritra@user/raym)
17:59:13 × mastarija quits (~mastarija@2a05:4f46:e03:6000:eff5:a18a:103b:db59) (Ping timeout: 268 seconds)
18:00:32 yobson_ joins (~yobson@mail.jotron.com)
18:00:57 × califax quits (~califax@user/califx) (Remote host closed the connection)
18:01:32 <monochrom> Oh! Probably diagrams-lib Diagrams.Tangent :)
18:04:49 califax joins (~califax@user/califx)
18:04:51 × yobson_ quits (~yobson@mail.jotron.com) (Ping timeout: 248 seconds)
18:07:28 matthewmosior joins (~matthewmo@173.170.253.91)
18:10:19 × razetime quits (~quassel@117.193.7.114) (Remote host closed the connection)
18:10:34 jmdaemon joins (~jmdaemon@user/jmdaemon)
18:15:05 Guest73 joins (~Guest73@p200300ef9718357f545f1ba775403e5c.dip0.t-ipconnect.de)
18:18:38 yobson_ joins (~yobson@mail.jotron.com)
18:19:51 <ph88^> before i opened a bunch of handles and then let several cpu threads work on these files and it parallized great .. now i let each thread open it's own handle and i see the main work is only done on a single thread .. how to debug ?
18:21:23 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
18:22:56 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
18:24:01 × califax quits (~califax@user/califx) (Ping timeout: 258 seconds)
18:24:02 × yobson_ quits (~yobson@mail.jotron.com) (Ping timeout: 244 seconds)
18:24:32 califax joins (~califax@user/califx)
18:28:54 LukeHoersten joins (~LukeHoers@user/lukehoersten)
18:32:47 <monochrom> Under lack of information, blanket answer: Bisection to gain more information or at least identify code difference for potential blame; add more printf debugging to every thread to see where it is blocked.
18:34:21 <monochrom> But that may be answering the wrong question.
18:34:56 <ph88^> i'm using streamly, i'm not putting things on each threads manually
18:35:01 <ph88^> thanks for thinking along monochrom
18:35:49 × LukeHoersten quits (~LukeHoers@user/lukehoersten) (Ping timeout: 246 seconds)
18:36:21 × kuribas quits (~user@ptr-17d51en07nrswztiuk4.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 26.3))
18:36:51 <monochrom> The right question is not to debug an exiting rube goldberg machine, but to attempt to create from scratch a minimum reproduction that tries to corroborate with the hypothesis "opening all handles before creating threads is different from creating threads then open handles".
18:37:15 yobson joins (~yobson@mail.jotron.com)
18:37:32 <monochrom> My expectation being you won't be able to reproduce that independently, therefore must reject the hypothesis and concede that something else you haven't thought of caused the problem.
18:38:01 <monochrom> IOW the scientific method.
18:41:10 akegalj joins (~akegalj@213-202-90-31.dsl.iskon.hr)
18:41:15 <ph88^> kk
18:41:26 akegalj parts (~akegalj@213-202-90-31.dsl.iskon.hr) ()
18:41:29 akegalj joins (~akegalj@213-202-90-31.dsl.iskon.hr)
18:42:31 <EvanR> if you had a proof the parallel algorithm were correct, you could show it to the computer and ask for your money back
18:42:39 titibandit joins (~titibandi@xdsl-212-8-150-57.nc.de)
18:45:40 <Henson> I figured out it. Doom Emacs uses its own environment-setting file. Whenever you type "doom sync" or "doom env" it will regenerate this environment file based on the environment of the shell that called this script. So all I have to do is run "doom env" from within my Nix shell and it will work.
18:46:22 <EvanR> how did someone name something doom and have it not be related to doom
18:46:53 <Henson> EvanR: the splash screen of Doom Emacs is a huge ASCII-art DOOM logo, so it's related in that sense :-)
18:46:58 <EvanR> ok good
18:47:12 <monochrom> Hell, how did Prolog name something "functor" and have it not be related to functor >:)
18:47:22 <monochrom> s/Prolog/the Prolog people/
18:48:40 <geekosaur> or s/Prolog/C++/
18:49:00 <tdammers> let's just hope the JavaScript crowd never gets wind of that word
18:49:02 <monochrom> More roast: How did the C++ people name something "acquisition is initialization" and have it not be related to acquisition or initialization? (It is about release, destruction, and exiting a lexical scope.)
18:49:34 <monochrom> Fortunately the C++ people have backed off from "functor" and now say "function object".
18:50:09 <yushyin> that's nice of them
18:50:17 <Franciman> i wonder when haskell decides to switch to endofunctor
18:50:38 <monochrom> Maybe 30 years.
18:50:54 <geekosaur> RAII is related iff you know that any scope-based initialization implies scope-based deinitialization
18:51:02 <geekosaur> that one doesn't bother me
18:51:04 <monochrom> I mean that's also how long from C++'s "functor" to "function object".
18:51:24 <Franciman> in haskell's case will be never
18:51:29 <Franciman> ;)
18:52:26 <geekosaur> probably correct since it'd cause even more churn than AMP or monad of no return
18:52:27 <monochrom> I am bothered because even "FILE *f = fopen(...)" satisfies both words "acquisition" and "initialization" so it's the worst name possible.
18:52:50 <geekosaur> but that's C think
18:53:31 <monochrom> And then is "f <- openFile ..." Haskell think?
18:53:34 <geekosaur> you don't *do* that in C++, you create a new scope for it
18:53:48 <geekosaur> and let it go out of scope to deinitialize
18:54:07 <geekosaur> that's imported C think. haskell think is withFile
18:54:25 chomwitt joins (~chomwitt@2a02:587:dc14:f500:71c3:d40e:3c82:7bf3)
18:54:32 × fef quits (~thedawn@user/thedawn) (Remote host closed the connection)
18:54:41 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
18:54:44 <monochrom> So a correct name is "lexically scoped acqusition and release".
18:54:44 <ph88^> can i get rts statistics in a easy computer parsable format ?
18:54:50 <monochrom> LSAR
18:55:03 <geekosaur> but in C++ that is implicit, as I said
18:55:14 fef joins (~thedawn@user/thedawn)
18:55:47 <geekosaur> it's the native programming idiom, so something that fits that idiom is reasonably so named
18:56:09 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 265 seconds)
18:56:14 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
18:56:31 <geekosaur> you trip over it because you';re accustomed to C idiom instead of C++
18:56:58 <geekosaur> but a new C++ programmer would be told not to do that
18:57:28 Lord_of_Life_ is now known as Lord_of_Life
19:00:29 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
19:00:50 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
19:01:01 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
19:01:11 × lemonsni- quits (~lemonsnic@cpc159519-perr18-2-0-cust114.19-1.cable.virginm.net) (Quit: ZNC 1.8.2 - https://znc.in)
19:01:13 jakalx joins (~jakalx@base.jakalx.net)
19:04:46 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
19:06:38 <dminuoso> monochrom: Well I think the problem is that RAII has turned into *more* than was originally meant.
19:06:42 <monochrom> I am not sure whether I'm accustomed to the C idiom or anyone would invent that idiom on their own as a first instinct until being told what can go wrong with it.
19:06:50 pavonia joins (~user@user/siracusa)
19:07:13 <dminuoso> RAII, as its name suggests, is about tying resource initialization (that is, establishment of whatever invariants you want your stateful data and the external resource to hold) to acquisition.
19:07:15 <geekosaur> my impression is that it's intended as a counter to the other approved C++ way of acquisition, namely operator new
19:07:40 <dminuoso> It's about tying getResource and initResource together into a singular atomic (not in the sense of concurrency) step
19:07:47 <monochrom> I mean in Lisp and Haskell we do "f x = x : x : []" all the time. Right there I'm allocating a couple of cons cells that are deliberating not destructed upon exiting its lexical scope.
19:08:17 <geekosaur> but you should generally avoid acquiring resources that way unless needed; scoped is preferred, since C++ doesn't do GC so `new`d resources must be explicitly `delete`d
19:09:01 <geekosaur> and something like `fopen` is C-think: you should use a constructor, implying an object with a constructor and probably a destructor
19:09:32 <monochrom> I say that it is not that C taught us to do it, even not that Algol taught us to do it, rather it's every human's first instinct and so we taught every language to do it until 30 years later we realize that it doesn't scale.
19:09:46 <dminuoso> I think its a common theme to pick up on a word or abbreviation that is not well understood, and using it for whatever you think it really means (or what it means to you)
19:09:56 <dminuoso> That's how `function` has become twisted in programming languages the way it has
19:10:25 <tdammers> naming abstract things is hard, so it's actually surprising we have a few that have perfectly reasonable names
19:10:53 <dminuoso> Just like people use REST whenever they see a HTTP-based API, despite almost none of them having read the initial PhD thesis that introduced a very clear definition of what REST even means.
19:11:08 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
19:11:35 <tdammers> haha, yeah. literally just serving HTML pages over HTTP is closer to "REST" than 99% of today's "REST"-APIs
19:11:55 × califax quits (~califax@user/califx) (Remote host closed the connection)
19:13:09 <geekosaur> mm, I'm thinking in terms of C++ history, as programmers realized what worked and what didn't and that new/delete (never mind C style) meant keeping the same bugs you had with C, so scoped variables were to be strongly preferred
19:13:16 lortabac joins (~lortabac@2a01:e0a:541:b8f0:e619:12ba:2d7e:50d6)
19:13:17 <geekosaur> RAII grew out of that but came later
19:14:46 califax joins (~califax@user/califx)
19:16:29 <monochrom> dminuoso: Oh! Probably ACID too.
19:17:18 <monochrom> I had thought "ACID is a fad" until one day I learned that there was a very good paper defining ACID rigorously.
19:17:34 jargon joins (~jargon@184.101.186.15)
19:17:34 <EvanR> whatever RAII is, I'm really dejected by Godot which has crippled the class initializer so it can't practically take arguments most of the time, and so can't properly initialize anything. You have to do that separately, after object creation!
19:17:40 <dminuoso> Would you happen to remember that paper, monochrom?
19:17:42 <EvanR> dunno if that's normal in OOP but its terrible
19:18:00 <monochrom> (And predating "ACID" becoming a popular word.)
19:18:13 <monochrom> I forgot. But it was a serious database research paper.
19:18:37 <EvanR> it's using some sort of resource initialization XOR resource acquisition
19:19:11 <EvanR> another name for it, dumb constructor pattern
19:19:19 <dminuoso> Also on that note, I just recently learned that not all PostgreSQL transactions are greated equal, and that the default isolation level is READ COMMITED which in principle permit non-repeating reads, phantom reads and serialization anomalies.
19:19:47 <monochrom> Oh! https://queue.acm.org/detail.cfm?id=3469647 has a reference, look for "I had a chance recently to chat with my old friend, Andreas Reuter, the inventor of ACID. He and his Ph.D. advisor, Theo Härder, coined the term in their famous 1983 paper, Principles of Transaction-Oriented Database Recovery."
19:20:53 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Remote host closed the connection)
19:21:03 <dminuoso> DOI 10.1145/289.291 seems to be it :)
19:21:07 acidjnk joins (~acidjnk@p200300d6e7137a16b8753f0c5356e398.dip0.t-ipconnect.de)
19:22:05 <monochrom> The acmqueue article itself is also worth a read. It explains that most of us misunderstood or watered-down the "C", and here is the right description.
19:25:36 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
19:26:01 matthewmosior joins (~matthewmo@173.170.253.91)
19:26:52 <EvanR> yeah default isolation levels are usually not absolute
19:26:58 <EvanR> for performance
19:27:14 <monochrom> EvanR: So don't use Godot? :) Its way is the opposite of what's normal in OOP.
19:27:51 <EvanR> it's kind of the only game (engine) in town
19:28:32 <monochrom> Normal OOP all the way between python, js, java, c++ is that each constructor is empowered to properly initialize everything, you should never need to call another init method separately.
19:28:46 <EvanR> ;_;
19:29:22 <EvanR> yeah it's bad even by oop standards
19:29:34 <tdammers> Although the "initialize an object with dummy values and then progressively replace them with the real values by means of 'fluid' method calls" *is* a common pattern in OOP
19:30:10 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
19:30:27 <monochrom> Yeah I just mean it's the norm. There are exceptions and they're well justified.
19:30:38 <EvanR> yeah that's one way, and in some sense just as error prone because crashing now because you forgot to set a property, vs carrying on with the wrong property for unknown time
19:30:58 <tdammers> it's usually a way of working around limited constructor syntax
19:31:20 <monochrom> Or alternatively I mean that normal languages don't force you to initialize later.
19:32:05 <EvanR> the reason is dumb: yeah the constructor works, but the serialization doesn't use it. It restores objects by creating them directly, first with .new() then setting all the properties from disk
19:32:37 <EvanR> so it's broken if and only if the class is used in that context
19:33:14 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
19:33:42 <EvanR> I wonder if that part could be fixed
19:33:44 nate3 joins (~nate@98.45.169.16)
19:37:43 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 265 seconds)
19:37:44 <dminuoso> Progressively replacing dummy values is also a coping mechanism for a code region that is too complex to do differently in.
19:37:46 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
19:39:11 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
19:39:20 <dminuoso> It is the wonder of imperative programming, that you can always solve most problems by incrementally adding adhoc code.
19:40:34 <dminuoso> Heck, even GHC has quite a few places where fields are, depending on the state, initialized with `error "blahablah"` because the alternative of using separate data types or using more sum types introduces too much extra effort
19:41:10 <geekosaur> haskell does that if you fail to initialize a record field explicitly. at least it has a warning for it these days
19:41:16 × yobson quits (~yobson@mail.jotron.com) (Ping timeout: 246 seconds)
19:41:37 <dminuoso> Right in GHC these would contain error diagnostics about what went wrong if you ever managed to access those fields.
19:44:28 talismanick joins (~talismani@2601:200:c100:c9e0::24ac)
19:44:55 LukeHoersten joins (~LukeHoers@user/lukehoersten)
19:47:19 × waldo quits (~waldo@user/waldo) (Quit: quit)
19:49:23 × ubert quits (~Thunderbi@178.165.197.10.wireless.dyn.drei.com) (Ping timeout: 252 seconds)
19:51:05 rockymarine joins (~rocky@user/rockymarine)
19:53:00 yobson joins (~yobson@mail.jotron.com)
19:57:23 × yobson quits (~yobson@mail.jotron.com) (Ping timeout: 248 seconds)
19:58:00 matthewmosior joins (~matthewmo@173.170.253.91)
19:58:07 slack1256 joins (~slack1256@191.126.227.202)
19:58:54 × LukeHoersten quits (~LukeHoers@user/lukehoersten) (Quit: My MacBook has gone to sleep. ZZZzzz…)
20:01:54 ellensol joins (~ellen@178-78-210-152.customers.ownit.se)
20:02:06 × chomwitt quits (~chomwitt@2a02:587:dc14:f500:71c3:d40e:3c82:7bf3) (Remote host closed the connection)
20:02:36 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 260 seconds)
20:04:16 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 244 seconds)
20:05:10 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:e619:12ba:2d7e:50d6) (Quit: WeeChat 2.8)
20:05:16 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
20:08:03 × jinsun quits (~jinsun@user/jinsun) (Ping timeout: 248 seconds)
20:09:30 yobson joins (~yobson@mail.jotron.com)
20:09:37 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 246 seconds)
20:10:50 mvk joins (~mvk@2607:fea8:5ce3:8500::778c)
20:20:32 wroathe joins (~wroathe@50.205.197.50)
20:20:33 × wroathe quits (~wroathe@50.205.197.50) (Changing host)
20:20:33 wroathe joins (~wroathe@user/wroathe)
20:20:53 jinsun joins (~jinsun@user/jinsun)
20:22:25 <ph88^> i'm parsing some big log files line by line and it's going really slow .. does anyone know how to do that in a fast way ?
20:23:04 marinelli[m] joins (~marinelli@2001:470:69fc:105::2d8)
20:23:05 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
20:26:26 <slack1256> ph88^: Without more specific there are not actionable advice: 1) have you tried not do that? maybe load onto a DB and interface doing that if the file is CSV 2) Are you using Bytestring/Text or everything goes through String? 3) Do you need to process all the lines? if so that is a hard limit, you *will* need to process step by step.
20:29:14 <sm> 4) are you using memory inefficiently, causing the RTS to do a bunch of wasteful work ? Check with a profile chart or +RTS -s
20:30:26 nate3 joins (~nate@98.45.169.16)
20:31:18 matthewmosior joins (~matthewmo@173.170.253.91)
20:34:17 × marinelli[m] quits (~marinelli@2001:470:69fc:105::2d8) (Quit: Reconnecting)
20:34:31 marinelli[m] joins (~marinelli@2001:470:69fc:105::2d8)
20:35:58 <EvanR> using String = [Char] subtly wrong will cause severe slowdown, or back when I started haskell, exhaustion of allowed stack, whatever the error for that is called
20:36:18 <EvanR> now I think it will just let you use insane amounts of memory
20:37:08 <EvanR> using [Char] properly shouldn't be that bad but not as efficient as Text
20:40:04 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
20:40:55 <EvanR> [Char] vs Text turns out to be 1 of the main reasons C exists. Strings in B consisted of arrays of words with 2, 4, 5, or whatever convenient number of characters was convenient to pack into the word, per word
20:41:37 <EvanR> when computers starting coming out with byte-based addresses, packed chars started looking very dumb
20:42:11 <EvanR> so they added types to B so you can specify if you're talking about int (word) or char (byte)
20:42:44 <EvanR> RIP
20:43:00 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
20:43:33 <EvanR> two ways to process the packed strings included unpacking the string into 1 char per word, processing, then repacking. And using bit munging to operate on individual chars while packed
20:43:35 <geekosaur> computers already existed with byte based addresses. but they were IBM mainframes 🙂
20:43:49 <EvanR> and here we are dealing with that exact thing in haskell
20:44:04 <geekosaur> everyone else went wigth bizarre word sizes (DEC liked multiples of 3 for some reason, for example)
20:46:35 × akegalj quits (~akegalj@213-202-90-31.dsl.iskon.hr) (Quit: leaving)
20:46:39 <[exa]> 36 bits/word ftw
20:47:27 <EvanR> so if haskell is on the right track with having both unpacked and packed strings, C shouldn't exist!
20:47:32 <geekosaur> and weirdass addressing modes thatlet you select consecutive runs of multiple-of-3 bits to operate on
20:48:18 <geekosaur> TYPE L 8 \o/
20:50:31 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
20:50:37 matthewm_ joins (~matthewmo@173.170.253.91)
20:57:24 × arahael quits (~arahael@203.217.43.212) (Ping timeout: 264 seconds)
20:59:59 × matthewm_ quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
21:00:34 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
21:01:44 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
21:04:29 kenran joins (~user@user/kenran)
21:04:43 matthewmosior joins (~matthewmo@173.170.253.91)
21:04:53 × kenran quits (~user@user/kenran) (Remote host closed the connection)
21:05:31 mastarija joins (~mastarija@2a05:4f46:e03:6000:480e:b508:3f46:25c4)
21:08:51 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 244 seconds)
21:09:04 arahael joins (~arahael@203.217.43.212)
21:09:19 matthewmosior joins (~matthewmo@173.170.253.91)
21:13:46 <talismanick> Is there a notion of "eventual uniqueness" for linear values?
21:14:40 jakalx joins (~jakalx@base.jakalx.net)
21:14:57 <talismanick> Linearity alone doesn't guarantee uniqueness because a nonlinear value can have multiple references and then be made linear (so no more can be added), but has anyone looked into what it takes to show a linear value will also be uniqueness when it's consumed?
21:15:19 <talismanick> will also be unique*
21:17:39 × yobson quits (~yobson@mail.jotron.com) (Read error: Connection reset by peer)
21:17:46 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
21:18:10 × Guest73 quits (~Guest73@p200300ef9718357f545f1ba775403e5c.dip0.t-ipconnect.de) (Quit: Client closed)
21:18:10 yobson joins (~yobson@mail.jotron.com)
21:19:59 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
21:21:55 × titibandit quits (~titibandi@xdsl-212-8-150-57.nc.de) (Remote host closed the connection)
21:22:18 × yobson quits (~yobson@mail.jotron.com) (Ping timeout: 244 seconds)
21:23:29 <jackdk> I'm not really across the area, but I think linear-base does it by putting creation into a linear monad (like in https://hackage.haskell.org/package/linear-base-0.2.0/docs/System-IO-Resource-Linear.html )
21:23:49 × zer0bitz_ quits (~zer0bitz@2001:2003:f748:2000:add8:471e:b979:aa97) (Ping timeout: 246 seconds)
21:27:43 ft joins (~ft@p3e9bc57b.dip0.t-ipconnect.de)
21:30:06 <talismanick> jackdk: Eh, but isn't that giving up the game a little too quickly? Monad opacity around code which manages resources explicitly discards the benefits, no?
21:30:11 × mmhat quits (~mmh@p200300f1c7062305ee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
21:30:16 <talismanick> + I still find monad transformers painful and confusing :)
21:31:15 × acidjnk quits (~acidjnk@p200300d6e7137a16b8753f0c5356e398.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
21:31:58 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 268 seconds)
21:32:39 <jackdk> Beats me. linear haskell was a balancing act based on what you can actually retrofit onto a rather old language. As I said, I'm not really across it: I tried to use it in a side project and was stymied by missing functions in linear-base. I would say that if you're still struggling with transformers, my advice for learning would be to defer thinking about anything linear.
21:32:47 × michalz quits (~michalz@185.246.207.200) (Remote host closed the connection)
21:33:53 × nate3 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
21:34:04 × mastarija quits (~mastarija@2a05:4f46:e03:6000:480e:b508:3f46:25c4) (Quit: WeeChat 3.5)
21:34:31 <[exa]> talismanick: maybe better just not allow anyone to create the references easily in the first place
21:35:34 yobson_ joins (~yobson@mail.jotron.com)
21:36:00 <[exa]> as in, if the value was nonlinear previously and no kittens exploded, why care making it linear?
21:36:28 <talismanick> that's back to uniqueness typing, no?
21:36:51 <talismanick> unless I'm misunderstanding
21:37:00 causal joins (~user@50.35.83.177)
21:37:53 <[exa]> ok let's get technical; you say "references", I guess you mean the haskellish "2 bindings cheaply pointing to 1 thing", right?
21:38:14 <talismanick> yeah, a pointer
21:39:11 <talismanick> I haven't read much about closure reduction and the STG, so my default mental model for execution is graph reduction
21:39:23 × rockymarine quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
21:39:27 <[exa]> yeah that's sufficiently close I'd say
21:40:00 × yobson_ quits (~yobson@mail.jotron.com) (Ping timeout: 264 seconds)
21:42:24 <[exa]> as far as I know the aim of linear typing isn't uniqueness, instead just the fact that you 1] really consume the value 2] don't consume the value in an unexpected way. If you need uniqueness, you must introduce its semantics (and preferably implementation) manually
21:42:41 matthewmosior joins (~matthewmo@173.170.253.91)
21:43:13 <talismanick> I see
21:43:17 <[exa]> one way to run uniqueness on linear types is to have this magic `makeASingleUniqueCopy` of something which returns a beancounted resource
21:43:46 mmhat joins (~mmh@p200300f1c7062304ee086bfffe095315.dip0.t-ipconnect.de)
21:44:33 <[exa]> as far as I know there's currently no easy way to "get rid" of other parts of the graph that point to the thing that you want for yourself, except some dirty STG tricks (and making the copy)
21:45:33 <talismanick> So, make a copy, and that unique copy will be safe to destructively update in-place, but the linear variable is a normal value with a stricter typing discipline?
21:46:09 <[exa]> ...which may seem unfortunate in this case but the resource sharing by default is quite critical for haskells so I don't see it disappearing
21:46:38 <[exa]> yeah, by copying it yourself you create a proof that you're also safe to kill it
21:47:27 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 268 seconds)
21:47:50 <talismanick> Could you automate a proof that linear variables made from a unique one are also unique so that they inherit the destructive update semantics?
21:47:52 <[exa]> re "stricter typing discipline" -- not sure, I never checked how LH actually implements all that stuff, but I wouldn't expect anything remarkably more complicated.
21:48:24 <[exa]> yeah well, if you have some proof that the original one is unique.....
21:48:53 <talismanick> What kind of typeclass magic would that take?
21:49:26 <[exa]> not sure if even typeclasses
21:49:56 <talismanick> A GHC extension? >_>
21:50:02 <talismanick> nvm then lol
21:50:07 <[exa]> technically (for the usual unique purposes in haskells) you'd need to check the whole heap and see if something is pointing to the resource
21:50:20 <talismanick> easier to build a new language at that point
21:50:37 <[exa]> well good luck with walking heaps tbh :D
21:51:48 yobson_ joins (~yobson@mail.jotron.com)
21:51:55 <[exa]> I'd just make a copy
21:52:51 <[exa]> technically you could enforce the language to do some beancounting and generate the original uniqueness proof for you
21:53:35 <[exa]> but you might observe that is practically equivalent to really declaring the whole thing linear in the first place
22:00:19 bilegeek joins (~bilegeek@2600:1008:b058:58ea:bed4:5c49:4f66:54ee)
22:03:27 <[exa]> (nvm I'm off, hopefully someone here will be able to provide better ideas about how to solve this :D )
22:08:38 zebrag joins (~chris@user/zebrag)
22:08:39 × fef quits (~thedawn@user/thedawn) (Ping timeout: 258 seconds)
22:11:47 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
22:18:22 beteigeuze joins (~Thunderbi@2001:8a0:61b5:6101:f0c:e4e3:bfdc:91df)
22:18:32 Colere is now known as LoupGris
22:20:32 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 258 seconds)
22:21:40 chexum joins (~quassel@gateway/tor-sasl/chexum)
22:26:32 <ph88^> Total time 29.312s ( 14.528s elapsed) what's the difference between these two times here in the ghc stats ?
22:28:55 slac53815 joins (~slack1256@186.11.109.251)
22:29:43 <monochrom> I hypothesize that "elapsed time" means wallclock time, i.e., if you use a stop watch to measure the running time, it's going to be 14.528 seconds.
22:29:57 <int-e> and the former counts running time across all threads
22:30:05 <monochrom> I don't know whether I'm right or wrong, but now you can test my hypothesis.
22:30:26 <int-e> (of which there appear to be two in this case)
22:30:50 <monochrom> Whenever I teach a course, the department requires me to review TA applications to help select TAs.
22:31:14 × slack1256 quits (~slack1256@191.126.227.202) (Ping timeout: 265 seconds)
22:31:23 <monochrom> The application form includes "how many hours would you like to work for?"
22:31:57 <monochrom> The TA contract to be awarded is for 4 months, which is the length of one school term/semester here.
22:32:15 donato joins (uid570353@id-570353.ilkley.irccloud.com)
22:32:39 <monochrom> So one time I received an application that states "I want to work for 10000 hours".
22:32:46 <monochrom> So let's see:
22:32:56 <monochrom> > 4*30*24
22:32:58 <lambdabot> 2880
22:33:20 <monochrom> So, how many cores does the applicant thinks they have in their brains? >:)
22:34:16 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds)
22:35:00 <dolio> A lot more than 4.
22:35:05 <int-e> Well they probably have more than one brain cell.
22:35:35 <int-e> . o O ( Also, work for 10 minutes, bill for an hour... isn't that how it goes? )
22:37:37 × lyle quits (~lyle@104.246.145.85) (Ping timeout: 250 seconds)
22:42:02 rsm5560 joins (~rsm5560@c-24-0-153-56.hsd1.nj.comcast.net)
22:44:07 × matthewmosior quits (~matthewmo@173.170.253.91) (Remote host closed the connection)
22:46:57 matthewmosior joins (~matthewmo@173.170.253.91)
22:47:58 <darkling> I find it linguistically amusing that a semester is only four months, not the stated six. :)
22:48:08 <rsm5560> Hi. a confused newby here.  I'm trying to use runghc and Shelly package, but can't even get the package recognized byt it.  I tryied the documented :runghc -package --ghc-arg=shelly -v  -- app/Main.hs
22:48:08 <rsm5560> but get cannot satisfy -package shelly so I gather it isn't in package.conf.d but I don't know how to get it there?
22:48:09 <rsm5560> I have it in listed as a build-dependency in the foo.cable file and ghc build didn't complain, but I'm totally confused
22:48:09 × jespada quits (~jespada@77.97.36.250) (Quit: Textual IRC Client: www.textualapp.com)
22:48:09 <rsm5560> any help?
22:48:44 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
22:54:15 <geekosaur> does `cabal exec runghc app/Main.hs` work?
22:54:55 <geekosaur> cabal no longer pollutes global package namespaces with possibly incompatible packages; you must go through it to access its packages
22:55:03 <rsm5560> yes that works
22:55:05 <geekosaur> unless you like dealing with conflicts manually
22:56:03 × yobson_ quits (~yobson@mail.jotron.com) (Ping timeout: 248 seconds)
22:57:20 × matthewmosior quits (~matthewmo@173.170.253.91) (Ping timeout: 265 seconds)
22:57:46 <rsm5560> I'm trying to find the most beginner friendly way to do things.  I quickly got into details of ghc and cabel and ghc-pkg that lost me.
22:57:47 <rsm5560> any advice to a more detailed getting started documentation that doesn't got from hello-world to "understand everything" would be great for me
22:58:02 lyle joins (~lyle@104.246.145.85)
22:58:16 × Tuplanolla quits (~Tuplanoll@91-159-69-34.elisa-laajakaista.fi) (Quit: Leaving.)
22:58:26 matthewmosior joins (~matthewmo@173.170.253.91)
22:59:34 <talismanick> https://0x0.st/o4on.txt
23:00:32 talismanick pounds table trying to get brittany to work
23:01:54 <talismanick> `lsp-haskell-formatting-provider` (Elisp variable from lsp-haskell.el) is set to "brittany" and has "Ensure the plugin is enabled" at the end of the docstring, w/o how to do that
23:02:42 rockymarine joins (~rocky@user/rockymarine)
23:03:00 <talismanick> Do I need to rebuild the language server with the brittany flag enabled?
23:03:31 yobson joins (~yobson@mail.jotron.com)
23:06:55 × jpds1 quits (~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
23:07:02 × rsm5560 quits (~rsm5560@c-24-0-153-56.hsd1.nj.comcast.net) (Quit: Client closed)
23:07:09 × yobson quits (~yobson@mail.jotron.com) (Read error: Connection reset by peer)
23:07:13 yobson__ joins (~yobson@mail.jotron.com)
23:08:42 jpds1 joins (~jpds@gateway/tor-sasl/jpds)
23:08:42 × yobson__ quits (~yobson@mail.jotron.com) (Read error: Connection reset by peer)
23:08:42 <talismanick> What's weird is that it worked before
23:08:45 yobson joins (~yobson@mail.jotron.com)
23:08:46 <talismanick> so, no clue what changed
23:09:00 <talismanick> (installed HLS via ghcup)
23:11:30 jespada joins (~jespada@cpc121060-nmal24-2-0-cust249.19-2.cable.virginm.net)
23:13:15 × yobson quits (~yobson@mail.jotron.com) (Ping timeout: 252 seconds)
23:13:54 yobson_ joins (~yobson@mail.jotron.com)
23:20:24 <sm> @where HTAC
23:20:25 <sm> is one I like, rsm5560
23:20:25 <lambdabot> "Haskell Tutorial and Cookbook" by Mark Watson in 2017-09-04 at <https://leanpub.com/haskell-cookbook>
23:21:43 <sm> the current best getting started doc using cabal only is: ...
23:23:42 jmorris joins (uid537181@id-537181.uxbridge.irccloud.com)
23:24:04 <zzz> record update is infixr?
23:24:40 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
23:26:12 × bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 264 seconds)
23:27:34 <sm> ... https://cabal.readthedocs.io/en/stable/getting-started.html I suspect
23:30:48 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
23:34:24 bgs joins (~bgs@212-85-160-171.dynamic.telemach.net)
23:36:23 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
23:36:24 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
23:36:24 wroathe joins (~wroathe@user/wroathe)
23:39:01 × pieguy128 quits (~pieguy128@bras-base-mtrlpq5031w-grc-50-65-93-192-212.dsl.bell.ca) (Ping timeout: 268 seconds)
23:40:10 pieguy128 joins (~pieguy128@bras-base-mtrlpq5031w-grc-50-65-93-192-212.dsl.bell.ca)
23:42:14 <alexfmpe[m]> is the effect of adding an unpack pragma equivalent to "use this as if it was a newtype" ?
23:42:35 redmp joins (~redmp@mobile-166-177-251-115.mycingular.net)
23:42:45 notzmv joins (~zmv@user/notzmv)
23:44:20 <geekosaur> no, because it has an actual constructor still. it's the contained field that no longer has one (and you need an unpack per unpackable field)
23:45:54 <alexfmpe[m]> I meant "use the unpacked type here as if it had been declared as a newtype"
23:47:03 × mmhat quits (~mmh@p200300f1c7062304ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.6)
23:50:50 <geekosaur> it does more than that. newtype avoids adding a level of indirection; UNPACK removes a level of indirection
23:52:08 <geekosaur> in particular, the UNPACKed field must be strict, have one constructor (since there is no constructor tag), and have a known size since it will be stored directly in the record. this is a tighter constraint than on newtypes
23:52:34 × lyle quits (~lyle@104.246.145.85) (Ping timeout: 268 seconds)
23:56:15 mud joins (~mud@user/kadoban)
23:57:46 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)

All times are in UTC on 2022-09-27.