Home liberachat/#haskell: Logs Calendar

Logs on 2023-08-30 (liberachat/#haskell)

00:00:52 × Inst quits (~liamzy@2601:6c4:4085:6d50::a840) (Remote host closed the connection)
00:01:12 Inst joins (~liamzy@2601:6c4:4085:6d50::a10)
00:02:17 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
00:04:19 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
00:04:22 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
00:09:01 × fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
00:12:24 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
00:21:10 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 255 seconds)
00:23:06 thegeekinside joins (~thegeekin@189.180.81.59)
00:24:14 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
00:28:46 × Maxdamantus quits (~Maxdamant@user/maxdamantus) (Ping timeout: 245 seconds)
00:29:18 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
00:30:46 Maxdamantus joins (~Maxdamant@user/maxdamantus)
00:35:34 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 255 seconds)
00:36:28 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 255 seconds)
00:36:40 Square2 is now known as Square
00:39:58 chromoblob joins (~user@37.113.156.54)
00:42:28 bratwurst joins (~blaadsfa@S010610561191f5d6.lb.shawcable.net)
00:43:09 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 250 seconds)
00:44:52 chromobl1b joins (~user@37.113.172.116)
00:45:25 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
00:45:26 × chromoblob quits (~user@37.113.156.54) (Ping timeout: 245 seconds)
00:45:26 shapr joins (~user@2600:1700:c640:3100:6019:9d8e:9090:8797)
00:45:33 chromobl1b is now known as chromoblob
00:45:41 <chromoblob> has somebody ported the "standard set of Haskell structures" like F.,A.,M.,Alternative,MonadXXX,Foldable,Traversable,RWS,transformers,lenses, and such, including the functions outside typeclasses and common instances, to C++?
00:47:53 <segfaultfizzbuzz> how would that work? don't you need gc, naievely at least?
00:48:24 <chromoblob> for what do you need GC exactly?
00:49:04 bilegeek joins (~bilegeek@2600:1008:b004:e71b:f993:4604:698f:bf53)
00:49:12 <segfaultfizzbuzz> like, everything-ish, i think...?
00:49:20 <chromoblob> for example?
00:49:58 <segfaultfizzbuzz> maybe someone else can take the mic here
00:50:25 <segfaultfizzbuzz> chromoblob: i can say this, i have seen a lot of haskell abstractions written in rust, and so you can probably refer to those
00:51:12 <chromoblob> how to find?
00:51:47 <segfaultfizzbuzz> https://github.com/clintonmead/haskell_bits for example, you can find other stuff like this
00:52:26 <segfaultfizzbuzz> haskell is nonstrict, so it is often lazily evaluated,... it kinda makes a todo list as the evaluation proceeds and doesn't compute stuff unless it decides that it is necessary (or has been told to do so)
00:53:41 <geekosaur> I don't think that has much to do with replicating half of Haskell abstractions in C++. neither does GC
00:54:05 <geekosaur> what does is that C++'s type system will allow you to do things that are unsafe, whereas Haskell's will stop you
00:55:02 <geekosaur> (where "unsafe" here means will throw runtime exceptions or even crash because something is wrong that Haskell would have caught at compile time)
00:55:33 <geekosaur> ("crash" meaning dump core)
00:57:34 × chromoblob quits (~user@37.113.172.116) (Ping timeout: 244 seconds)
00:57:43 <geekosaur> I also strongly suspect that mtl-style monad transformers … sigh
00:57:58 <geekosaur> ("are the wrong way to do it in C++")
00:59:58 chromoblob joins (~user@37.113.172.116)
01:00:37 <chromoblob> "clintonmead/haskell_bits" yeah lots of boilerstuff needed to use it
01:00:53 <geekosaur> https://ircbrowse.tomsmeding.com/browse/lchaskell?id=1064537#trid1064537
01:00:57 <geekosaur> for what you missed
01:01:40 <geekosaur> not one you mentioned, but iirc rust has an STM implementation. there are a bunch of things you must not do if you want it to be reliable, but the compiler gives you zero help with that
01:01:53 <geekosaur> in Haskell you get type errors if you violate the STM contract
01:01:57 <segfaultfizzbuzz> yeah i recall seeing an STM somewhere,... i don't think it was production grade tho
01:02:36 × Inst quits (~liamzy@2601:6c4:4085:6d50::a10) (Ping timeout: 248 seconds)
01:04:33 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
01:04:33 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
01:04:33 wroathe joins (~wroathe@user/wroathe)
01:05:44 xmachina joins (~xmachina@modemcable048.127-56-74.mc.videotron.ca)
01:08:43 caryhartline joins (~caryhartl@168.182.58.169)
01:10:59 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
01:11:07 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 255 seconds)
01:12:57 <davros1> People get more done in Rust than Haskell. Agree/disagree ? (I'm asking in 3 places for balance)
01:14:00 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
01:17:06 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
01:17:41 <chromoblob> geekosaur: ok, how to do monad composition properly in C++?
01:20:16 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
01:20:47 <geekosaur> ?? why are you asking me?
01:20:47 <lambdabot> Plugin `compose' failed with: user error (Unknown command: "")
01:21:50 <geekosaur> but your main problem is not that you can't write some kind of composition; it's that it will silently compose garbage that Haskell would correctly reject
01:22:00 <geekosaur> templates are not a substitute for a type system
01:22:45 <geekosaur> (I know generalities about C++; I am not a C++ programmer)
01:24:23 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
01:26:36 × gentauro quits (~gentauro@user/gentauro) (Ping timeout: 246 seconds)
01:26:49 gentauro joins (~gentauro@user/gentauro)
01:27:03 × bratwurst quits (~blaadsfa@S010610561191f5d6.lb.shawcable.net) (Remote host closed the connection)
01:27:28 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
01:29:26 × kupi quits (uid212005@id-212005.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
01:29:31 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 250 seconds)
01:30:03 <chromoblob> geekosaur: because you said, "I also strongly suspect that mtl-style monad transformers", "are the wrong way to do it in C++", you don't remember?
01:31:03 <geekosaur> I said suspect, not that I'd tried it
01:31:17 <geekosaur> mostly because different languages are different
01:31:35 <chromoblob> you don't have to try, i just expect you to have an idea at least
01:31:46 <chromoblob> if you say "wrong way"
01:31:56 <chromoblob> but don't have an idea, it's weird
01:31:58 <geekosaur> you can write Haskell in C++. its performance will suck. C++ is C++, C++ idioms will work better than Haskell idioms
01:32:22 <davros1> c++ can actually do HKT right .. but it's probably not as usable or flawed in some way
01:32:28 <Axman6> davros1: If you're wondering why you aren't getting responses, it's likely because we have a pretty strong culture of not being too worried about the popularity of the language; Of course more Rust is written than Haskell, it's a language that has gained a lot popularity and has a large, active commercial backer in Mozilla. 'Avoid success at all costs' is something many of us take to heart, Haskell doesn't have to be a language for all people.
01:32:50 <davros1> Axman6, yeah I didn't mean to be confrontational, let me elaboraate
01:33:59 <davros1> For the record my apetite for Rust came from trying haskell :) but whilst it was fascinating and impressively elegant, I found it too difficult to use when dealing with IO & state; using gfx libraries was really hard; also I didn't believe a GC could handle game engines.
01:34:13 <davros1> I could see that it would have been really good at asset conditioning pipelines
01:34:41 <davros1> I had the Q in mind from someone else trash talking rust elsewhere
01:34:47 <Axman6> Not saying you're being confrontational, just that the question is kind of uninteresting, and not relevant to those of us who do (or in my case, did) write plenty of propduction code in haskell - it's popularity doesn't really affect out ability to do that
01:34:56 <chromoblob> davros1: which people, same or different?
01:35:04 <geekosaur> chromoblob, I expect that playing to the strengths of templates will work much better than trying to abuse them as typeclasses
01:35:09 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
01:35:29 <davros1> And yes Axman6 I strongly agree that popularity is not a measure of quality (I have to use that argument defending rust vs c++ alot lol)
01:35:30 <geekosaur> but playing to the strengths of templates will result in different code
01:36:08 <geekosaur> that won't really be directly comparable to the original Haskell
01:36:13 <chromoblob> geekosaur: implying templates have a narrow scope?
01:36:22 <geekosaur> implying they have a different scope
01:36:50 <geekosaur> if anything, Haskell is the narrower one, by design
01:38:35 <probie> I certainly get a lot more done in Haskell than in Rust, but it's not a fair comparison. I have a lot more experience writing Haskell than writing Rust
01:39:33 <davros1> There's times when rust might have ended up being a gateway drug to haskell (haskell did make more sense after rust)
01:40:39 <davros1> Currying is neat
01:41:18 <chromoblob> maybe there could be a deterministic, "good" GC
01:42:04 <chromoblob> also, could use some control over it
01:43:26 <chromoblob> geekosaur: so, do you use Haskell for performance? i like Haskell for very high ease and comfort of expression of code
01:43:49 <chromoblob> and i seek primarily that when i ponder Haskell-style stuff in C++
01:44:01 <chromoblob> well OK, it's academic
01:44:42 <chromoblob> but the "performance sucking" may well be not there, at least in enough cases
01:44:59 <chromoblob> and i'm not talking about translating Haskell blindly
01:45:19 <geekosaur> most of my stuiff is in the "if it's faster than I can do it by hand then it's fast enough" category 🙂
01:45:24 <chromoblob> but about replicating the interfaces, more closely or more roughly
01:47:31 <davros1> geekosaur If you want to write Haskell-inspired things in C++ .. maybe I could introduce you to this other language called Rust :)
01:47:35 <EvanR> this is a story I've heard before. I heard all about haskell then I couldn't figure out IO so went to rust
01:47:59 <EvanR> I looked at rust and found zero haskellisms
01:48:12 <chromoblob> really?
01:48:13 <EvanR> meanwhile I think IO is awesome
01:48:14 <chromoblob> i saw some
01:48:30 <EvanR> unfortunate that rust doesn't have IO
01:48:35 <davros1> More OOP, more imperative <--- C++ Rust Haskell --> more FP
01:48:36 <chromoblob> >:p
01:48:51 <chromoblob> Haskell is not "less imperative".
01:49:06 <chromoblob> and isn't "less OOP" as well
01:49:07 <EvanR> rust functional? lol
01:49:12 <jackdk> Haskell is my favourite imperative language. And my favourite dynamically-typed language.
01:49:37 <chromoblob> "dynamically-typed language" 😰
01:49:41 <davros1> Remember that c++ doesnt have pattern matching, or HM inference, and that rust traits are closer to haskell type classes than c++ classes or c++ concepts
01:50:18 <chromoblob> "Remember that c++ doesnt have pattern matching" what about Visitor? >:D
01:50:22 <davros1> Its not pure functional, but its better at doing iterator chaining than C++
01:50:30 <davros1> Thats an ugly mess IMO
01:50:46 <jackdk> The stuff you can do with `Typeable` and `Dynamic` is awesome. I'm rather proud of https://hackage.haskell.org/package/amazonka-2.0/docs/Amazonka-Env-Hooks.html
01:51:09 <EvanR> > fromDyn (toDyn "hoho!") ":(" :: String
01:51:10 <lambdabot> "hoho!"
01:51:40 <EvanR> iterator chaining is now a functional programming thing :'(
01:51:57 <EvanR> I guess python is functional
01:51:58 <davros1> Distinguish FP from PureFP
01:51:59 <chromoblob> stream fusion
01:52:11 <davros1> Many languages that aren't pure FP can do FP
01:52:23 <davros1> They can't do it to the extent of haskell
01:52:38 <EvanR> it's sad that like no language with a "fanbase" has actual function composition
01:52:44 <chromoblob> what do you mean? what's the difference? surely most languages have a pure subset?
01:52:48 <EvanR> esp when they are supposedly functional
01:52:52 <probie> What even is FP?
01:52:53 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
01:52:58 <monochrom> My question would be how could you possibly translate "instance Functor []" (not "instance Functor [a]") to C++. Even for Haskell, someone had to write a paper ("constructor classes") before Haskell could do that.
01:53:04 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
01:53:26 <chromoblob> finally, some concrete thoughts
01:53:31 <EvanR> easily, C++ has had Functors for a long time
01:53:36 <monochrom> hahahaha
01:53:57 <monochrom> I think they stopped saying "functor" a while ago
01:54:15 <monochrom> Stroustrup's book says "function object" or something now.
01:55:22 × otto_s quits (~user@p4ff27e7b.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
01:56:16 <monochrom> That happened in 2013 or before.
01:57:27 otto_s joins (~user@p5de2f1e6.dip0.t-ipconnect.de)
01:57:55 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 255 seconds)
01:58:51 <segfaultfizzbuzz> i am not paying close attention but also worth mentioning is that the rust and the C++ type systems are themselves (strict?) functional programming languages
01:59:24 <segfaultfizzbuzz> ...but,... i dont know, do they have like Map for rust types...?
02:01:14 <monochrom> Under that view, you only have a 1st-order language, i.e., you miss higher-order functions.
02:01:33 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
02:02:08 <monochrom> In Haskell parlance, you miss the kind * -> *
02:02:43 grnman_ joins (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net)
02:02:54 <EvanR> they have containers which can demand traits for the stuff you put in them, Ord or hashable or...
02:03:34 <EvanR> C++ stuff
02:04:33 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21) (Remote host closed the connection)
02:04:48 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21)
02:05:15 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
02:08:38 <Axman6> jackdk: we did pretty good on that hey, type safe dynamics FTW
02:09:16 × bratwurst quits (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Ping timeout: 248 seconds)
02:09:21 <chromoblob> so, a [].fmap takes some type parameters a and b, a function a -> b, a [a] and returns a [b]. at low level, it recreates the structure of [a], then enumerates a's, for each calls the function, and recreates the corresponding b in place by copy elision, and finally returns [b]. if one doesn't want new/malloc, then the caller should get the size of [b] by calling a static method of [], create the
02:09:27 <chromoblob> storage for [b] and pass the pointer to it to fmap so that it creates [b]'s structure in place
02:10:15 <segfaultfizzbuzz> chromoblob: btw check out kokalang
02:10:22 <chromoblob> for lazy []'s, though, ...
02:10:26 <glguy> C++ has "template template parameters"
02:10:48 <chromoblob> note that i nowhere mentioned templates in my description
02:10:58 <jackdk> Axman6: high five
02:11:17 <chromoblob> they can be used for the type parameters, but the fmap code is not templated
02:12:12 <chromoblob> so, i propose two steps, templateful type checking of calls and then templateless implementation
02:12:20 <chromoblob> best of both worlds
02:13:14 <glguy> I have no idea what you're talking about. I'm just reacting a bit to monochrom and EvanR above
02:13:14 <chromoblob> and type checking either gives compile error or passes straight to the templateless implementation, no duplication
02:13:58 <EvanR> was the original objective to have basically a list map HOF in C++
02:14:11 × xff0x quits (~xff0x@ai086045.d.east.v6connect.net) (Ping timeout: 260 seconds)
02:14:36 danza__ joins (~francesco@151.57.243.19)
02:17:01 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
02:17:11 × danza_ quits (~francesco@151.43.239.168) (Ping timeout: 250 seconds)
02:17:36 <chromoblob> but yeah, bind is fuck
02:18:22 <chromoblob> in bind, you have to choose between sequential generation and parallel generation with subsequent copying
02:22:03 <EvanR> pretty sure this covers any FP you need to do in C https://github.com/AlexCeleste/C99-Lambda
02:27:39 <hammond> im worried about this. does having short variable names reduce readability?
02:28:08 <monochrom> It depends.
02:28:15 <hammond> i want to jst use 1 letter variables, and 1 letter functions, but im not sure.
02:28:38 <EvanR> when I use long variable names in haskell it becomes unreadable
02:28:46 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 260 seconds)
02:29:00 <hammond> monochrom: elucidate. I have seen haskell using a lot of one letters, but then I read these books and they say function names should be wordy and expressive.
02:29:15 <hammond> EvanR: I agree.
02:30:05 × ddellacosta quits (~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 245 seconds)
02:30:20 <monochrom> In the Java standard library there is a method "bool supportsMetadataOperationsAndDataOperations()" I very much doubt anyone actually read it.
02:30:33 <hammond> like ThisIsAVeryReadibleFunctionNameThatAddsOneIntegerToAnotherIntegerAndReturnsATotalInIntegerFormat.
02:30:53 <monochrom> I do not condone "this source says this so I follow".
02:31:02 <hammond> lol ok
02:31:28 <monochrom> If someone says "you should use long names", what is their reason? Does that reason apply to your situation?
02:31:33 <EvanR> (supportsMeta + 1)(DataOperations)
02:31:35 <monochrom> If someone says "you should use short names", what is their reason? Does that reason apply to your situation?
02:31:50 <monochrom> IOW stop worshipping idols and opinion leaders.
02:31:53 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
02:32:04 ddellacosta joins (~ddellacos@ool-44c738de.dyn.optonline.net)
02:32:37 × falafel quits (~falafel@216.68.6.51.dyn.plus.net) (Ping timeout: 246 seconds)
02:33:19 <hammond> well what if ur going to have to deal with these people at work someday you know. I'm obvs exxagerating. The thing is I noticed in Haskell they simply use very short var names, and I like that.
02:33:35 <monochrom> Here in #haskell most people will tell you why under certain contexts they should short names, and what those contexts are.
02:33:35 <hammond> verycontradictory.
02:33:57 <monochrom> No one here will say "always do X". We know it's wrong.
02:34:05 <shapr> short variable names are great when the "wiring pattern" is the important part
02:34:08 <monochrom> No one here even say "always use Haskell" for that matter.
02:34:26 <shapr> long variable names are better when you're writing "business logic" and it matters how you use the value.
02:34:50 <EvanR> swap (x,y) = (y,x)
02:35:03 <shapr> Yeah, that's a good example
02:36:28 <monochrom> Outside #haskell, the world is full of morons. Therefore they need a simple mechanical code to adhere to, blindly.
02:36:44 <shapr> I need that too when I'm learning something entirely new.
02:37:33 <shapr> I start out parroting exactly what the tutorial or introduction says to see if that works.
02:37:41 <monochrom> It also explains why those bird brains cannot understand more truthful than "big-O is for worst case, big-Omega is for best case, big-Theta is for average case".
02:37:47 × td_ quits (~td@i5387092A.versanet.de) (Ping timeout: 246 seconds)
02:38:40 <monochrom> Unpopular opinion: "everyone needs to start somewhere" gets old quickly. It's where you end that matters.
02:38:55 <hammond> monochrom but they are trying to improve readability.
02:39:15 <hammond> "Code should read like a prose. Like a Novel."
02:39:26 <monochrom> COBOL reads like a novel.
02:39:35 td_ joins (~td@i53870918.versanet.de)
02:40:30 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 245 seconds)
02:40:33 hsw joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
02:40:38 <monochrom> There is a reason why "sqrt(x + y^2) - sin (2^x - ln y)" is superior to the prose version.
02:41:18 <monochrom> or the three-address-instruction version.
02:41:53 <hammond> I understand what you are saying monochrom . I do like haskells math like syntax.
02:42:07 <EvanR> x y ^2 + sqrt 2 x ^ y ln - sin -
02:42:34 <hammond> but I'm trying to find if there is an industry standard when it comes to this. like a big blanket for all languages.
02:42:42 <monochrom> I don't even need Haskell. My anti-prose stance needs merely Fortran.
02:43:35 <shapr> hammond: I'd go with "wiring patterns are best with transparent variable names" and "business logic is best with descriptive variable names"
02:46:29 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
02:46:29 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
02:46:29 finn_elija is now known as FinnElija
02:46:35 × chromoblob quits (~user@37.113.172.116) (Ping timeout: 244 seconds)
02:47:24 <shapr> if this ever becomes production hardware, it'll be perfect for graph reduction https://www.servethehome.com/intel-shows-8-core-528-thread-processor-with-silicon-photonics/ aka evaluating Haskell programs.
02:47:27 <hammond> shapr wiring patterns means what?
02:47:41 <hammond> I was making my way thru a burrito.
02:48:13 <shapr> hammond: EvanR said that "swap (x,y) = (y,x)" is a good example of a wiring pattern, and I agree.
02:48:34 <shapr> longer names for x and y would cover up the wiring pattern.
02:48:45 <EvanR> if someone says what the heck x is... tell them it's a variable
02:49:04 <EvanR> which might raise some ontological questions
02:49:56 <hammond> lol fair enough.
02:50:21 <shapr> hammond: håller du med?
02:53:05 <hammond> yeah.
02:53:30 <hammond> sure. I'm working my way thru the Refactoring book.
02:53:36 <shapr> Oh, Martin Fowler's book?
02:53:41 <hammond> yes.
02:53:51 <shapr> I might have that handy ...
02:54:36 <hammond> I like the part about making functions smaller and more concise. But it's jst the naming of things.
02:55:18 <EvanR> long naming suggestions also come from languages where you have to name more things because less composition
02:55:54 <EvanR> and naming things becomes such a chore, it starts to creep into the philosophy
02:56:01 <hammond> EvanR: are you saying you can't compose very well in OOP languages?
02:56:46 <EvanR> you're actively encouraged to do less stuff on a line and use temporaries
02:56:57 <EvanR> one action at a time
02:57:06 <hammond> heh.
02:57:35 <EvanR> the math expression is a good example of the benefits of not doing that
02:58:03 <monochrom> Merely 40 years ago "best practice" had "write more comments" leading to everyone, mostly students, writing "int i; /* this is an int variable */".
02:58:22 × thegeekinside quits (~thegeekin@189.180.81.59) (Remote host closed the connection)
02:58:26 <hammond> yeah
02:58:36 <monochrom> It took about 30 years for the industry to finalize realize how silly it is.
02:58:44 <hammond> I mean now I jst saw somewhere don't write a lot of comments.
02:59:03 <monochrom> It may take another 30 years before the industry mature beyond "make long names".
02:59:26 <hammond> this is the stuff I never understand. which is it.
02:59:50 sm joins (~sm@plaintextaccounting/sm)
03:00:03 × sm quits (~sm@plaintextaccounting/sm) (Client Quit)
03:02:31 notzmv joins (~zmv@user/notzmv)
03:06:57 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
03:09:50 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Ping timeout: 244 seconds)
03:13:06 kimiamania600 is now known as kimiamania
03:19:05 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 246 seconds)
03:19:56 Angelz joins (Angelz@Angelz.oddprotocol.org)
03:20:43 libertyprime joins (~libertypr@203.96.203.44)
03:27:07 aforemny joins (~aforemny@2001:9e8:6cd7:9700:69c9:4833:ea9a:b62d)
03:28:22 × aforemny_ quits (~aforemny@i59F516D5.versanet.de) (Ping timeout: 255 seconds)
03:39:54 razetime joins (~quassel@49.207.213.87)
03:41:47 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
03:42:26 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
03:43:19 Jackneill_ joins (~Jackneill@20014C4E1E04F90056592DA5D2139949.dsl.pool.telekom.hu)
03:45:47 × Jackneill quits (~Jackneill@20014C4E1E1BB8003C546C11A7F363BB.dsl.pool.telekom.hu) (Ping timeout: 245 seconds)
03:46:30 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
03:55:22 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
03:56:17 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
04:01:20 lisbeths joins (uid135845@id-135845.lymington.irccloud.com)
04:02:49 × bilegeek quits (~bilegeek@2600:1008:b004:e71b:f993:4604:698f:bf53) (Quit: Leaving)
04:06:43 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
04:10:05 takuan joins (~takuan@178-116-218-225.access.telenet.be)
04:10:14 × hyvoid quits (~hyenavoid@222-0-178-69.static.gci.net) (Remote host closed the connection)
04:10:18 <shapr> hammond: try all the way and see which one is best for reading comprehension six months from now?
04:10:45 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
04:11:56 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
04:15:10 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 255 seconds)
04:15:51 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 245 seconds)
04:17:51 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
04:30:46 × aaronv quits (~aaronv@user/aaronv) (Ping timeout: 245 seconds)
04:40:30 aaronv joins (~aaronv@user/aaronv)
04:40:37 <haskellbridge> <j​ade> monochrom: is there an inherent problem with long names?
04:43:41 <Axman6> I feel like there's an information theoretic argument to be made for the lenght of names, the more specific something is, the longer its name is allowed to be to describe that specificity, and the more general, the shorter. so foldr f z xs is totally fine, loadTriggersIntoMissles unloadedProximityTriggers delayTime postFuellingMissles is also fine
04:45:02 <Axman6> (No idea why the first specific example was missiles)
04:47:12 <haskellbridge> <j​ade> that's how I feel about it exactly
04:47:33 <haskellbridge> <j​ade> besides that, I think a lot of haskell names *could* be more descriptive
04:47:58 <haskellbridge> <j​ade> doesn't mean they have to be
04:49:04 <monochrom> As usual, there is no inherent problems with long names, short names, strongly encrypting your messages, weakly encrypting your messages, not encrypting your messages, ...
04:49:37 <monochrom> Human is the inherent problem of abusing those things.
04:50:16 <monochrom> I could add knives and guns, but that would morbidly be like bringing up missiles...
04:50:26 <jackdk> Axman6: we're in #haskell and there are only two haskell programs: computing fibonacci numbers with an exponential algorithm and firing the missiles
04:50:52 <monochrom> I thought we also sort and enumerate primes. :)
04:53:12 <haskellbridge> <j​ade> jackdk: I hate that that is always the introduction to haskell...
04:53:37 <EvanR> what about fork, read, write, exec unix API names. There's a lot to unpack there but they used 4 letter words for all the power
04:53:49 <EvanR> that's how to do it
04:53:53 <monochrom> Do you also hate using fibonacci to teach loops?
04:54:38 <jackdk> I've never had "firing the missiles" in an introduction to Haskell. It's talked about but never done
04:54:45 <monochrom> https://docs.python.org/3.5/tutorial/controlflow.html#defining-functions
04:54:57 <monochrom> @quote monochrom fibonacci
04:54:57 <lambdabot> monochrom says: the fibonacci sequence is everywhere in nature, for example haskell tutorials and python tutorials
04:55:05 <haskellbridge> <j​ade> oh, I've seen it
04:57:53 <probie> Has anyone used Haskell to fire missiles?
04:58:15 <Axman6> Who's responsible for haskellbridge btw?
05:01:19 acidjnk joins (~acidjnk@p200300d6e7072f02ccbbb6636abe1529.dip0.t-ipconnect.de)
05:02:52 <jackdk> > matterbridge operated by geekosaur
05:02:53 <lambdabot> error:
05:02:54 <lambdabot> Variable not in scope: matterbridge :: t0 -> t1 -> t2 -> terror:
05:02:54 <lambdabot> • Variable not in scope: operated
05:03:00 <jackdk> @botsnack sorry!
05:03:00 <lambdabot> :)
05:07:34 <Axman6> geekosaur: is there a reason haskellbridge adds a space after the first character of user's nicks? I get lines like "haskellbridge: <j​ade>oh, I've seen it" (acutally I suspect unicode sahenanigans, ssince posting that looks different form what I copied [Iand I have a feeling this will have typos I can't see until sending...]))
05:09:35 <Axman6> shapr: I'm not sure I see how that intel CPU is particularly well suited for Haskell? the STH link is very hardware focused I guess
05:12:01 sm joins (~sm@plaintextaccounting/sm)
05:13:49 <geekosaur[c]> It adds a zeroid space so that it doesn't pink people on both sides of the bridge
05:15:01 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 255 seconds)
05:15:57 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
05:17:57 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
05:18:58 <glguy> If anyone's using glirc, it has native support for rewriting matterbridge to look native
05:19:45 <glguy> add this to your server settings: message-hooks: [["matterbridge", "haskellbridge"]]
05:20:14 <glguy> (and I'm sure other clients have something similar)
05:20:44 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 248 seconds)
05:28:33 bgs joins (~bgs@212-85-160-171.dynamic.telemach.net)
05:32:04 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
05:33:47 × monochrom quits (trebla@216.138.220.146) (Quit: NO CARRIER)
05:34:15 <Axman6> glguy: <3
05:35:46 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
05:37:16 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 248 seconds)
05:41:01 <Axman6> glguy: is a restart or glirc needed to make it work?
05:42:01 × son0p quits (~ff@152.203.98.110) (Ping timeout: 255 seconds)
05:42:24 <Axman6> of*
05:42:35 × grnman_ quits (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net) (Ping timeout: 246 seconds)
05:43:05 son0p joins (~ff@152.203.98.110)
05:44:36 monochrom joins (trebla@216.138.220.146)
05:46:14 × [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
05:46:32 [Leary] joins (~Leary]@user/Leary/x-0910699)
05:46:55 <glguy> Hmm, I think it picks up hooks when you start that connection
05:47:10 <Axman6> I'll try reconnecting
05:47:13 × Axman6 quits (~Axman6@user/axman6) (Remote host closed the connection)
05:47:28 Axman6 joins (~Axman6@user/axman6)
05:50:04 michalz joins (~michalz@185.246.207.203)
05:50:54 lzszt joins (~lzszt@ip-037-024-119-190.um08.pools.vodafone-ip.de)
05:52:30 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
05:53:01 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
05:54:29 × aaronv quits (~aaronv@user/aaronv) (Ping timeout: 246 seconds)
05:55:05 × lzszt quits (~lzszt@ip-037-024-119-190.um08.pools.vodafone-ip.de) (Client Quit)
05:57:01 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 260 seconds)
05:57:15 mima joins (~mmh@net-93-67-213-89.cust.vodafonedsl.it)
05:57:56 × td_ quits (~td@i53870918.versanet.de) (Quit: waking up from the american dream ...)
06:00:53 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
06:06:19 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 255 seconds)
06:06:34 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
06:07:01 MQ-17J joins (~MQ-17J@104.28.248.165)
06:07:09 × bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
06:07:59 MajorBiscuit joins (~MajorBisc@62-137-46.netrun.cytanet.com.cy)
06:10:07 × echoreply quits (~echoreply@2001:19f0:9002:1f3b:5400:ff:fe6f:8b8d) (Quit: WeeChat 2.8)
06:10:14 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
06:10:25 × MajorBiscuit quits (~MajorBisc@62-137-46.netrun.cytanet.com.cy) (Client Quit)
06:10:59 × lisbeths quits (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
06:11:01 echoreply joins (~echoreply@45.32.163.16)
06:13:45 gmg joins (~user@user/gehmehgeh)
06:14:05 × danza__ quits (~francesco@151.57.243.19) (Read error: Connection reset by peer)
06:14:25 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 255 seconds)
06:14:35 danza__ joins (~francesco@151.19.250.182)
06:14:53 × MQ-17J quits (~MQ-17J@104.28.248.165) (Quit: Quit)
06:18:35 phma joins (~phma@2001:5b0:211b:8ab8:276e:326e:f44c:81b4)
06:20:09 × Maeda quits (~Maeda@91-161-10-149.subs.proxad.net) (Quit: done!)
06:22:46 chele joins (~chele@user/chele)
06:22:59 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
06:26:04 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
06:27:01 × Square quits (~Square4@user/square) (Ping timeout: 255 seconds)
06:27:24 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 248 seconds)
06:27:52 <phma> If I just say "stack run", what optimization does ghc do?
06:30:41 <haskellbridge> <s​m> the default I'd guess, adding -v may show the ghc command
06:31:24 <sm> davros1:
06:31:33 <sm> > <d​avros1> People get more done in Rust than Haskell. Agree/disagree ? (I'm asking in 3 places for balance)
06:31:33 <sm> It's
06:31:35 <lambdabot> <hint>:1:1: error: parse error on input ‘<’
06:31:43 <sm> darnit irc.
06:33:06 lortabac joins (~lortabac@2a01:e0a:541:b8f0:3f4f:3d1f:233a:c3d3)
06:34:58 <sm> davros1: it's a reasonable question to think about. It needs a bit of clarifying, as it can be interpreted in a few ways. Eg "has the rust community got more done than the haskell community".. "does an average rust user get more done than an average haskell user as of today".. define "get more done".. etc.
06:35:33 <phma> sm: I don't know, but I'm writing the program in both Rust and Haskell and checking that the outputs match.
06:36:59 <sm> nice
06:36:59 <phma> Using stack, how can I compile the program and see the compiled code? I'm not sure whether I should look at Core, STG, or what.
06:39:13 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
06:39:19 <sm> phma: are you trying to check how your code was optimised ?
06:39:39 <probie> Personally, I add {-# OPTIONS_GHC -ddump-simpl #-} to the source files I want to see the core of, since it's pretty much never the case that I want it for an entire project
06:41:36 <phma> sm: yes. I have four operations that transform an unboxed array of bytes into another unboxed array of bytes, and one is taking a lot longer than the others (and than the Rust version), and I want to see why.
06:42:56 <probie> You may also want -ddump-rule-firings if you're doing something "fancy" like writing your own fusion framework
06:42:59 <phma> probie: before or after "module", before or after the imports?
06:43:13 <phma> what's a fusion framework?
06:43:58 aaronv joins (~aaronv@user/aaronv)
06:43:58 fweht joins (uid404746@id-404746.lymington.irccloud.com)
06:44:29 <probie> Before module. Where you'd put `{-# LANGUAGE ... #-}`
06:45:54 <phma> where do I find the output of --dump-simpl?
06:46:21 <probie> It'll be written to stdout
06:48:56 aeroplane joins (~user@user/aeroplane)
06:49:09 <phma> found it and pasted into a text editor
06:51:49 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
06:52:55 td_ joins (~td@i5387090D.versanet.de)
06:53:34 <phma> can't make sense of it though
06:54:26 <probie> sad
06:56:44 <davros1> Sm for context I was venting after a haskeller was trash talking rust. I'm not hostile to haskell, infact initially tinkering with haskell is exactly what made me want rust ("closer to haskell but still suitable for game engines")
06:56:58 <davros1> Anyway I dont want to derail the room etc
06:57:10 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
06:57:52 <haskellbridge> <s​m> you're not.. it's topical right now with recent blogosphere discussion
06:58:09 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
06:58:33 <haskellbridge> <s​m> what's getting more done to you ? delivering useful end-user apps ? delivering useful programming tools ? advancing the state of the art ?
06:58:52 paul_j joins (~user@67.26.169.217.in-addr.arpa)
06:59:20 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
07:02:33 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21) (Remote host closed the connection)
07:02:45 <phma> probie: https://gist.github.com/phma/04d8a493eb1d96e68739e4d989e51042
07:03:51 chromoblob joins (~user@37.113.172.116)
07:03:52 <phma> and here's the source: https://github.com/phma/wring-twistree/blob/master/src/Cryptography/WringTwistree/RotBitcount.hs
07:08:32 × chromoblob quits (~user@37.113.172.116) (Ping timeout: 244 seconds)
07:09:15 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
07:11:00 × aaronv quits (~aaronv@user/aaronv) (Ping timeout: 246 seconds)
07:19:31 fendor joins (~fendor@2a02:8388:1640:be00:29b8:807b:7fa6:1bcf)
07:25:05 × oo_miguel quits (~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Quit: oo_miguel)
07:25:48 <davros1> haskellbridge, right even if people dont use haskell.. it proved some ideas that have made their way out into other languages
07:31:22 × danza__ quits (~francesco@151.19.250.182) (Ping timeout: 255 seconds)
07:32:30 danse-nr3 joins (~francesco@151.19.250.182)
07:34:06 × aeroplane quits (~user@user/aeroplane) (Ping timeout: 246 seconds)
07:34:13 CiaoSen joins (~Jura@2a05:5800:2a1:b500:664b:f0ff:fe37:9ef)
07:38:49 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21)
07:47:59 <danse-nr3> :t Map
07:48:00 <lambdabot> error:
07:48:00 <lambdabot> • Data constructor not in scope: Map
07:48:00 <lambdabot> • Perhaps you meant one of these:
07:48:12 <danse-nr3> % import Data.Map
07:48:12 <yahb2> <no output>
07:48:16 <danse-nr3> :t Map
07:48:17 <lambdabot> error:
07:48:17 <lambdabot> • Data constructor not in scope: Map
07:48:17 <lambdabot> • Perhaps you meant one of these:
07:48:25 <danse-nr3> % :t Map
07:48:25 <yahb2> <interactive>:1:1: error: ; • Illegal term-level use of the type constructor ‘Map’ ; imported from ‘Data.Map’ ; (and originally defined in ‘Data.Map.Internal’) ; • In the ex...
07:48:34 <danse-nr3> %:t Map
07:49:10 <danse-nr3> % :k Map
07:49:10 <yahb2> Map :: * -> * -> *
07:50:51 <danse-nr3> yesterday i stumbled upon a problem that seemed harder than expected, but hopefully there is a trivial solution i had not thought about
07:51:22 <danse-nr3> % data P = P { i :: Map Int String, c :: Map Char String }
07:51:22 <yahb2> <no output>
07:51:22 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
07:52:02 gmg joins (~user@user/gehmehgeh)
07:52:08 <danse-nr3> if i have got `Either Int Char`, how to write a function that abstract over the Either and P in order to have an index and corresponding map to be passed to other functions?
07:52:49 <danse-nr3> i am afraid i cannot solve it without a class
07:54:13 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
07:55:47 robosexual joins (~spaceoyst@5.165.11.54)
07:55:58 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
07:56:21 <danse-nr3> (a -> Map a String -> c) -> Either Int Char -> c
07:56:38 <danse-nr3> would not work, for instance, because `a` cannot be both Int and Char i think
07:56:59 × razetime quits (~quassel@49.207.213.87) (Ping timeout: 246 seconds)
07:58:05 <ncf> i'm confused
07:58:18 mc47 joins (~mc47@xmonad/TheMC47)
07:58:55 <danse-nr3> yeah the latter signature is a bit confusing
07:59:10 <ncf> \ e -> case e of Left ii -> i Map.! ii; Right ic -> c Map.! ic
07:59:43 <danse-nr3> i am not familiar with this syntax ... .!
07:59:43 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
08:00:09 <ncf> i ! ii except you usually import Data.Map qualified as Map
08:00:28 gmg joins (~user@user/gehmehgeh)
08:00:46 <danse-nr3> yeah, so, let us say sometimes we want to use lookup, other times insert, basically all Map functions, we want to abstract over them
08:01:10 <ncf> sounds like you should have a Map (Either Int Char) String then?
08:01:21 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
08:01:28 <danse-nr3> yes, cannot do that in this context
08:01:35 <sm> davros1: I'm not trying to push back on your question, but to think about the answer(s). I don't know rust well enough, but my guesses would be: for advancing the state of the art: haskell, more so; as a vehicle for further research: haskell; for learning FP (haskell); programming tools (not sure); end user apps (still not sure; rust has matrix, haskell has cardano); use in industry (presumably rust ?); learning
08:02:26 <sm> as a first programming language: haskell
08:02:29 × apteryx quits (~maxim@dsl-10-132-204.b2b2c.ca) (Ping timeout: 246 seconds)
08:02:37 MajorBiscuit joins (~MajorBisc@c-001-010-057.client.tudelft.eduvpn.nl)
08:02:43 <ncf> danse-nr3: why not?
08:02:57 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
08:03:20 <sm> as a productive personal computing language/ecosystem: not sure, depends what you've learned
08:03:29 <danse-nr3> let us say we cannot change P, or anyways that the problem is interesting in theory besides this instance
08:03:31 <ncf> Map.fromList $ [(Left k, v) | (k, v) <- Map.assocs i] <> [(Right k, v) | (k, v) <- Map.assocs c]
08:03:33 <davros1> Yeah really it depends on domain
08:03:43 <danse-nr3> in an wrongly typed mind we would like to return `Either Int Char -> P -> (a, Map a String)`, but that does not compile
08:04:42 <ncf> that could work with existentials
08:04:55 <danse-nr3> interesting!
08:05:59 fserucas_ joins (~fserucas@46.50.115.39)
08:06:57 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
08:07:11 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
08:08:14 <ncf> like data Ex = forall k. Ex k (Map k String) or whatever. but i really don't see what this brings you
08:09:16 × remexre quits (~remexre@user/remexre) (Ping timeout: 248 seconds)
08:11:16 <danse-nr3> it does not happen often to me that the type system gets on the way of a very simple solution, so it is an opportunity to deepen
08:12:07 <[Leary]> I could perhaps see some use in something like `Functor f => Either Int Char -> P -> (forall k. k -> Map k String -> f (Map k String)) -> f P`.
08:12:36 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 244 seconds)
08:12:49 <danse-nr3> yeah that would be one of the use cases
08:13:12 <danse-nr3> but i tried to shrink to the simplest case
08:13:59 <lortabac> danse-nr3: I don't understand what you are trying to achieve
08:14:33 <danse-nr3> data P = P { i :: Map Int String, c :: Map Char String } and Either Int Char, abstract to be able to apply Map functions with Either as a key
08:14:37 <lortabac> lookupIC :: Ord a => Either Int Char -> P -> Maybe String
08:14:49 <lortabac> can't you just define something like that? ↑
08:15:07 <danse-nr3> yes, and one for each Map function. Is there a way to abstract?
08:15:42 <danse-nr3> i think there is with a class, but seems overkill
08:15:55 apteryx joins (~maxim@dsl-10-128-23.b2b2c.ca)
08:16:22 <lortabac> danse-nr3: ok I see, let me think
08:16:29 <ncf> i honestly don't think there is a better abstraction here than making an Iso P (Maybe (Either Int Char) String) as i described
08:17:11 <danse-nr3> if this was untyped, the solution would be trivial
08:17:38 <danse-nr3> but we cannot have `(a, Map a String)` as a result
08:18:15 <tomsmeding> in order to abstract here, you need to have information about P in whatever framework of generic programming that you're going to use
08:18:24 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
08:18:28 <danse-nr3> just plain haskell
08:18:39 <tomsmeding> as-is, the fact that P has two fields doesn't help
08:18:54 <tomsmeding> if P had a Generic instance, for example, one could write some GHC Generics code to generate lookupIC for you
08:19:07 <tomsmeding> one could also use TemplateHaskell to generate the function for you
08:19:48 <tomsmeding> I'm not familiar with optics/lens, or uniplate or what have you, but I'd expect there to be some generation utilities there as well -- as long as P implements a particular class provided by those frameworks
08:19:57 <tomsmeding> (which can probably be automatically derived using more utilities from the frameworks)
08:20:17 × tv quits (~tv@user/tv) (Read error: Connection reset by peer)
08:20:20 <danse-nr3> too complicated for such a trivial problem, i am just trying to understand the limitations of the type system really. We cannot return an `a`, usually in similar cases i try to pass functions that consume the `a` and return an homogeneous case
08:20:41 <danse-nr3> (a -> Map a String -> c) -> Either Int Char -> P -> c
08:20:54 <danse-nr3> would not work though because `a` cannot be of two different types
08:21:06 <[Leary]> danse-nr3: This is exactly what my suggestion addressed.
08:21:14 <[Leary]> Note the forall.
08:21:16 <tomsmeding> that would need to be (forall a. a -> Map a String -> c) -> Either Int Char -> P -> c
08:21:29 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
08:21:40 <danse-nr3> wow, that simple? Awesome, let me try
08:21:59 <tomsmeding> without the forall, we choose the 'a'; with the forall, the '(forall ...) -> E -> P -> c' function can choose the 'a'
08:22:20 <tomsmeding> because you declare that the (a -> Map a String -> c) function doesn't only work with a particular 'a' that the caller chose, but with _all_ 'a'
08:22:21 <ncf> exists a. (a, Map a String) ~ forall c. (exists a. (a, Map a String) -> c) -> c ~ forall c. (forall a. a -> Map a String -> c) -> c
08:22:40 <tomsmeding> but you didn't do anything, because that a -> Map a String -> c is just Map.lookup
08:22:51 <danse-nr3> it can also be insert
08:23:01 <tomsmeding> oh that's true
08:23:11 <tomsmeding> but the information about P is still contained in your hand-coded implementation of this function
08:23:28 <danse-nr3> yeah that is fine
08:23:39 <ncf> (shouldn't that be String -> Map a String -> c, if you want to be able to look up values?)
08:23:58 <tomsmeding> (don't you need a key to be able to do a lookup)
08:24:19 <ncf> well you pass the key as an Either IIUC
08:24:31 <ncf> a key, and a continuation that takes a value and the surrounding map
08:24:33 <tomsmeding> ncf: which will then be passed on to the forall-qualified callback
08:24:49 <danse-nr3> a -> Map a String, `a` is a key that gets filled from the Either
08:24:59 <[Leary]> Note that it actually can't be `insert`, because then `a` would escape the scope.
08:25:02 <ncf> but that's silly, you already have the key if you passed it to the function
08:25:24 <tomsmeding> if the whole thing is f, then valid uses might be 1. f Map.lookup someKey someP, or 2. f (flip Map.insert value) someKey someP
08:25:30 <danse-nr3> [Leary], the value can be filled before passing to the abstracting function
08:25:54 <tomsmeding> I mean, I agree that this is a lot of work for little benefit, but it _is_ consistent :p
08:26:16 <ncf> ah, i see
08:26:27 <ncf> well insert won't work for the reason [Leary] says
08:26:35 <[Leary]> No, my point is that if you use `forall c. ... (forall a. a -> Map a String -> c)`, then you're not allowed to instantiate `c` as anything with `a` in it, like `Map a String`.
08:26:46 <tomsmeding> [Leary]: but 'a' is the key?
08:26:56 <tomsmeding> oh
08:26:58 <tomsmeding> sneaky
08:27:04 <danse-nr3> really? Why would `c` not possibly contain `a`, that is odd
08:27:08 <[Leary]> The signature I wrote above will let you do insert, however.
08:27:18 <danse-nr3> oh
08:27:20 <tomsmeding> danse-nr3: because f is now choosing 'a', and the caller has no access to it
08:27:35 × jespada quits (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Ping timeout: 244 seconds)
08:27:49 <tomsmeding> [Leary]: with the lens-style-ish Functor?
08:28:03 <[Leary]> Yeah.
08:28:11 <danse-nr3> is the `forall c` necessary?
08:28:28 <danse-nr3> after resolving the Either, the rest is homogeneous
08:28:51 <tomsmeding> after resolving the Either _and_ matching it to a field of the P
08:29:16 <tomsmeding> the only abstraction contained in f at this point is "do some unknown operation on a Map"
08:29:32 <tomsmeding> uh, awkward phrasing -- the only abstraction we're using here
08:29:34 <danse-nr3> "on the right Map for the valid value"
08:29:42 <tomsmeding> f is providing the information about P, in a sense
08:29:58 <tomsmeding> but sure
08:30:36 × rachelambda quits (~rachelamb@78-67-128-99-no247.tbcn.telia.com) (Ping timeout: 248 seconds)
08:30:40 tomsmeding would just write lookupP :: Either Int Char -> P -> String and insertP :: EitherIntChar -> String -> P -> P and call it a day
08:30:48 jespada joins (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net)
08:31:13 <danse-nr3> yes, i think the core of the problem was relaxing `a` with `forall`, i will work on that path, thanks everyone!
08:31:42 briandaed joins (~briandaed@185.234.210.211.r.toneticgroup.pl)
08:32:00 razetime joins (~quassel@49.207.213.87)
08:32:08 <danse-nr3> also curious to check about `exists`, could be a key for a different approach
08:32:52 <lortabac> I don't think you would gain much with existentials
08:33:08 <lortabac> because you would have to pattern-match on the result anyway
08:33:13 <tomsmeding> they're a bit awkward in haskell, so they really need to carry their weight to be useful
08:36:12 tv joins (~tv@user/tv)
08:36:33 <danse-nr3> yes, that was the solution, thanks [Leary] for pointing to it. I kept it simple without the functor. `forall a` was all i needed, no `forall c` and no problems with that
08:36:58 <[Leary]> The forall c. is still there, it's just implicit.
08:37:17 <[Leary]> And the functor needs to be there if you want to extract information from the Map.
08:37:19 <lortabac> how can you define 'insert' without the functor?
08:38:25 <lortabac> probably the simplest solution is to distinguish lookup-like functions and insert-like functions (which return a map)
08:39:21 <danse-nr3> f :: (forall a . a -> (P -> Map a String) -> c) -> Either Int Char -> c
08:39:24 <danse-nr3> f g (Left v) = f v i
08:39:27 <danse-nr3> f g (Right v) = f v c
08:39:31 <danse-nr3> compiles and works
08:40:01 <danse-nr3> sorry, the `g` is also on the right side
08:40:26 <danse-nr3> had to simplify from my specific example on the fly
08:41:22 <[Leary]> That will let you lookup, but not insert.
08:45:04 <danse-nr3> it might take a while for me to verify and report back ...
08:48:31 <danse-nr3> yes it works with insert as well, i just have to include the value before passing the function
08:51:57 <danse-nr3> not the best abstraction, but what matters is understanding how the usage of `forall` enables us to solve a problem
09:01:06 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
09:02:37 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Remote host closed the connection)
09:02:56 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
09:03:35 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
09:03:44 × renegade quits (~renegade@bcdcac82.skybroadband.com) (Ping timeout: 246 seconds)
09:03:50 rachelambda joins (~rachelamb@78-67-128-99-no247.tbcn.telia.com)
09:04:09 × eL_Bart0 quits (eL_Bart0@dietunichtguten.org) (Remote host closed the connection)
09:04:51 chromoblob joins (~user@37.113.172.116)
09:07:44 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
09:09:39 renegade joins (~renegade@bcdcac82.skybroadband.com)
09:10:21 × chromoblob quits (~user@37.113.172.116) (Ping timeout: 245 seconds)
09:11:08 eL_Bart0 joins (eL_Bart0@dietunichtguten.org)
09:13:04 remexre joins (~remexre@user/remexre)
09:16:14 cfricke joins (~cfricke@user/cfricke)
09:17:11 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
09:17:17 × Feuermagier quits (~Feuermagi@user/feuermagier) (Quit: Leaving)
09:22:31 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 245 seconds)
09:25:01 × qqq quits (~qqq@92.43.167.61) (Remote host closed the connection)
09:27:11 × danse-nr3 quits (~francesco@151.19.250.182) (Remote host closed the connection)
09:27:33 danse-nr3 joins (~francesco@151.19.250.182)
09:27:44 <danse-nr3> [Leary], if you meant that i cannot modify P.i or P.c in place, you are right. Was using selectors here for simplicity, but had lenses in the original code
09:30:55 chromoblob joins (~user@37.113.172.116)
09:37:52 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 245 seconds)
09:41:23 <danse-nr3> so yeah you had guessed right with the functor providing a better abstraction
09:45:36 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.2)
09:46:54 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
09:47:52 <Inst> what's wrong with
09:48:10 <Inst> swap (aFirst, aSecond) = (aSecond, aFirst)
09:48:52 <ncf> you tell us
09:51:19 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
09:51:41 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 248 seconds)
09:54:06 × razetime quits (~quassel@49.207.213.87) (Ping timeout: 246 seconds)
09:54:57 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
09:58:35 × ft quits (~ft@p508db658.dip0.t-ipconnect.de) (Quit: leaving)
09:59:34 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
10:01:17 × CiaoSen quits (~Jura@2a05:5800:2a1:b500:664b:f0ff:fe37:9ef) (Ping timeout: 246 seconds)
10:01:21 <chromoblob> <s>when good GC is here, tho, what's wrong with "always use Haskell" lul</s>
10:01:55 <chromoblob> well, that and granular inclusion of the runtime and std libs by only needed code
10:03:42 × ubert quits (~Thunderbi@77.119.173.8.wireless.dyn.drei.com) (Ping timeout: 245 seconds)
10:03:42 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 246 seconds)
10:05:30 ubert joins (~Thunderbi@77.119.173.8.wireless.dyn.drei.com)
10:05:35 azimut joins (~azimut@gateway/tor-sasl/azimut)
10:06:10 × cfricke quits (~cfricke@user/cfricke) (Ping timeout: 255 seconds)
10:07:31 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 255 seconds)
10:09:16 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Ping timeout: 248 seconds)
10:09:53 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
10:14:34 danse-nr3_ joins (~francesco@151.37.129.27)
10:14:37 × danse-nr3 quits (~francesco@151.19.250.182) (Read error: Connection reset by peer)
10:19:35 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Ping timeout: 246 seconds)
10:25:03 anselmschueler joins (~anselmsch@user/schuelermine)
10:27:26 sm joins (~sm@plaintextaccounting/sm)
10:33:45 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
10:44:40 × pieguy128 quits (~pieguy128@65.93.194.136) (Ping timeout: 245 seconds)
10:45:35 __monty__ joins (~toonn@user/toonn)
10:49:39 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
10:49:52 lottaquestions_ joins (~nick@modemcable010.180-202-24.mc.videotron.ca)
10:51:44 × lottaquestions quits (~nick@modemcable010.180-202-24.mc.videotron.ca) (Ping timeout: 244 seconds)
10:52:48 × lottaquestions_ quits (~nick@modemcable010.180-202-24.mc.videotron.ca) (Read error: Connection reset by peer)
10:53:13 lottaquestions_ joins (~nick@2607:fa49:503d:b200:d5e6:66af:52b4:3a41)
10:53:17 × anselmschueler quits (~anselmsch@user/schuelermine) (Ping timeout: 245 seconds)
10:54:05 pieguy128 joins (~pieguy128@bras-base-mtrlpq5031w-grc-46-67-70-100-114.dsl.bell.ca)
10:54:19 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
10:58:01 hiyori joins (~hiyori@user/hiyori)
10:58:03 <hiyori> https://bpa.st/BGQ2M
10:59:38 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
11:02:05 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
11:02:27 × libertyprime quits (~libertypr@203.96.203.44) (Quit: leaving)
11:02:51 sm joins (~sm@plaintextaccounting/sm)
11:08:21 × sm quits (~sm@plaintextaccounting/sm) (Remote host closed the connection)
11:08:41 blue_aeroplane joins (~user@user/aeroplane)
11:09:02 sm joins (~sm@plaintextaccounting/sm)
11:12:29 blue_aeroplane parts (~user@user/aeroplane) ()
11:13:34 xff0x joins (~xff0x@2405:6580:b080:900:9c90:a654:eded:3f9a)
11:14:34 × danse-nr3_ quits (~francesco@151.37.129.27) (Ping timeout: 255 seconds)
11:14:47 × vglfr quits (~vglfr@188.239.201.89) (Ping timeout: 246 seconds)
11:15:20 vglfr joins (~vglfr@2a0d:3344:148d:7a00:fdd5:1482:7428:6489)
11:15:47 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
11:18:44 ulysses4ever joins (~artem@c-73-103-90-145.hsd1.in.comcast.net)
11:18:44 × artem quits (~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
11:20:25 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
11:28:05 × vglfr quits (~vglfr@2a0d:3344:148d:7a00:fdd5:1482:7428:6489) (Ping timeout: 246 seconds)
11:28:14 vglfr joins (~vglfr@188.239.201.89)
11:30:21 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
11:33:07 <haskellbridge> <j​ade> im being fed copious amounts of OOP propaganda at work
11:33:28 × sm quits (~sm@plaintextaccounting/sm) (Ping timeout: 255 seconds)
11:34:07 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 245 seconds)
11:35:36 × haritz quits (~hrtz@user/haritz) (Remote host closed the connection)
11:36:13 sm joins (~sm@plaintextaccounting/sm)
11:36:43 cfricke joins (~cfricke@user/cfricke)
11:37:25 Simikando joins (~Simikando@adsl-dyn1.91-127-51.t-com.sk)
11:37:31 × tv quits (~tv@user/tv) (Ping timeout: 255 seconds)
11:38:30 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
11:46:21 danse-nr3_ joins (~francesco@151.37.129.27)
11:48:45 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
11:50:15 × xmachina quits (~xmachina@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 4.0.4)
11:52:07 × hiyori quits (~hiyori@user/hiyori) (Quit: Client closed)
11:52:07 tv joins (~tv@user/tv)
11:53:20 xmachina joins (~xmachina@modemcable048.127-56-74.mc.videotron.ca)
11:57:32 <danse-nr3_> strange, the compiler tells me to propagate the `Show` constraint to `f`, while that seems specific to `h` to me https://paste.tomsmeding.com/ebY6LQh7
12:00:16 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
12:01:51 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
12:01:54 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
12:02:26 <robosexual> f :: (forall a . (Show a) => a -> c) -> Either Int Char -> c
12:06:28 <lortabac> danse-nr3_: yes, but with rank-n types you can't pass a more specific function
12:09:01 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
12:10:11 <lortabac> so GHC suggests you to add the constraint to the first argument of 'h'
12:10:14 <danse-nr3_> interesting, thanks lortabac
12:10:30 <lortabac> sorry my explanation was awful
12:10:50 <lortabac> but I hope you got the point
12:10:58 <danse-nr3_> seems clear to me. With rank-n types one cannot pass a more specific function
12:11:43 <lortabac> for example if the signature says 'forall a. a -> a' you can't pass 'forall a. Show a => a -> a'
12:11:54 <lortabac> nor 'Int -> Int'
12:11:58 <danse-nr3_> what about Int -> Int?
12:12:04 <danse-nr3_> oh, not even
12:12:18 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
12:12:33 <danse-nr3_> i guess this is not a design decision but rather some other kind of limitation
12:13:15 <lortabac> no, it's a theoretical feature of polymorphism
12:13:31 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Remote host closed the connection)
12:15:47 × Simikando quits (~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Remote host closed the connection)
12:19:09 <ncf> f expects a first argument that works with any choice of a. if you give it a function that expects a to be Int, or have a Show instance, that can't work
12:20:49 <ncf> what you've written is basically Either Int Char -> exists a. a, which doesn't seem very useful: if you know nothing about a, you can't do anything with it
12:21:51 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
12:21:57 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
12:22:00 <Inst> i just checked Hoogle
12:22:31 <Inst> we don't have an unchunk function? unchunk :: [a] -> [[b]] -> [[a]]
12:23:23 <ncf> you could add constraints on a that specify what the continuation is allowed to do with it; you could take the intersection of all classes that Int and Char have in common, for example (forall a. (Show a, Enum a, Eq a, Ord a, ...) -> ...)
12:23:52 <ncf> or you know, just be explicit and use Either Int Char. there's no reason to mess with polymorphism here
12:24:24 <ncf> (and (Either Int Char -> c) -> Either Int Char -> c is of course just Either Int Char -> Either Int Char)
12:24:50 <robosexual> Inst: what is expected behaviour of unchunk function?
12:24:58 <drewjose> Inst not sure about your type definition but from the name it seems you want concat?
12:25:04 <Inst> unconcat, tbh
12:25:28 <Inst> Foldable t => t a -> t (t b) -> t (t a)
12:25:41 <ncf> what should it do? show examples
12:25:53 <Inst> ummm, back to trying to beat Jose Valim's problem
12:26:03 <danse-nr3_> i see, makes more sense now ncf, i guess it is a matter of getting acquainted with rank-n types. Coming from simpler polymorphism, more specific types satisfy more generic parameters, but here the semantic seems different. The Either example was just a way to explain the case
12:26:06 <danse-nr3_> thanks
12:26:11 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
12:26:13 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
12:26:20 <Inst> given [1..] and a [[a, b],[c,d]... etc], I want to get a list of [[1,2], [3,4]...]
12:27:55 <drewjose> what is the significance of a,b,c,d
12:28:36 <ncf> > [[a, b], [c, d]] & partsOf (traversed . traversed) .~ [1..]
12:28:40 <lambdabot> [[1,2],[3,4]]
12:28:49 <Inst> this problem
12:29:08 <Inst> ah, lens <3
12:29:20 <Inst> but there's no dedicated function for this, no?
12:29:25 <Inst> https://discourse.haskell.org/t/beautiful-functional-programming/7411/49
12:29:31 <ncf> why would there be? this seems extremely niche
12:29:51 <Inst> the strategy i'm going to use now, because apparently i failed to beat python again
12:30:07 <Inst> first, store the data structure as a keymap via aeson, or an equivalent, giving me an easy way to add stuff
12:30:37 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 258 seconds)
12:30:39 <Inst> second, zip the list provided to [1..], map the keymap insert in
12:31:12 <Inst> third, use groupby to split the list into the appropriate groupings for continuations
12:31:23 <Inst> not continuation, i mean, continuing the zip
12:31:54 <Inst> fourth, extract the lesson lists, zip them with [1..], unconcat, then zip the result with the objects
12:31:59 <Inst> then map some kind of insert again
12:33:41 × hsw quits (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Ping timeout: 258 seconds)
12:35:51 hyvoid joins (~hyenavoid@222-0-178-69.static.gci.net)
12:36:59 <Inst> thank you so much ncf!
12:47:41 hsw joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
12:50:38 haritz joins (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220)
12:50:38 × haritz quits (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220) (Changing host)
12:50:38 haritz joins (~hrtz@user/haritz)
12:51:25 <fendor> What does `@(*)` mean? Getting a type error ` m -> Ix.do
12:51:25 <fendor> (x, _q) <- runner (f p) m
12:51:26 <fendor> runner p (runIKleisliTupled k x)`
12:51:41 × ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 246 seconds)
12:51:41 <fendor> typo, sorry, I meant `PrEff @(*) eff (IVoid @{*} @{*} @{*}) () () (a, q)`
12:53:31 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Remote host closed the connection)
12:53:35 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
12:53:49 Inst joins (~liamzy@2601:6c4:4085:6d50::6d40)
12:58:24 famubu joins (~julinuser@61.0.251.1)
12:58:36 falafel joins (~falafel@216.68.6.51.dyn.plus.net)
12:58:49 <famubu> Hi is there a way to duplicate a list n times in haskell? Like `[1,3] * 2` giving [1,3,1,3]`?
13:01:18 <Axman6> > [[a,b],[c,d]] & (traverse . traverse) (const $ id <<+= 1) & flip runState 1
13:01:19 <lambdabot> ([[1,2],[3,4]],5)
13:01:35 <Axman6> > [1,3] >>= replicate 2
13:01:36 <lambdabot> [1,1,3,3]
13:01:45 <Axman6> uh, hmm
13:02:01 <Axman6> concat . replicate n will do it
13:02:11 <lortabac> > concat $ replicate 2 [1, 3]
13:02:12 <lambdabot> [1,3,1,3]
13:02:27 <lortabac> (>>=) is concatMap
13:02:38 <famubu> Thanks folks!
13:03:44 <lortabac> there is also 'cycle' which does infinite repetitions of the list
13:03:57 <lortabac> > take 4 $ cycle [1, 3]
13:03:58 <lambdabot> [1,3,1,3]
13:04:45 × haritz quits (~hrtz@user/haritz) (Quit: ZNC 1.8.2+deb2 - https://znc.in)
13:05:01 <Inst> btw, if there were a -XLetLambda extension, would you oppose it?
13:05:23 <lortabac> please no more syntactic extensions!!!
13:05:27 <Axman6> lambdas are already allowed, no need to let us use them. Fight the power!
13:05:38 <Inst> wherein: the foo\bar -> bar syntax evaluates to let foo bar = bar in foo
13:06:08 <lortabac> personally I oppose all extensions that introduce new syntax
13:06:08 <famubu> lortabac: +1
13:06:23 <Axman6> I couldn't agree less
13:07:01 <Inst> so are you a syntactical extension enthusiast, then, axman6? implying your level of agreement is zero or infinitely negative?
13:07:39 <Inst> :)
13:07:40 <Axman6> lambda case should've been there from the beginning, and adding it as an extension is totally fine; one day it should part of the base language because its so obvious
13:07:42 razetime joins (~quassel@49.207.213.87)
13:07:54 <Axman6> Inst: i have no idea what LetLambda would do
13:08:20 <Inst> equivalent to python walrus operator, i.e, use on declare
13:08:27 × mysl quits (~mysl@user/mysl) (Remote host closed the connection)
13:08:31 <Axman6> Inst: i have no idea what LetLambda would do
13:08:43 <Inst> since there are declarative programming nuts who don't believe in lambdas
13:08:58 <Inst> at the same time, it seems that lambdas do improve readability, but are undeclarative
13:08:58 <Axman6> show me what it would look like
13:09:15 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 245 seconds)
13:09:29 <Inst> foo\bar -> bar desugars to let foo = \bar -> bar in foo
13:10:13 <Axman6> not sure I see the point of that
13:10:35 <Inst> having cake and eating it too, i.e, ergonomic named anonymous functions, and i can see why you wouldn't see the point of that
13:10:54 <Axman6> "named anonymous functions"
13:11:23 <Inst> yeah, this is just a scam for me to trivially become a GHC contributor
13:11:39 <Inst> i think it's a good idea, as in, even a conventional imperative language should have a similar facility
13:12:06 <Axman6> it'a not too hard, though that said I have three PRs that I haven't found the time to finish off for the last month or so
13:12:36 <Axman6> how does that example differ from just \bar -> bar?
13:13:05 <Inst> I mean, with conventional lambda use, you don't have a name
13:13:07 <Inst> (\bar -> bar)
13:13:33 <Inst> the benefit is that it's terse, ergonomic, etc, but on the other hand, there is no name there, it's like certain people complaining about use of go
13:13:48 <Axman6> but in that example you don't either, it's gone outside the scope of the let
13:14:19 <Inst> i mean, in a more conventional language, you might want to hoist the term out, at least optionally
13:14:36 <Inst> the need is already fulfilled by comments, tbh
13:15:24 <Inst> but there is an advantage to using this over comments
13:15:55 <Inst> insofar as it's a first-class syntactical construct, and means that people won't comment with -- asinine comment here
13:15:57 <ncf> Inst: do you mean this as a shorthand for building fixed points?
13:16:11 <Inst> nope, but i suppose we could do so!
13:16:13 <Axman6> if you're going to make a proposal or s PR, you're going to have to do a much better job explaining what this actually does, I feel like I understand less than before I asked
13:16:16 <ncf> like fact\n -> n * fact (n - 1)
13:16:33 <ncf> anyway that's terrible please forget it now
13:16:48 <Inst> ncf: iirc, we already have short-hand for building fixed points, no?
13:17:00 <Inst> I forgot about it, and I could just hijack it for this purpose
13:17:05 <lortabac> maybe you want something like named lambdas (basically syntactic sugar for fix)
13:17:11 <ncf> well there's fix. not exactly shorthand, more of a definition
13:17:18 <ncf> fix \ fact n -> n * fact (n - 1)
13:17:18 <Inst> it is basically just named lambdas
13:17:25 <lortabac> I don't remember which language has them, maybe Clojure?
13:17:31 <Axman6> a.k.a functions
13:17:38 <lortabac> Axman6: inline functions
13:17:50 <Inst> bleh, w/e, i have other things to do, i'd rather waste my time on trying to beat jose valim instead
13:18:42 <Inst> https://paste.tomsmeding.com/qckPcWI6
13:18:55 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
13:19:57 <Axman6> :t partsOf
13:19:58 <lambdabot> Functor f => Traversing (->) f s t a a -> LensLike f s t [a] [a]
13:20:28 <Inst> i really, really need to learn optics, I mean, I have monad tutorials ALMOST down
13:20:50 × robosexual quits (~spaceoyst@5.165.11.54) (Quit: Konversation terminated!)
13:21:09 <Inst> https://hasura.io/blog/parser-combinators-walkthrough/#fn1
13:21:31 <Inst> in the sense that it should be possible to teach someone monads in 15-30 minutes, 1 hour at worst, we're just pedagogically challenged here
13:21:45 <Axman6> > ("Hello", ("there", ["are","several"]),Left "Strings", "in", "here") & partsOf template %~ (reverse :: [String] -> [String])
13:21:47 <lambdabot> ("here",("in",["Strings","several"]),Left "are","there","Hello")
13:21:48 <Inst> and no, before you ask, i've taken a year or more to try to figure it out properly
13:22:44 <Axman6> > ("Hello", ("there", ["are","several"]),Left "Strings", "in", "here") & partsOf template %~ (reverse :: String -> String)
13:22:45 <lambdabot> ("erehn",("isgni",["rtS","lareves"]),Left "eraereh","to","lleH")
13:24:05 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 250 seconds)
13:24:24 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
13:24:24 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
13:24:24 wroathe joins (~wroathe@user/wroathe)
13:25:09 <ncf> lol
13:25:22 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
13:29:04 <Inst> also, btw, my project goal right now, besides messing around, not getting ready to leave the country for medical care, is to build the cabal GUI wrapper
13:29:13 <Inst> but, since bricks is adding windows support in 6-24 months
13:29:26 <Inst> would it be worthwhile to try to repackage ghci with a simple IDE?
13:29:34 × ulysses4ever quits (~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
13:29:48 ulysses4ever joins (~artem@c-73-103-90-145.hsd1.in.comcast.net)
13:30:09 famubu parts (~julinuser@61.0.251.1) ()
13:30:59 fserucas__ joins (~fserucas@46.50.115.39)
13:31:17 mysl joins (~mysl@user/mysl)
13:31:42 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
13:31:50 <haskellbridge> <j​ean-paul.> What does "worthwhile" mean?
13:33:20 <Axman6> what would the IDE offer?
13:33:36 × fserucas_ quits (~fserucas@46.50.115.39) (Ping timeout: 255 seconds)
13:34:04 <Axman6> I wouldnt mind habing something like pythons pudb package
13:35:23 CiaoSen joins (~Jura@2a05:5800:2a1:b500:664b:f0ff:fe37:9ef)
13:36:12 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
13:37:27 gatekempt joins (~gatekempt@user/gatekempt)
13:40:51 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 245 seconds)
13:45:14 <Inst> Axman6: I guess, a more GHCI-centric workflow?
13:45:30 <Inst> GHCI is good, relative to Python, but terrible relative to other interpreters in the FP space, so I'm told
13:46:22 × ddellacosta quits (~ddellacos@ool-44c738de.dyn.optonline.net) (Quit: WeeChat 4.0.3)
13:46:28 <Inst> also, providing Haskell developers the embarrassment of using CUDDLES
13:47:07 <Inst> probably a bad idea right now, given that Cabal according to sclv is understaffed
13:47:21 <Inst> existing tooling needs improvement before new tooling can be developed
13:48:55 ddellacosta joins (~ddellacos@ool-44c738de.dyn.optonline.net)
13:49:25 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
13:53:08 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
13:57:51 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 245 seconds)
13:57:55 × MajorBiscuit quits (~MajorBisc@c-001-010-057.client.tudelft.eduvpn.nl) (Ping timeout: 255 seconds)
13:59:43 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 255 seconds)
13:59:44 MajorBiscuit joins (~MajorBisc@62-137-46.netrun.cytanet.com.cy)
14:04:08 × razetime quits (~quassel@49.207.213.87) (Ping timeout: 246 seconds)
14:07:47 × mima quits (~mmh@net-93-67-213-89.cust.vodafonedsl.it) (Ping timeout: 246 seconds)
14:07:52 billchenchina joins (~billchenc@103.152.35.21)
14:08:37 <bwe> how do I get the list of files with Turtle? `fs <- _ $ ls "."`
14:09:42 razetime joins (~quassel@49.207.213.87)
14:10:17 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
14:10:18 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:3f4f:3d1f:233a:c3d3) (Quit: WeeChat 2.8)
14:13:43 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
14:14:40 danse-nr3__ joins (~francesco@151.37.176.153)
14:15:12 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
14:15:51 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 245 seconds)
14:17:08 × tv quits (~tv@user/tv) (Ping timeout: 246 seconds)
14:17:10 × danse-nr3_ quits (~francesco@151.37.129.27) (Ping timeout: 245 seconds)
14:18:23 thyriaen joins (~thyriaen@2a01:aea0:dd4:6de3:6245:cbff:fe9f:48b1)
14:18:41 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 260 seconds)
14:18:51 <thyriaen> does haskell have a preprocessor like in c ?
14:18:52 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 248 seconds)
14:21:33 <geekosaur> you can use the C preprocessor but with some caveats since it expects C instead of Haskell
14:22:19 <geekosaur> you can use your own preprocessor with `-pgmF`; there are no standard ones
14:23:15 <geekosaur> there is a literate preprocessor that is run automatically on `.lhs` files; you don't have any control over this aside from replacing the `unlit` program in the GHC distribution
14:23:44 anselmschueler joins (~anselmsch@user/schuelermine)
14:24:25 thegeekinside joins (~thegeekin@189.180.81.59)
14:25:42 × razetime quits (~quassel@49.207.213.87) (Ping timeout: 246 seconds)
14:27:46 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
14:31:07 tv joins (~tv@user/tv)
14:32:42 <Inst> gah, lens is powerful enoguh to make this trivial
14:32:48 <Inst> so this is really a problem for lens
14:33:20 × zer0bitz quits (~zer0bitz@user/zer0bitz) (Ping timeout: 246 seconds)
14:34:12 × anselmschueler quits (~anselmsch@user/schuelermine) (Ping timeout: 240 seconds)
14:35:38 <chromoblob> thyriaen: also, see Template Haskell
14:36:05 × bratwurst quits (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Remote host closed the connection)
14:36:38 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
14:38:02 × thyriaen quits (~thyriaen@2a01:aea0:dd4:6de3:6245:cbff:fe9f:48b1) (Quit: Leaving)
14:41:04 thyriaen joins (~thyriaen@2a01:aea0:dd4:6de3:6245:cbff:fe9f:48b1)
14:43:38 × fendor quits (~fendor@2a02:8388:1640:be00:29b8:807b:7fa6:1bcf) (Remote host closed the connection)
14:44:00 zer0bitz joins (~zer0bitz@user/zer0bitz)
14:46:29 × bratwurst quits (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Ping timeout: 246 seconds)
14:47:24 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
14:48:19 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
14:49:59 ripspin joins (~chatzilla@1.145.152.77)
14:51:26 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 246 seconds)
14:53:36 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 258 seconds)
14:57:00 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
15:00:38 × CiaoSen quits (~Jura@2a05:5800:2a1:b500:664b:f0ff:fe37:9ef) (Ping timeout: 246 seconds)
15:01:17 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 244 seconds)
15:02:41 yoyofreeman joins (~yoyofreem@47.254.237.126)
15:03:27 × ripspin quits (~chatzilla@1.145.152.77) (Remote host closed the connection)
15:06:15 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
15:07:01 <bwe> (so, it's actually sth. like `
15:07:14 <bwe> `fold (find (suffix "Browser.py") "/usr/lib") Fold.head`)
15:10:04 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
15:10:59 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
15:11:16 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 255 seconds)
15:12:19 × gatekempt quits (~gatekempt@user/gatekempt) (Quit: My MacBook has gone to sleep. ZZZzzz…)
15:14:06 <danse-nr3__> bwe, how are you liking Turtle? I experimented with similar libs time ago, then gave up and resorted to more common functions available in base
15:14:26 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21) (Remote host closed the connection)
15:14:41 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21)
15:16:46 dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net)
15:20:25 × shapr quits (~user@2600:1700:c640:3100:6019:9d8e:9090:8797) (Remote host closed the connection)
15:22:02 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
15:25:11 × thegeekinside quits (~thegeekin@189.180.81.59) (Ping timeout: 260 seconds)
15:25:40 ripspin joins (~chatzilla@1.145.152.77)
15:26:23 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 246 seconds)
15:27:59 × zer0bitz quits (~zer0bitz@user/zer0bitz) (Read error: Connection reset by peer)
15:28:22 sm joins (~sm@plaintextaccounting/sm)
15:30:41 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 4.0.4)
15:31:01 × Inst quits (~liamzy@2601:6c4:4085:6d50::6d40) (Remote host closed the connection)
15:31:21 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
15:31:33 × chele quits (~chele@user/chele) (Remote host closed the connection)
15:33:02 × dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 246 seconds)
15:37:05 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21) (Read error: Connection reset by peer)
15:39:27 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
15:40:55 × MajorBiscuit quits (~MajorBisc@62-137-46.netrun.cytanet.com.cy) (Ping timeout: 245 seconds)
15:43:09 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
15:43:47 thegeekinside joins (~thegeekin@189.180.81.59)
15:44:26 × thyriaen quits (~thyriaen@2a01:aea0:dd4:6de3:6245:cbff:fe9f:48b1) (Remote host closed the connection)
15:45:39 × yoyofreeman quits (~yoyofreem@47.254.237.126) (Remote host closed the connection)
15:46:14 × ubert quits (~Thunderbi@77.119.173.8.wireless.dyn.drei.com) (Ping timeout: 244 seconds)
15:49:29 × thegeekinside quits (~thegeekin@189.180.81.59) (Remote host closed the connection)
15:49:52 shapr joins (~user@2600:1700:c640:3100:c5b6:6d9c:4fa1:59ed)
15:50:19 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
15:54:32 × bratwurst quits (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Ping timeout: 246 seconds)
15:54:43 × ripspin quits (~chatzilla@1.145.152.77) (Remote host closed the connection)
15:55:05 × falafel quits (~falafel@216.68.6.51.dyn.plus.net) (Ping timeout: 246 seconds)
15:55:34 haritz joins (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220)
15:55:34 × haritz quits (~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220) (Changing host)
15:55:34 haritz joins (~hrtz@user/haritz)
15:56:36 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
15:56:53 anselmschueler joins (~anselmsch@user/schuelermine)
15:58:14 × billchenchina quits (~billchenc@103.152.35.21) (Remote host closed the connection)
15:58:48 × anselmschueler quits (~anselmsch@user/schuelermine) (Client Quit)
15:59:04 grnman_ joins (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net)
15:59:06 anselmschueler joins (~anselmsch@user/schuelermine)
16:00:51 Guest71 joins (~Guest50@189.176.241.47)
16:02:09 × Guest71 quits (~Guest50@189.176.241.47) (Client Quit)
16:02:55 Guest94 joins (~Guest50@189.176.241.47)
16:03:57 <nyc> Is there a shorter predicate to test for a case than \case { MyCase _ _ _ -> True ; _ -> False } ?
16:03:59 × anselmschueler quits (~anselmsch@user/schuelermine) (Client Quit)
16:04:13 anselmschueler joins (~anselmsch@user/schuelermine)
16:04:27 anselmschueler parts (~anselmsch@user/schuelermine) ()
16:05:59 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
16:06:04 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
16:06:05 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 246 seconds)
16:06:38 <geekosaur> only if you write it yourself (cf. `isNothing`/`isJust`)
16:06:43 <int-e> nyc: you can write MyCase{}
16:07:04 <int-e> (not much shorter but it saves you from counting arguments which is nice)
16:07:40 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 248 seconds)
16:08:09 <nyc> int-e: I'm hoping to use it for a break (\case { MyCase _ _ _ -> True ; _ -> False }) blahblah sort of affair.
16:08:13 <mauke> \case MyCase{} -> True; _ -> False
16:08:29 <mauke> or possibly something involving Data.Data.Data
16:08:44 <nyc> Ah, I see wrt. counting args.
16:09:13 thegeekinside joins (~thegeekin@189.180.81.59)
16:10:11 <nyc> Thanks on that one.
16:11:00 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21)
16:11:56 caryhartline joins (~caryhartl@168.182.58.169)
16:12:29 × Guest94 quits (~Guest50@189.176.241.47) (Ping timeout: 246 seconds)
16:12:56 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
16:16:10 <Inst> i'm a freaking imbecile
16:16:21 <Inst> i've been raging this entire time that aeson can't decode to object
16:16:23 <Inst> turns out it can
16:16:26 <Inst> decode @Value
16:16:29 <Inst> i'm so, so stupid
16:16:49 <geekosaur> you should have asked, even I know that one
16:17:12 <Inst> i'm so, so stupid
16:17:30 <Inst> typeclasses, man, how do they work?
16:17:54 <Inst> i kept on searching the freaking API, turns out it's using value API to decode to object
16:18:02 <Inst> erm, type API to do so
16:18:04 <mauke> do you even need the explicit type argument?
16:18:25 <mauke> if you just use the result as Value, it should all work out
16:22:37 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 250 seconds)
16:24:17 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:5185:af9c:1a37:ea21) (Remote host closed the connection)
16:24:18 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
16:24:32 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
16:25:59 <Inst> yeah, I don't, but it's not obvious how to do so
16:27:35 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:29:19 Guest9 joins (~Guest36@2800:200:f690:145:5e87:9cff:fed5:e94f)
16:29:34 × Guest9 quits (~Guest36@2800:200:f690:145:5e87:9cff:fed5:e94f) (Client Quit)
16:29:53 <Inst> btw, just curious, i have a weird discovery
16:29:57 <Inst> haskell is beating C by 10x here
16:30:15 <Inst> i don't think anything is optimized, but for reference, the Python is running at 10x C
16:30:28 <Inst> https://rosettacode.org/wiki/Factorions#Haskell
16:31:23 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:31:53 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
16:32:33 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 246 seconds)
16:33:22 <Inst> the Haskell might be just using a more efficient algorithm
16:34:40 <int-e> did you compile the program?
16:36:20 <int-e> and how are you running the python code... it's slow for me
16:37:03 <Inst> Haskell is running in about 19 seconds
16:37:05 <Inst> erm, 19 ms
16:37:17 <Inst> well, around 26 ms, C around 260 ms, Python 2600 ms
16:37:17 <Inst> weird
16:37:21 <Inst> -O2
16:38:08 idgaen joins (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
16:38:52 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 240 seconds)
16:39:14 <int-e> ...ah wait, the Haskell code is cheating. It's supposed to *verify* up to 1500000, not print the known number of results.
16:39:56 <mauke> right
16:40:28 <mauke> the haskell code basically checks that there are *at least* n factorions in base b
16:40:37 <mauke> and then it just stops early
16:42:20 <int-e> https://paste.tomsmeding.com/PgIbNFXa takes quite a bit longer, about 4x the time of the C program for me
16:42:49 <Inst> ah, nice
16:43:12 lzszt joins (~lzszt@2001:9e8:2dea:5800:d0b7:7b8a:c9f4:ac3c)
16:43:27 <int-e> not too shabby
16:44:25 <mauke> the haskell version doesn't use a factorial cache
16:44:34 <mauke> would that make it faster?
16:44:34 <int-e> yeah
16:44:42 <int-e> it probably would?
16:44:49 <Inst> also, is the filter actually efficient?
16:44:55 <Inst> is stream fusion actually kicking off?
16:45:19 <Inst> since i get antsy around lists for high performance data
16:46:32 <Inst> oof, list variant is actually faster
16:46:54 <mauke> what do you want to fuse here?
16:47:46 <int-e> everything
16:48:09 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:51:04 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:52:24 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
16:52:31 × danse-nr3__ quits (~francesco@151.37.176.153) (Ping timeout: 255 seconds)
16:52:51 <EvanR> haskell reached 0.25c, well within the bounds of relativity
16:53:02 <int-e> Tabulating the factorial does help a bit, 20-30% depending on boxed vector, unboxed vector, and safe or unsafe indexing
16:53:43 danza joins (~francesco@151.37.176.153)
16:53:56 gatekempt joins (~gatekempt@user/gatekempt)
16:55:37 ursa-major joins (~ursa-majo@37.19.210.10)
16:56:58 <nyc> Weirdly ~ isn't silencing a -Wincomplete-uni-patterns warning. I know it shouldn't fail, but if there's a way to shut it up for -Werror that'd be great.
16:57:01 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 244 seconds)
16:57:29 razetime joins (~quassel@49.207.213.87)
16:57:48 <int-e> a bit faster, 1.63x C for me: https://paste.tomsmeding.com/SteZjLR6
16:58:09 <int-e> but of course far less idiomatic
16:58:15 <int-e> (and slightly unsafe)
16:59:15 <EvanR> a numeric program using quotRem is faster than C ?
16:59:30 <int-e> Err, I forgot to change the import back to Data.Vector.Unboxed, that would be 1.4x
16:59:39 <int-e> EvanR: that's time, not speed
16:59:43 <int-e> so it's slower
16:59:47 <EvanR> oh
17:00:14 <EvanR> kind of like kessel run in 1.63 parsecs
17:00:22 × grnman_ quits (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net) (Ping timeout: 245 seconds)
17:00:53 <int-e> Though quotRem should be okay compared to C? It *is* the operation that matches the CPU instruction.
17:02:23 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
17:02:27 <EvanR> yes but there's this check on each call for zero right
17:02:43 <EvanR> to avoid using that instruction on zero
17:03:07 <mauke> f n s | ... = f n s
17:03:55 <int-e> sure but it should be predicted perfectly; heck a smart enough compiler could optimize it out in this case, it just would have to recognize that 9..12 never triggers those checks
17:04:21 <EvanR> sounds nice xD
17:04:26 <int-e> mauke: I like imperative code
17:04:36 <int-e> (I don't think ghc is smart enoguh but I haven't checked)
17:04:43 <mauke> now I want to see a version that rebinds f in the ... partr
17:04:47 <mauke> s/r$//
17:05:35 oo_miguel joins (~Thunderbi@78-11-179-96.static.ip.netia.com.pl)
17:06:22 <int-e> mauke: Am I a terrible person for genuinely liking this semi-imperative style?
17:06:48 <mauke> :shrug:
17:06:56 <mauke> makes sense to me :-)
17:07:01 <int-e> (when appropriate... which doesn't happen a lot)
17:07:34 <int-e> Basically I prefer it to adding a bunch of primes to identifiers.
17:07:38 <EvanR> i did not understand the code, was like how are you recursing on f n s unchanged xD
17:08:06 <mauke> the power of in-place updates, baby!
17:09:35 <Inst> okay, some small optimizations, got it to 3x c
17:10:02 <mauke> is printf a bottleneck at all?
17:10:21 <mauke> probably not enough output for that
17:10:48 <Inst> ugh, this is ugly, hgmp only accepts integer? :(
17:10:59 <nyc> I'm using ~(x:xs) but -Wincomplete-uni-patterns is still warning me. How do I stop it?
17:11:03 <Inst> tried modding it to hgmp with predicatable results
17:12:47 <erisco> use the FFI and get 1x C
17:12:55 zer0bitz joins (~zer0bitz@user/zer0bitz)
17:13:01 <geekosaur> inline-c
17:13:34 <Inst> actually, would be funny to do so
17:14:31 <int-e> mauke: printf a bottleneck for this amount of output? No way... and it isn't; it would start to be noticable at around 10k lines of output.
17:17:47 × razetime quits (~quassel@49.207.213.87) (Remote host closed the connection)
17:17:48 vpan joins (~0@212.117.1.172)
17:17:52 × vpan quits (~0@212.117.1.172) (Client Quit)
17:18:53 × jespada quits (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Quit: Textual IRC Client: www.textualapp.com)
17:20:41 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
17:22:50 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
17:25:26 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 245 seconds)
17:34:06 × ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 260 seconds)
17:35:01 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
17:35:44 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
17:38:19 × gawen quits (~gawen@user/gawen) (Quit: cya)
17:39:28 <Inst> le sigh
17:39:32 <Inst> @int-e
17:39:32 <lambdabot> Unknown command, try @list
17:39:42 <Inst> julia got to 36 ms
17:39:46 <Inst> vs 460 ms on Haskell
17:40:12 <Inst> very pretty code, too
17:40:13 <Inst> isfactorian(n, base) = sum(factorial,digits(n,base=base)) == n
17:41:24 <Inst> not sure if they're auto-parallelizing
17:42:26 <erisco> never heard of Julia
17:42:39 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 258 seconds)
17:42:51 <EvanR> it has a fancy GUI front end
17:43:12 <EvanR> and can barf LLVM output at you on command so you can inspect it
17:43:28 <erisco> it is progressively typed?
17:43:48 <EvanR> what is that
17:44:07 <EvanR> the opposite of conservatively typed?
17:44:30 <erisco> you choose how much you want to statically type, everything else is effectively Dynamic
17:44:40 <EvanR> no, not really
17:45:32 gawen joins (~gawen@user/gawen)
17:47:01 falafel joins (~falafel@216.68.6.51.dyn.plus.net)
17:47:28 <erisco> they make it sound like it
17:47:52 <EvanR> there's a pretty slick way it makes you feel like everything is dynamic but it's not
17:48:16 <EvanR> as evidenced by the barfed LLVM output xD
17:48:28 <int-e> Inst: hmm the code at https://rosettacode.org/wiki/Factorions#Julia is different and only testing up to 100k
17:48:38 <int-e> cheaters all around
17:48:58 <erisco> looks like the kind of language you'd have for game modding or something, in place of Lua
17:49:27 <EvanR> it's more marketed as a replacement for fortran
17:49:52 <carbolymer> is there a function like when, but for alternative i.e.: Alternative f => Bool -> f a -> f a
17:49:56 <EvanR> (but would not be surprised if it web people take and run with it anyway)
17:50:18 <carbolymer> basically `whenA cond x = if cond then x else empty`
17:50:19 <erisco> nah, web people are still building the wasm utopia
17:51:01 <erisco> maybe Julia can also fight Python
17:51:34 <EvanR> julia -> llvm -> wasm
17:52:03 <erisco> yeah now if only wasm didn't suck for building web applications, lol
17:52:23 <int-e> it's only fair; web applications suck
17:52:47 wootehfoot joins (~wootehfoo@user/wootehfoot)
17:52:49 <briandaed> carbolymer you probably found the one from Agda...
17:56:21 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
17:58:30 chexum joins (~quassel@gateway/tor-sasl/chexum)
17:58:57 fendor joins (~fendor@2a02:8388:1640:be00:29b8:807b:7fa6:1bcf)
18:01:17 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
18:01:51 sm joins (~sm@plaintextaccounting/sm)
18:04:33 <Inst> int-e: very nice implementation
18:04:43 <Inst> guess how this works?
18:04:43 <Inst> isfactorian(n, base) = sum(factorial,digits(n,base=base)) == n
18:04:53 <Inst> this is the 37 ms version
18:05:30 <int-e> no, that's a microseconds building block in that implementation
18:06:17 <Inst> factorial is cached up until bigInt results, then gmp
18:08:31 <Inst> digits is somehow fast
18:08:31 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Remote host closed the connection)
18:08:49 Inst joins (~liamzy@2601:6c4:4085:6d50::ccb7)
18:09:38 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
18:13:09 barzo joins (~hd@31.223.52.142)
18:14:35 danza_ joins (~francesco@151.19.244.206)
18:16:18 <nyc> Can I just rm -rf ~/.cabal/store/ or do I have to rm -rf ~/.cabal/ as a whole?
18:16:28 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
18:16:30 <int-e> Inst: if it is clever about digits() in a loop it could be doing something like this: http://paste.debian.net/1290511/
18:16:34 × hpc quits (~juzz@ip98-169-35-163.dc.dc.cox.net) (Ping timeout: 246 seconds)
18:16:55 <geekosaur> nyc, just the store is fine
18:17:06 × danza quits (~francesco@151.37.176.153) (Ping timeout: 244 seconds)
18:17:27 <geekosaur> I wouldn't remove all of ~/.cabal because you also lose cached sources and your config
18:17:42 grnman_ joins (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net)
18:20:44 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:20:52 <Inst> digits is a built-in afaik
18:22:50 <int-e> Inst: which is why it's easy to believe that the compiler is clever about the case where it's used in a loop
18:23:01 abrantesasf joins (~abrantesa@179.217.48.72)
18:23:28 hpc joins (~juzz@ip98-169-35-163.dc.dc.cox.net)
18:23:28 <int-e> Inst: however I still haven't seen the *complete* program you're testing.
18:24:03 <int-e> Also rosetta code is annoying because they tend to compare stupid algorithms.
18:24:15 <Inst> i'm serious, the complete program i'm testing is just that
18:24:21 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
18:24:29 <Inst> isfactorian(n, base) = sum(factorial,digits(n,base=base)) == n
18:24:35 <Inst> + the rosetta code base
18:24:39 <dolio> That isn't a complete program.
18:24:58 <Inst> printallfactorian(base) = println("Factorians for base $base: ", [n for n in 1:100000 if isfactorian(n, base)])
18:25:04 <int-e> so you're only testing up to 100k
18:25:18 <int-e> and you're wondering why it's much faster than a program that tests up to 1.5M
18:25:20 <Inst> foreach(printallfactorian, 9:12)
18:25:27 <Inst> ;_;
18:25:37 <Inst> so, let me try again
18:26:38 <monochrom> I love it when askers say "you can recover my complete program by composing these 10 fragments from these 10 URLs plus the following 3 patches".
18:26:40 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:27:04 aaronv joins (~aaronv@user/aaronv)
18:27:18 <int-e> I mean I pointed out earlier that the Julia program from the Rosetta page cheats
18:27:29 <monochrom> Shows a whole lot of entitlement attitude where they think they are entitled to make you do the legwork.
18:27:38 <int-e> so apparently that didn't connect
18:27:40 <Inst> "single result which took 6.529 seconds to complete
18:27:41 <Inst> hmmm
18:27:41 <Inst> nice
18:27:53 <Inst> nah, it was pointed out that it cheats in other ays as well
18:28:07 dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net)
18:28:17 <int-e> Inst: but this particular cheat made it into your test
18:28:37 <monochrom> And BTW why are we regressing to 20 years ago when these stupid microbenchmarks were a fad?
18:29:15 <monochrom> I suggest that everyone to not perpetuate any microbenchmarking discussions.
18:29:16 <dolio> Microbenchmarks are always popular.
18:29:29 <Inst> because it's fun
18:29:30 <Inst> it's a toy
18:29:36 <monochrom> Well yeah but I mean just #haskell.
18:30:04 <monochrom> There was like a 15-year period of peace when people stopped doing that.
18:30:45 <EvanR> yeah lets stop and go back to comparing how much industry dollars is spent / made with language X
18:30:52 <monochrom> pax non benchmarca
18:30:53 <EvanR> what really matters
18:31:21 <davros1> It was many years ago that I last looked at haskell.. what kind of backends does it have these days? Is it still mostly that "c--" ; was there interest in LLVM, and do people compile it to WASM aswell or what
18:31:24 <EvanR> at least it's not if programming language was a car or something
18:31:27 <mauke> let's go back to code golf
18:31:44 <Inst> WASM backend is now being supported by GHC team, JS backend as well
18:31:52 <mauke> early stages, though
18:31:58 <Inst> yeah :(
18:32:11 <monochrom> -fllvm exists. Not sure about interest.
18:32:25 <Inst> there's apparently vector instruction optimizations in fllvm, not sure if it's in the main backend
18:33:25 <EvanR> it's good we're moving toward targeting relevant platforms like the web. I also recommend preparing for the metafuture VR platform that runs on a platform that people will have forgotten runs on web, need to keep up
18:34:00 <Inst> IIRC there were a few firms using Haskell for VR, no?
18:34:15 <Inst> Someone here mentioned their Haskell for AR
18:34:25 <segfaultfizzbuzz> write haskell in vr, using a browser-based wysiwyg word processor
18:34:41 <erisco> VR is like game dev, and I think there was like, one grad who did that one time long ago. Last I knew anyways
18:34:55 <dolio> I seem to recall ghc maintainers kind of complaining about the llvm stuff, as well.
18:35:13 <monochrom> c-- and llvm are orthogonal.
18:35:15 <Inst> actually i'm curious, i wonder if the Verse bindings to Unreal can be hijacked
18:35:26 <dolio> I think llvm as a project is just not aimed at being particularly usable by something like ghc.
18:35:52 <monochrom> GHC always goes through c--. Afterwards, the choice is x86 or ARM or llvm or js or ...
18:37:03 <monochrom> OK nevermind, I don't know how early/late js happens in the pipeline. But x86/arm/llvm are definitely after c--.
18:37:36 <dolio> Going all the way to c-- for JS seems like it'd be weird, but I guess it might happen.
18:37:41 <Rembane> I want a shortcut to js!
18:38:34 <Inst> sort of funny trying to troll Julians with the benchmark, though, because we'd consider losing to Haskell a bug, and they're now non-plussed they can't figure out how to optimize past Haskell
18:38:40 <monochrom> I have found the ultimate shortcut. I wrote js myself. :)
18:39:10 × hpc quits (~juzz@ip98-169-35-163.dc.dc.cox.net) (Ping timeout: 255 seconds)
18:39:33 <monochrom> Why are you trolling Julians what's wrong with you
18:40:09 <mauke> they invented the day
18:40:17 <monochrom> haha
18:40:20 <int-e> Inst-igator
18:40:52 hpc joins (~juzz@ip98-169-35-163.dc.dc.cox.net)
18:41:23 <Inst> nah, we're sort of friends, mostly, it just turns out to be trolling since if they end up being slower than Haskell, it beats their language design targets, not really that different than SPJ reposting Jose Valim
18:41:42 <erisco> it sounds like their language design targets are to be the best at all the things
18:42:03 <int-e> talk about setting yourself up for failure
18:42:05 <Inst> they have a nice foothold in machine learning and scientific compute, and i think many of them are happy with that
18:42:07 <monochrom> I'm going to change subject.
18:42:11 <Inst> sorry then
18:42:30 <dolio> erisco: No, this kind of array arithmetic microbenchmark is exactly what Julia is designed for, I think.
18:42:59 <monochrom> I want to prove that from parametricity the type "f :: (a->b) -> [a] -> [b]" together with "f id = id" implies that f satisfies the functor laws.
18:43:23 <monochrom> I ended up proving nothing weaker than "f = map". Is this normal?
18:44:07 <dolio> Yes, that's normal.
18:44:13 <monochrom> Nice thanks.
18:44:20 <mauke> no, proving properties of software is not normal
18:44:55 <mauke> @free f :: (a->b) -> [a] -> [b]
18:44:55 <lambdabot> h . k = p . g => $map h . f k = f p . $map g
18:45:33 <ncf> by yoneda f is entirely determined by f id :: [b] -> [b]
18:45:57 <int-e> take h = p, k = g = id: $map h = f h
18:46:15 <ncf> (in other words f id :: ℕ -> ℕ)
18:47:15 <ncf> wait no, forget that
18:47:26 <ncf> but anyway my first statement still holds
18:47:56 <mauke> $map h . f id = f h
18:47:57 <mauke> I see
18:48:00 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:49:35 <EvanR> are you sure you're not on the something
18:49:37 Simikando joins (~Simikando@adsl-dyn1.91-127-51.t-com.sk)
18:49:41 × barzo quits (~hd@31.223.52.142) (Quit: Leaving)
18:49:58 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:50:00 <EvanR> f id :: N -> N seems to have a lot of freedom but f id :: [b] -> [b] does not?
18:50:41 <EvanR> on to*
18:51:13 <ncf> [b] -> [b] can permute elements
18:51:14 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
18:51:29 <EvanR> or change the length of the list
18:51:41 × dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 260 seconds)
18:52:26 <EvanR> use the length of bound on length as a numeric value
18:52:33 <EvanR> length or bound
18:52:43 <ncf> there's exactly one function ℕ -> ℕ that always returns 1, but there are many functions [b] -> [b] that always return singletons
18:53:14 <monochrom> Thanks ncf, that's nice.
18:53:24 <int-e> ncf: except for the empty list
18:53:38 <EvanR> i see
18:53:42 <mauke> was about to say, not if they're polymorphic like that
18:53:49 <ncf> what about the empty list?
18:53:53 <dolio> Yeah, it's like (n : ℕ) -> [Fin n] or something.
18:53:54 <int-e> > last []
18:53:55 <lambdabot> *Exception: Prelude.last: empty list
18:53:59 <mauke> because I can set b = Void
18:54:05 <dolio> Except the Haskell lists can be infinite.
18:54:25 <ncf> oh yeah
18:54:48 <dolio> Also you can stick bottoms in wherever you want, etc.
18:54:58 <monochrom> I think "can permute" best illustrates your point that [b]->[b] is richer than N->N.
18:57:10 × nek0 quits (~nek0@2a01:4f8:222:2b41::12) (Quit: The Lounge - https://thelounge.chat)
19:02:59 × Simikando quits (~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
19:04:37 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
19:06:11 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 245 seconds)
19:14:09 Lycurgus joins (~juan@user/Lycurgus)
19:16:29 caryhartline joins (~caryhartl@168.182.58.169)
19:18:49 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
19:20:43 Simikando joins (~Simikando@adsl-dyn1.91-127-51.t-com.sk)
19:23:44 arthurvl is now known as earthy
19:25:31 ft joins (~ft@p508db658.dip0.t-ipconnect.de)
19:27:43 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
19:29:57 × vglfr quits (~vglfr@188.239.201.89) (Ping timeout: 244 seconds)
19:31:09 vglfr joins (~vglfr@cli-188-239-201-89.bbn.slav.dn.ua)
19:36:58 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
19:37:46 mima joins (~mmh@net-93-67-213-89.cust.vodafonedsl.it)
19:38:05 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer)
19:38:32 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
19:40:59 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
19:41:34 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Tschüss)
19:45:02 × Inst quits (~liamzy@2601:6c4:4085:6d50::ccb7) (Remote host closed the connection)
19:45:19 Inst joins (~liamzy@2601:6c4:4085:6d50::bd68)
19:45:29 × fendor quits (~fendor@2a02:8388:1640:be00:29b8:807b:7fa6:1bcf) (Remote host closed the connection)
19:46:06 × briandaed quits (~briandaed@185.234.210.211.r.toneticgroup.pl) (Remote host closed the connection)
19:47:44 <Inst> curious, is async magic?
19:48:08 <Inst> it feels like compiler magic
19:48:28 <geekosaur> forkIO involves some compiler magic but async itself is not
19:48:31 <mauke> normal library built on top of threads, as far as I know
19:48:49 <geekosaur> mostly it deals with a lot of tedious stuff you need to do for reliability
19:49:02 <geekosaur> I think the parconc book covers what's under the covers?
19:49:06 <geekosaur> @where parconc
19:49:06 <lambdabot> https://www.safaribooksonline.com/library/view/parallel-and-concurrent/9781449335939/
19:49:15 <dminuoso> Much of the magic behind async that makes is work nicely is in fact built-in RTS behavior:
19:49:32 <dminuoso> Green threads, and lots of blocking IO that under the hood uses asynchronous APIs.
19:49:50 <Inst> i'm reading the source code
19:49:55 <Inst> https://hackage.haskell.org/package/async-2.2.4/docs/src/Control.Concurrent.Async.html#forConcurrently_
19:50:05 <Inst> the stuff with runConcurrently and Concurrently, I don't see the ForkIO
19:50:13 <dminuoso> Its mostly not that apparent without the `async` library, because you generally dont write as much asynchronous code without that library.
19:50:14 <Inst> it has no traversable instance, but it has an applicative instance
19:50:39 <Inst> ahhh, the payload is in the applicative instance
19:50:50 <tomsmeding> vim
19:50:52 <tomsmeding> oops
19:52:22 × idgaen quits (~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.2)
19:52:51 <Inst> trying to figure out why i can't get mapConcurrent to work in such a way that the values are computed, and I get an await, before I I traverse print over it
19:53:16 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
19:53:18 <Inst> it feels like if I throw Deepseq.force on it, the concurrency just goes away
19:56:00 lortabac joins (~lortabac@88.125.6.227)
19:56:12 <EvanR> mapConcurrently?
19:56:20 × masterbuilder quits (~masterbui@user/masterbuilder) (Remote host closed the connection)
19:56:43 <EvanR> that's an IO thing not sure what deepseq has to do with it
19:56:59 <Inst> the thing is, concurrency is non-deterministic
19:57:18 <Inst> i'm trying to force the system to wait for all results to complete before allowing an attempt to print the results, because you know what the alternative is
19:57:20 <EvanR> what does deepseq have to do with that either
19:57:44 <Inst> i mean there's no unsafeInterleaveIO, right?
19:57:55 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 255 seconds)
19:57:55 <EvanR> I was going to ask if you're doing that
19:58:44 <EvanR> if you try to print the results of mapConcurrently, it automatically waits
19:58:51 <EvanR> if necessary
19:59:05 <EvanR> and the results are always in order
20:01:36 <EvanR> and you can't await it because it's not of Async type
20:02:27 <Inst> bleh, i can't go debug this :(
20:02:31 <Inst> out of time anyways
20:04:28 <Inst> the real problem is, i benchmark at 160 ms with out of order concurrency, but if I try to stabilize it
20:04:34 <Inst> 460 ms
20:05:54 <tomsmeding> Inst: DeepSeq.force inside the concurrent thread?
20:06:03 <tomsmeding> presumably mapConcurrently WHNF's the list elements, otherwise it's not much use
20:06:12 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
20:06:28 <c_wraith> mapConcurrently runs *IO* for each element.
20:06:31 <int-e> we haven't seen the actual code, have we?
20:06:33 <c_wraith> It only forces if the IO does
20:07:34 Sciencentistguy0 joins (~sciencent@hacksoc/ordinary-member)
20:08:58 <Inst> it's the same code as the one you put in, except I slapped in mapConcurrently
20:09:05 <Inst> I think the problem is probably to do with printf
20:09:13 <c_wraith> since mapConcurrently blocks until all IO is done, it looks like the problem is that IO isn't forcing values
20:09:37 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 255 seconds)
20:09:44 <c_wraith> Unless you're not using mapConcurrently from async, I guess. There could be other things with that name.
20:10:20 × Sciencentistguy quits (~sciencent@hacksoc/ordinary-member) (Ping timeout: 248 seconds)
20:10:21 Sciencentistguy0 is now known as Sciencentistguy
20:10:21 <int-e> Inst: even with that description there's probably a dozen ways to match that
20:11:10 <Inst> https://paste.tomsmeding.com/JMK122AL
20:11:33 <int-e> and details matter because a lot of this is about forcing evaluation of the right things at the right point
20:11:47 <Inst> iirc IO isn't lazy unless you unsafeInterleaveIO
20:12:08 <Inst> or use a function that has it baked in somewhere
20:12:32 <c_wraith> Inst: congratulations, you're forcing IO values. that's pretty useless
20:12:36 <tomsmeding> (which uses unsafeInterleaveIO internally)
20:12:45 <EvanR> mapConcurrently spawns a thread for each element then awaits them all, then returns the resulting structure
20:12:49 <int-e> lol, force <$>
20:12:53 <int-e> doesn't force anything
20:13:04 <c_wraith> Inst: use evaluate
20:13:06 <EvanR> ok yeah deepseq doesn't do anything
20:13:37 <int-e> evaluate (force (b, result b)) I guess
20:13:46 <c_wraith> int-e: yes, that.
20:13:57 <tomsmeding> % (return undefined >>= \_ -> return 42) :: IO Int
20:13:57 <yahb2> 42
20:14:02 <tomsmeding> Inst: IO is not strict
20:14:33 <tomsmeding> % (return undefined >>= \x -> Control.Exception.evaluate x >> return 42) :: IO Int
20:14:34 <yahb2> *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:17:9 in interactive:Ghci4
20:15:05 <int-e> f <$> pure x is 100% equivalent to pure (f x)
20:15:25 <tomsmeding> it would have worked if IO.>>= was strict in the value
20:15:36 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
20:15:52 <c_wraith> Ok, I was wrong when I said you were forcing the IO value. You were just doing the equivalent of pure (force x), as int-e says
20:15:53 × grnman_ quits (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net) (Ping timeout: 246 seconds)
20:16:06 <EvanR> is the point to compute some stuff in threads, do nothing with it, then quit with no output. Then use evaluate in each action
20:16:14 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 246 seconds)
20:16:16 <c_wraith> evaluate is 100$ semantically the correct operation for this use case
20:16:20 <c_wraith> err. 100%
20:16:44 <EvanR> @src evaluate
20:16:44 <lambdabot> Source not found. Your mind just hasn't been the same since the electro-shock, has it?
20:17:03 <c_wraith> I do think it's a bit weird to have it in Control.Exception. I see why it's there, but.. it's more broadly useful than that
20:17:28 <Inst> okay, but still, the problem is that i don't get a concurrency speedup under most circumstances
20:17:38 <Inst> unless i leave the code free-running
20:17:49 <Inst> erm, unless it let the order be non-deterministic
20:17:50 <int-e> Hah, `evaluate $ force x` is literally an example in the documentation of `evaluate`
20:18:06 sm joins (~sm@plaintextaccounting/sm)
20:18:28 <EvanR> Inst, async is more for doing stuff concurrently. If you wanted speedups you want parallel haskell. Parallel combinators
20:18:41 <EvanR> Control.Parallel
20:18:48 <int-e> EvanR: since I'm looking at this anyway: evaluate a = IO $ \s -> seq# a s
20:18:57 <mauke> https://hackage.haskell.org/package/deepseq-1.5.0.0/docs/Control-DeepSeq.html#v:force
20:19:00 <mauke> also here
20:19:09 <c_wraith> Inst: what order? mapConcurrently returns the list of results in the same order as the list of inputs.
20:19:11 <EvanR> deepseq was just the wrong thing
20:19:11 <mauke> I like the view pattern example
20:19:31 <int-e> :t GHC.Exts.seq#
20:19:32 <lambdabot> a -> GHC.Prim.State# d -> (# GHC.Prim.State# d, a #)
20:19:42 <int-e> magic!
20:19:56 <EvanR> magic hash
20:20:09 <EvanR> RealWorld is deeply magical
20:20:16 <Inst> this seems like the use of excessive force
20:20:17 <Inst> main = do
20:20:17 <Inst> traverse_ ((uncurry (printf "Factorions for base %2d: %s\n"))) =<< forConcurrently [9..12] (\b -> evaluate $ force (b, result b))
20:20:38 <c_wraith> well now you've moved printing inside the concurrently
20:20:44 × bratwurst quits (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Ping timeout: 246 seconds)
20:20:46 <c_wraith> of course that's going to be non-deterministic.
20:20:51 <Inst> this is deterministic
20:20:54 <Inst> and concurrent
20:21:00 <int-e> c_wraith: no?
20:21:02 <c_wraith> oh, gah. I did misread the args.
20:21:20 <int-e> this looks like it should work
20:21:23 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
20:21:26 <Inst> but why?
20:21:34 <int-e> why what?
20:21:44 <Inst> why is it working whereas, say, removing evaluate and force doesn't?
20:21:55 <c_wraith> because of laziness?
20:22:20 <tomsmeding> Inst: see my yahb example above
20:22:30 <tomsmeding> % (return undefined >>= \_ -> return 42) :: IO Int -- Inst, this one
20:22:30 <yahb2> 42
20:22:41 <tomsmeding> IO's >>= does not evaluate the value to WHNF is not strict
20:22:46 <c_wraith> like, when you create a thread and tell it to just return an expression that has no reason to be evaluated... it does exactly what you said. No more.
20:22:47 <tomsmeding> hence the 'evaluate' is necessary
20:22:48 <int-e> without the evaluate and force it'll happily put unevaluated thunks in parallel, collect them into a list, and then printing will trigger the real evaluation
20:22:51 <Inst> so, let me think of this another way, without the evaluate / force
20:22:55 <tomsmeding> and the 'force' is necessary because the 'evaluate' forces just the (,)
20:22:57 <Inst> the forConcurrently does nothing
20:23:07 <int-e> s/put/construct
20:23:11 <mauke> "I wish to perform my effects concurrently. Also I have no effects. Why isn't it doing anything?"
20:23:25 <EvanR> nothing in haskell is evaluated unless required by something. Not to be confused with how IO is executed, which happens sequentially in order. And they're separate concepts
20:23:36 <int-e> Inst: it does something, just less than you wanted
20:23:52 <c_wraith> Inst: forConcurrently is doing something, it's just useless without the something being a sufficiently large chunk of work.
20:24:18 <int-e> it's like cooking coffee in parallel with 4 people taking orders but only one coffee machine
20:24:27 × lzszt quits (~lzszt@2001:9e8:2dea:5800:d0b7:7b8a:c9f4:ac3c) (Quit: Client closed)
20:24:45 <int-e> (assuming people were able to order coffee quickly... it's a bad analogy)
20:24:53 <c_wraith> ultimately, this is because async is about concurrency, not parallelism
20:24:56 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
20:25:01 <Inst> so the for_ is actually causing the effects and causing evaluation otherwise
20:25:02 <Inst> and when it's causing the effects, it's evaluating the underlying values
20:25:02 <Inst> so then in which case, no speed-up, pair evaluate force, speedup
20:25:02 × Inst quits (~liamzy@2601:6c4:4085:6d50::bd68) (Remote host closed the connection)
20:25:10 <c_wraith> it's intended for allowing *effects* to interleave between multiple actions
20:25:15 <EvanR> i greatly appreciate when the owner comes out and yells over the line "who here just wants basic cup of coffee"
20:25:20 Inst joins (~liamzy@2601:6c4:4085:6d50::4f8)
20:25:44 <EvanR> fast path
20:26:00 <c_wraith> If you specifically want a speedup from using more than one thread of execution in a single calculation, you are asking for parallelism
20:26:21 int-e would like to point out how much easier this became once we had the actual code.
20:27:11 <mauke> oh, it's the legwork all over again
20:27:29 <Inst> tbh this seems awfully footgunny
20:27:38 <Inst> the reason i didn't want to resort to par monad / rpar etc
20:27:40 <c_wraith> Inst: that's because you're using the wrong tool for the job
20:27:56 <EvanR> par isn't a monad
20:27:58 <EvanR> :t par
20:27:59 <lambdabot> error:
20:27:59 <lambdabot> • Variable not in scope: par
20:27:59 <lambdabot> • Perhaps you meant one of these:
20:28:02 <Inst> did not want to play with spark herding
20:28:05 <c_wraith> there is a Par monad.
20:28:11 <EvanR> par :: a -> b -> b
20:28:16 × lortabac quits (~lortabac@88.125.6.227) (Quit: WeeChat 2.8)
20:28:21 <Inst> https://hackage.haskell.org/package/monad-par
20:28:21 × Simikando quits (~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
20:29:00 <EvanR> parMap :: Strategy b -> (a -> b) -> [a] -> [b]
20:29:07 <Inst> i browsed parallel and concurrent computing in haskell in the last year or so
20:29:09 <EvanR> seems pretty straightforward
20:29:20 <Inst> so i still remember par monad, you're suggesting people don't use it
20:29:30 <Inst> i get anxiety when sparks fizzle :(
20:29:32 <Inst> it's sort of a pain
20:29:39 <c_wraith> sparks are supposed to fizzle.
20:29:50 <Inst> either, one, no sparks fizzle but you get no speedup, or two, sparks fizzle and you're at the optimum point
20:30:07 <c_wraith> ... admittedly, you should try to keep the number of sparks fizzling below the number that are converted...
20:30:12 <Inst> i actually go nuts and pair BOTH
20:30:21 <Inst> par monad, other concurrency tricks
20:30:29 <Inst> erm, other parallelism handlers, with concurrency
20:30:33 <EvanR> it just sounded like you were ignoring the parallel package and going to some monad
20:30:54 <EvanR> but it sounded like you just wanted to run a list of computations in parallel
20:31:10 <int-e> It's funny how messing with the evaluation order seems to require an understanding of the evaluation order (laziness and strictness)...
20:31:19 <Inst> i'm wondering, in other people's parallelism models, do they waste work this way?
20:34:02 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
20:34:39 <c_wraith> I don't think I've seen optimistic parallelism anywhere else.
20:34:58 <c_wraith> But I've only seen real parallelism in other places in data-parallel libraries.
20:35:01 <c_wraith> (or languages)
20:35:31 <c_wraith> everything else is concurrency that requires you to manually convert it into parallelism
20:37:03 <Inst> so wait, unsafeInterleaveIO only makes the effects lazy, because the values are lazy by default, no?
20:37:20 <c_wraith> yes
20:37:39 <c_wraith> unsafeInterleaveIO is a weird form of concurrency that causes effects to be demand-driven.
20:38:21 <EvanR> which is what we would be dealing with if haskell didn't decide on purity
20:38:27 <EvanR> dealing with everywhere
20:38:34 <Inst> w/e, I need to stop procrastinating, my intended mode of procrastination was learning lenses so I could do a three-line solution to Jose Valim's problem
20:39:24 <Inst> here's a better question, people gave me like 23928 docs on laziness in theory, but what's the best way to gain an intuition and reflex for laziness?
20:39:44 <EvanR> evaluate some example expressions using various strategies
20:39:58 <c_wraith> https://apfelmus.nfshost.com/blog/2013/08/21-space-invariants.html this is the only *really good* explanation I've ever seen.
20:41:02 <c_wraith> It's all about understanding that evaluation is demand-driven, and what tools you have to link particular demands to particular evaluations.
20:41:06 <int-e> stick Debug.Trace.trace calls everywhere in your code and try to predict the order in which they're printed
20:41:23 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 246 seconds)
20:41:25 <dolio> Nah, that's not necessarily a good idea.
20:41:38 <dolio> Because GHC will just reorder them sometimes.
20:41:46 <Inst> oh, btw
20:41:49 <Inst> did you guys see this yet?
20:42:03 <Inst> https://hackage.haskell.org/package/debug-trace-file
20:42:05 <int-e> dolio: And then you've learned something too :-P (I'm somewhat serious, somewhat joking...)
20:42:25 <Inst> tbh, to an extent, that sounds like an interesting art project
20:42:48 <Inst> use the debug-trace runs as seeds to generative art
20:43:14 <int-e> sounds like another distraction from whatever you said you needed to do
20:43:19 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
20:45:15 × michalz quits (~michalz@185.246.207.203) (Remote host closed the connection)
20:47:48 × acidjnk quits (~acidjnk@p200300d6e7072f02ccbbb6636abe1529.dip0.t-ipconnect.de) (Ping timeout: 258 seconds)
20:48:05 bratwurst joins (~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
20:52:01 × sm quits (~sm@plaintextaccounting/sm) (Quit: sm)
20:58:25 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
21:00:16 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
21:02:04 × Inst quits (~liamzy@2601:6c4:4085:6d50::4f8) (Ping timeout: 248 seconds)
21:06:20 × vglfr quits (~vglfr@cli-188-239-201-89.bbn.slav.dn.ua) (Ping timeout: 248 seconds)
21:14:02 vglfr joins (~vglfr@2a0d:3344:148d:7a00:fdd5:1482:7428:6489)
21:18:05 <monochrom> I don't think GHC is all that random.
21:18:32 <monochrom> It reorders code for optimization not for randomization.
21:19:14 <monochrom> But ghci also has a debugger that exposes unoptimized evaluation order.
21:20:43 × falafel quits (~falafel@216.68.6.51.dyn.plus.net) (Ping timeout: 255 seconds)
21:21:45 <dolio> It's not random, but anticipating the exact order it will put trace statements in while optimizing can be difficult.
21:22:09 <monochrom> I just mean it falls shorts of generating art.
21:22:10 <dolio> And probably isn't a very useful skill.
21:22:20 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
21:22:55 Guest|91 joins (~Guest|91@023-084-120-023.res.spectrum.com)
21:24:23 × abrantesasf quits (~abrantesa@179.217.48.72) (Remote host closed the connection)
21:25:46 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
21:27:01 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 255 seconds)
21:31:41 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 245 seconds)
21:33:23 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
21:34:40 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 255 seconds)
21:35:48 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
21:39:18 grnman_ joins (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net)
21:39:49 × Guest|91 quits (~Guest|91@023-084-120-023.res.spectrum.com) (Quit: Connection closed)
21:39:53 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
21:44:22 × gatekempt quits (~gatekempt@user/gatekempt) (Quit: My MacBook has gone to sleep. ZZZzzz…)
21:47:24 × segfaultfizzbuzz quits (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net) (Ping timeout: 248 seconds)
21:54:33 L29Ah joins (~L29Ah@wikipedia/L29Ah)
21:56:36 × aaronv quits (~aaronv@user/aaronv) (Remote host closed the connection)
21:57:15 × texasmynsted quits (~username@99.96.221.112) (Quit: WeeChat 3.0)
21:57:35 texasmynsted joins (~username@99.96.221.112)
22:00:30 falafel joins (~falafel@216.68.6.51.dyn.plus.net)
22:01:05 × fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
22:01:51 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
22:06:30 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 244 seconds)
22:10:06 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
22:11:28 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:c431:f4c7:e475:d84d)
22:11:56 beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt)
22:12:56 segfaultfizzbuzz joins (~segfaultf@23-93-74-212.fiber.dynamic.sonic.net)
22:14:22 × danza_ quits (~francesco@151.19.244.206) (Read error: Connection reset by peer)
22:14:35 danza_ joins (~francesco@151.43.229.34)
22:15:17 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 244 seconds)
22:18:01 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:c431:f4c7:e475:d84d) (Remote host closed the connection)
22:18:16 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:c431:f4c7:e475:d84d)
22:20:36 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
22:21:17 × beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Quit: beteigeuze)
22:22:56 Square2 joins (~Square4@user/square)
22:24:58 Sgeo joins (~Sgeo@user/sgeo)
22:28:19 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
22:30:19 × thelounge793 quits (~thelounge@2a05:f480:1400:24b2:5400:4ff:fe76:a8f3) (Quit: Ping timeout (120 seconds))
22:30:36 thelounge793 joins (~thelounge@2a05:f480:1400:24b2:5400:4ff:fe76:a8f3)
22:30:59 gatekempt joins (~gatekempt@user/gatekempt)
22:53:54 pavonia joins (~user@user/siracusa)
22:55:39 × grnman_ quits (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net) (Ping timeout: 246 seconds)
23:02:18 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
23:02:23 jmdaemon joins (~jmdaemon@user/jmdaemon)
23:05:56 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
23:10:28 wroathe joins (~wroathe@user/wroathe)
23:10:36 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 248 seconds)
23:15:26 × fserucas__ quits (~fserucas@46.50.115.39) (Ping timeout: 245 seconds)
23:20:36 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
23:20:57 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
23:21:07 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
23:25:47 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
23:26:41 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 245 seconds)
23:34:16 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
23:37:09 falafel_ joins (~falafel@233.68.6.51.dyn.plus.net)
23:37:58 × falafel quits (~falafel@216.68.6.51.dyn.plus.net) (Ping timeout: 255 seconds)
23:38:44 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
23:39:07 azimut joins (~azimut@gateway/tor-sasl/azimut)
23:41:49 Inst joins (~liamzy@2601:6c4:4085:6d50::bd68)
23:43:35 emmanuelux joins (~emmanuelu@user/emmanuelux)
23:46:20 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 248 seconds)
23:46:41 × ulysses4ever quits (~artem@c-73-103-90-145.hsd1.in.comcast.net) (Ping timeout: 246 seconds)
23:47:15 ulysses4ever joins (~artem@c-73-103-90-145.hsd1.in.comcast.net)
23:47:52 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 245 seconds)
23:48:13 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
23:48:29 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
23:48:54 arahael joins (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
23:52:52 × arahael quits (~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 240 seconds)
23:54:18 grnman_ joins (~michaelsc@c-66-176-3-51.hsd1.fl.comcast.net)
23:55:31 × mima quits (~mmh@net-93-67-213-89.cust.vodafonedsl.it) (Ping timeout: 244 seconds)
23:57:51 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
23:57:52 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
23:57:52 wroathe joins (~wroathe@user/wroathe)

All times are in UTC on 2023-08-30.