Home liberachat/#haskell: Logs Calendar

Logs on 2021-08-27 (liberachat/#haskell)

00:03:40 × azeem quits (~azeem@176.200.209.130) (Ping timeout: 240 seconds)
00:04:25 azeem joins (~azeem@176.200.209.130)
00:07:55 <maralorn> I am concretely thinking about a syntax sugar than unisonweb.org has and that I‘d love to try out in Haskell:
00:08:54 <maralorn> I am thinking about having something like `await` or simply `'` that you can use in a do block which has the fake type `Monad m => m a -> a`.
00:10:27 <roboguy_> maralorn: what would that do?
00:10:40 <roboguy_> oh, in a do-block
00:10:41 <maralorn> So e.g. `do {print ('getInt + 'getInt)}` would get desugared to `do {a0 <- getInt; b0 <- getInt; print (a0 + b0)}`
00:10:45 <roboguy_> like Idris's !?
00:11:08 <maralorn> Idris has that?
00:11:13 <Axman6> sounds a wee bit like the proposal for the foo (<- g) x (<- h) syntax... can't remember it's name
00:11:23 <roboguy_> I think Idris has it with !
00:11:46 <maralorn> Axman6: Ah, yeah. I thought about using `<-` for that.
00:12:22 × chisui quits (~chisui@200116b868eba000c7eca115e002477a.dip.versatel-1u1.de) (Quit: Client closed)
00:12:27 roboguy__ joins (~roboguy_@2605:a601:afe7:9f00:a00e:962b:3f01:b758)
00:12:53 <monochrom> In bash, "cmd (< cmd2) (> cmd3)" is called process substitution. Perhaps we can call that monadic substitution :)
00:13:57 <maralorn> Axman6: Do you think it was a ghc-proposal?
00:14:02 chisui joins (~chisui@200116b868eba000c7eca115e002477a.dip.versatel-1u1.de)
00:14:09 <roboguy__> there have been a few times where I was thinking it'd be nice to have that
00:14:21 <yushyin> even more syntax sugar? oO
00:14:32 <monochrom> https://ro-che.info/ccc/1
00:14:35 <geekosaur> haskell is mostly syntax sugar]
00:14:39 <roboguy__> hah
00:14:47 <roboguy__> that is pretty accurate!
00:14:54 <Axman6> I think so. I believe it was rejected because ordering becomes a bit painful - if you f (<- g) (<- h) and you need h to execute before g then the syntax doesn't really work
00:15:00 <roboguy__> especially when you look at Core
00:15:10 <maralorn> yushyin: Yeah I know. People will hate it.
00:15:22 <Axman6> Everything is caasseee, everything is case when you look at the core...
00:15:49 <roboguy__> occasionally it is let
00:16:03 <Axman6> Let's just fancy case
00:16:06 <Axman6> (I know it's not)
00:16:07 <roboguy__> haha
00:16:23 × roboguy_ quits (~roboguy_@2605:a601:afe7:9f00:1cd3:839e:78c5:a38b) (Ping timeout: 250 seconds)
00:16:27 <c_wraith> never a case without a let
00:16:33 <maralorn> Axman6: flip?
00:16:44 <roboguy__> let there be a case
00:16:44 <Axman6> that becomes gross very quickly
00:16:53 <Axman6> IMO flip is almost always a code smell
00:16:54 <monochrom> What if the syntax is "f (30 <- g) (20 <- h)" using ordinals 20 and 30 to indicate order?
00:17:09 <c_wraith> monochrom: are you reinventing BASIC intentionally?
00:17:16 <Axman6> -XBASICMonadicExecution
00:17:30 <monochrom> Haha I don't know. I am not free of BASIC influence.
00:17:47 <roboguy__> ah, you sorta run into the issues that you have with sequence points in C?
00:18:09 <maralorn> You can always do { let x = (<- h); f (<- g) x } if you really need the other order.
00:18:14 <monochrom> flip is also not very general.
00:18:58 <monochrom> Ugh that breaks how "let" is supposed to preserve equational reasoning.
00:19:04 <maralorn> idk, unisonlang has this feature (with their effect system) and I think writing code with it is really pleasant.
00:19:29 <maralorn> monochrom: That is a fair point.
00:19:57 <maralorn> do { x <- h; f (<- g) x} ?
00:20:56 <maralorn> otoh that kinda lessens the appeal since I have always been a little annoyed by <- and = being so different things …
00:21:49 <monochrom> 'getInt + 'getInt is a misleading example.
00:22:01 <roboguy__> it's more weird to me that = is often used in effectful ways
00:22:02 <maralorn> monochrom: Why?
00:23:01 <monochrom> 'getInt - 'getInt is a slightly better example that alerts you to the issue "what if my intetion is y<-getInt; x<-getInt; return (y-x), not (x-y)"
00:23:24 Lycurgus joins (~juan@cpe-45-46-140-49.buffalo.res.rr.com)
00:24:04 <maralorn> monochrom: Yeah, there needs to be some simple rule for that.
00:24:11 <monochrom> In general an honest example involves a non-commutative f (or even, if 3 parameters are involved, also non-associative) so that the order issue we were discussing is immediately self-evident.
00:24:28 <maralorn> Fair
00:24:54 <monochrom> Such an honest example also destroy the fantasy of believing that such a feature is nice.
00:25:13 <monochrom> This is why honest examples are never given.
00:25:18 <maralorn> but, but
00:25:25 <maralorn> I programmed with it. It was nice.
00:25:36 <maralorn> It was in a strict language though …
00:25:50 <monochrom> Haskell's IO is also a strict language.
00:26:56 <monochrom> Err I botched my example. I wanted "return (x-y)" and I wanted the user to enter y first.
00:28:05 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
00:28:18 <roboguy__> :t print =<< (-) @Int <$> readLn <*> readLn
00:28:19 <lambdabot> error:
00:28:19 <lambdabot> Pattern syntax in expression context: (-)@Int
00:28:19 <lambdabot> Did you mean to enable TypeApplications?
00:28:43 <roboguy__> :t print =<< (-) <$> (readLn :: IO Int) <*> readLn
00:28:44 <lambdabot> IO ()
00:31:34 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7) (Remote host closed the connection)
00:31:53 <roboguy__> I feel like between (=<<), (>>=), (<$>) and (<*>) you can get decently far (especially if you throw in an operator that is defined as \f x -> join (f <*> x))
00:32:00 × epolanski quits (uid312403@id-312403.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
00:32:42 <monochrom> @type \f x -> join (f <*> x)
00:32:43 <lambdabot> Monad m => m (a1 -> m a2) -> m a1 -> m a2
00:33:11 <roboguy__> I used that a lot when I worked with the z3 package, due to how it's EDSL types are
00:33:27 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
00:33:40 × azeem quits (~azeem@176.200.209.130) (Ping timeout: 240 seconds)
00:33:47 <maralorn> roboguy__: Yeah, you can. But it feels far less intuitive.
00:34:18 azeem joins (~azeem@176.200.209.130)
00:34:40 <maralorn> There was at the minimum a year in my Haskell learning experience where <$> and <*> scared the shit out of me.
00:35:19 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Remote host closed the connection)
00:36:17 <Axman6> Extremely general things like that can be very difficult to grok
00:36:38 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 250 seconds)
00:37:12 <Axman6> I think for most people the understanding comes from seeing how they behave for specific choices of applicatives, and then fetting a feel for the general pattern. Eventually it just becomes "Oh this this is an applicative, I can do these things too, and have a good expectation of how they should behave)
00:37:16 <Axman6> s/)/"
00:37:47 × PinealGlandOptic quits (~PinealGla@37.115.210.35) (Quit: leaving)
00:38:05 × alx741 quits (~alx741@181.196.68.187) (Quit: alx741)
00:38:07 <roboguy__> that's exactly my recommendation for stuff like that, too. I think it's a pretty effective way to learn
00:38:09 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
00:38:34 × NieDzejkob quits (~quassel@195.149.98.3) (Ping timeout: 252 seconds)
00:38:36 <haskl> maerwald, I just read the bit about not being able to test code that isn't exported, basically. I'm having trouble with defining the type of something in an example as some type that doesn't get exported. It seems like there's no way around that fact besides changing my code so it *does* export that code. That's a major limitation of cabal-docspec if I'm not mistaken.
00:38:48 <roboguy__> some things can certainly still be tricky though (many category theory things immediately come to mind, for me personally)
00:39:04 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7)
00:40:41 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
00:41:44 NieDzejkob joins (~quassel@195.149.98.3)
00:42:39 <Axman6> Like understanding Applicative with Maybe is pretty easy, generalise a function over arguments which might not exist, and the result only exists if they all did. Then generalising a function where each argument can be chosen from lists is the next step. Generalising a function over arguments that can come from IO. And eventually you get that feel for "generalise a funnction over..."
00:42:46 × chisui quits (~chisui@200116b868eba000c7eca115e002477a.dip.versatel-1u1.de) (Ping timeout: 246 seconds)
00:43:44 <maralorn> Today for me most monad/applicative/category operators seem easy. Never the less I observe my self always bailing out to writing stuff in do notation because it is more intuitive and scales much better to more complicated expressions.
00:44:39 <maralorn> And then when I have working code I refactor it to use more operators because that feels prettier.
00:45:13 <maralorn> But I guess that’s bad because when it was hard for me to write quickly it’s probably hard for others to read quickly.
00:46:57 <maralorn> I feel that some await like syntax would help with that.
00:48:13 <maralorn> (and for people annoyed by Haskell syntax getting bigger and bigger. I can give you a list of syntax features that I would like to see dropped for balance. :-p)
00:48:22 <c_wraith> If there are top-level type signatures and you're not doing too much in one place, it tends to be easier to read code than write it
00:48:37 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
00:48:49 <c_wraith> Because you don't need to follow the plumbing details. You can just know the compiler enforced getting it correct
00:50:40 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 252 seconds)
00:50:53 favonia joins (~favonia@user/favonia)
00:51:04 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
00:54:12 lavaman joins (~lavaman@98.38.249.169)
00:57:28 roboguy_ joins (~roboguy_@2605:a601:afe7:9f00:80b:4b4e:c456:3347)
00:59:03 thyriaen joins (~thyriaen@x4db77c74.dyn.telefonica.de)
01:00:40 × roboguy__ quits (~roboguy_@2605:a601:afe7:9f00:a00e:962b:3f01:b758) (Ping timeout: 240 seconds)
01:05:56 × lbseale quits (~lbseale@user/ep1ctetus) (Read error: Connection reset by peer)
01:06:20 d0ku joins (~d0ku@178.43.56.75.ipv4.supernova.orange.pl)
01:06:41 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
01:08:59 neo1 joins (~neo3@cpe-292712.ip.primehome.com)
01:10:57 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 248 seconds)
01:13:14 neurocyte8 joins (~neurocyte@185.117.69.230)
01:13:14 × neurocyte8 quits (~neurocyte@185.117.69.230) (Changing host)
01:13:14 neurocyte8 joins (~neurocyte@user/neurocyte)
01:15:19 × neurocyte quits (~neurocyte@user/neurocyte) (Ping timeout: 250 seconds)
01:15:19 neurocyte8 is now known as neurocyte
01:16:54 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
01:17:22 renzhi joins (~xp@2607:fa49:6500:3d00::d986)
01:20:22 × azeem quits (~azeem@176.200.209.130) (Ping timeout: 252 seconds)
01:20:38 azeem joins (~azeem@176.200.202.203)
01:21:54 <lechner> Hi, sorry it is a bit off-topic: Does anyone know of an extremely simple language/parser for logic expressions? i'm looking for symbols (but no math), conditionals and AND/OR/NOT. Would prefer not to write one. Thanks!
01:22:34 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
01:23:30 lavaman joins (~lavaman@98.38.249.169)
01:25:49 <haskl> Has anyone here used cabal-docspec?
01:25:50 <roboguy_> lechner: does it have to be certain symbols?
01:27:17 <lechner> they would have meaning (module names)
01:28:08 <roboguy_> lechner: I mean, do they have to be like certain specific symbols like \/ means AND, etc or does it not really matter what the text of the symbols are?
01:28:12 <roboguy_> if that makes sense
01:29:27 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
01:29:27 × sszark2 quits (~sszark@h-155-4-128-59.NA.cust.bahnhof.se) (Ping timeout: 240 seconds)
01:30:34 <lechner> roboguy_: they represent exernal logic variables that come from elsewhere, and should be more or less arbitrary text (sans keywords, if needed)
01:30:41 <roboguy_> if it doesn't really matter, you could probably use Haskell's parser and define a datatype with some infix constructors, etc. You can specify the precendence
01:31:13 <roboguy_> and then use the derived Read instance
01:31:42 sszark2 joins (~sszark@h-155-4-128-59.na.cust.bahnhof.se)
01:33:01 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
01:33:35 <roboguy_> although, if it is external text that comes from elsewhere, that makes me think that it does need to be a certain format? Not sure I understand fully, though
01:33:35 <lechner> due to Haskell's executable size I probably have use a recursive parser (or maybe a language like rust). i just could not think of a place with more Ph.D.s in mathematics
01:33:53 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 248 seconds)
01:34:02 <lechner> i am really looking for a specification, i think
01:34:47 <lechner> it has to be fast
01:34:49 <roboguy_> like, you could make a data type like: "data Expr = Expr :&&: Expr | Expr :||: Expr | ... deriving (Read)", specify the fixity and precedence and then the Read instance should parse those expressions for you
01:35:00 <roboguy_> ah
01:36:22 <lechner> not that haskell is slow, but this would be for a lower system component in linux dealing with authentication
01:38:10 <roboguy_> you probably need a specific language in mind to find a parser library for that
01:38:47 × xff0x quits (~xff0x@2001:1a81:53a5:7900:930f:bdfe:83e3:2183) (Ping timeout: 240 seconds)
01:39:12 <roboguy_> searching for "precedence parser" might help you find some libraries (together with a programming language name), though
01:40:54 xff0x joins (~xff0x@2001:1a81:53dc:be00:b65c:39d2:8f04:a6df)
01:41:19 × waleee quits (~waleee@2001:9b0:216:8200:d457:9189:7843:1dbd) (Ping timeout: 250 seconds)
01:41:37 <lechner> i am looking to replace the awful logic of Linux PAM https://serverfault.com/questions/134471/success-n-control-syntax-in-pam-conf-pam-d-files
01:48:07 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 240 seconds)
01:48:20 azeem joins (~azeem@176.200.202.203)
01:50:57 × d0ku quits (~d0ku@178.43.56.75.ipv4.supernova.orange.pl) (Ping timeout: 248 seconds)
01:51:24 <lechner> maybe something like this https://jsonlogic.com/
01:53:22 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 252 seconds)
01:59:27 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 240 seconds)
02:00:10 azeem joins (~azeem@176.200.202.203)
02:00:25 <dsal> In case anyone's looking to help someone out over on Quora: https://usercontent.irccloud-cdn.com/file/qxOZ9t9C/%CE%BB.png
02:03:46 lavaman joins (~lavaman@98.38.249.169)
02:06:34 <monochrom> lechner: https://wiki.haskell.org/Parsing_expressions_and_statements shows how to use parsec to parse expressions with very minimal coding as soon as you have decided on operator precedence and associativity. You only need to read up to and including "expression parser", i.e., you can skip "statement parser" (unless you also have statements/commands)
02:08:13 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 252 seconds)
02:10:40 × dadude quits (~da1dude@112.201.99.74) (Quit: Leaving)
02:16:43 <Clint> lechner: i ended up switching to alex/happy for that type of thing, but there's stuff like https://hackage.haskell.org/package/parsers-0.12.10/docs/Text-Parser-Expression.html
02:17:14 thyriaen_ joins (~thyriaen@dynamic-089-012-236-255.89.12.pool.telefonica.de)
02:17:47 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 240 seconds)
02:18:19 × talismanick quits (~user@2601:644:8500:8350::cc04) (Remote host closed the connection)
02:18:26 <pavonia> "approximate phone number" O.o
02:19:59 Codaraxis_ joins (~Codaraxis@user/codaraxis)
02:20:02 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
02:20:49 × thyriaen quits (~thyriaen@x4db77c74.dyn.telefonica.de) (Ping timeout: 248 seconds)
02:21:18 × haykam quits (~haykam@static.100.2.21.65.clients.your-server.de) (Remote host closed the connection)
02:21:31 haykam joins (~haykam@static.100.2.21.65.clients.your-server.de)
02:23:40 × Codaraxis quits (~Codaraxis@user/codaraxis) (Ping timeout: 240 seconds)
02:26:13 Codaraxis__ joins (~Codaraxis@user/codaraxis)
02:26:33 <lechner> monochrom Clint: thanks for the pointers!
02:29:10 × td_ quits (~td@94.134.91.22) (Ping timeout: 240 seconds)
02:30:13 × Codaraxis_ quits (~Codaraxis@user/codaraxis) (Ping timeout: 252 seconds)
02:31:14 td_ joins (~td@94.134.91.64)
02:31:37 <arahael> pavonia: My approximate phone number, is +630000000000 :) Accurate to two significant figures!
02:33:32 <pavonia> That's on the Philippines?
02:37:49 snicf joins (~snicf@ip98-161-16-64.om.om.cox.net)
02:38:20 snicf is now known as t3hyoshi
02:41:49 martin02 joins (~silas@2001:4ca0:0:fe00:0:5efe:a96:1bc1)
02:43:08 lavaman joins (~lavaman@98.38.249.169)
02:47:29 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 248 seconds)
02:48:27 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 240 seconds)
02:48:39 azeem joins (~azeem@176.200.202.203)
02:51:05 × t3hyoshi quits (~snicf@ip98-161-16-64.om.om.cox.net) (Quit: leaving)
02:51:57 × machinedgod quits (~machinedg@135-23-192-217.cpe.pppoe.ca) (Ping timeout: 250 seconds)
02:55:53 slack1256 joins (~slack1256@191.125.176.239)
02:59:08 t3hyoshi joins (~snicf@2600:8804:1b96:4900:a9b2:143c:7dd0:6ceb)
03:03:04 <arahael> australia.
03:03:20 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
03:03:20 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
03:03:20 wroathe joins (~wroathe@user/wroathe)
03:03:32 <arahael> don't know if it includes the phillipines, though. it might.
03:04:33 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 248 seconds)
03:05:05 <arahael> uh? odd. the australian country code is +61, i should double check on the mobile numbers! always thought it was 63. (we rarely use them locally)
03:05:41 <lechner> it was only approximate anyway
03:06:17 <arahael> indeed.
03:06:31 <nshepperd> accurate to within two significant digits, plus or minus one
03:06:57 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
03:07:07 arahael <- won't make it through an interview for a statistics position, it seems!
03:07:18 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
03:09:03 <lechner> plus or minus one is a range of two
03:09:34 arahael tears up his fake statistics doctorate.
03:16:07 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 240 seconds)
03:17:01 azeem joins (~azeem@176.200.202.203)
03:17:31 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 252 seconds)
03:17:47 × otto_s_ quits (~user@p5de2f1e2.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
03:19:30 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
03:19:46 geekosaur joins (~geekosaur@xmonad/geekosaur)
03:19:51 otto_s joins (~user@p5de2f51d.dip0.t-ipconnect.de)
03:30:15 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
03:32:15 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 250 seconds)
03:33:01 azeem joins (~azeem@176.200.202.203)
03:34:34 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
03:41:47 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 250 seconds)
03:43:44 azeem joins (~azeem@176.200.202.203)
03:45:10 × aplainzetakind quits (~johndoe@captainludd.powered.by.lunarbnc.net) (Read error: Connection reset by peer)
03:46:23 aplainzetakind joins (~johndoe@captainludd.powered.by.lunarbnc.net)
03:50:07 × azeem quits (~azeem@176.200.202.203) (Ping timeout: 240 seconds)
03:53:03 azeem joins (~azeem@176.201.38.112)
03:53:40 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
03:54:48 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
03:55:27 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
03:57:47 nate1 joins (~nate@108-233-125-227.lightspeed.sntcca.sbcglobal.net)
03:58:29 lavaman joins (~lavaman@98.38.249.169)
03:58:36 × aplainzetakind quits (~johndoe@captainludd.powered.by.lunarbnc.net) (Quit: Free ZNC ~ Powered by LunarBNC: https://LunarBNC.net)
03:58:48 × hongminhee quits (sid295@id-295.tinside.irccloud.com) (Ping timeout: 256 seconds)
04:01:19 geekosaur joins (~geekosaur@xmonad/geekosaur)
04:02:05 hongminhee joins (sid295@tinside.irccloud.com)
04:02:12 × markpythonicbtc quits (~textual@2601:647:5a00:35:24b0:1b1:4e8f:2ae0) (Quit: My MacBook has gone to sleep. ZZZzzz…)
04:03:01 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 250 seconds)
04:04:40 mikoto-c1 joins (~mikoto-ch@83.137.2.244)
04:07:10 dyeplexer joins (~dyeplexer@user/dyeplexer)
04:08:41 aplainzetakind joins (~johndoe@captainludd.powered.by.lunarbnc.net)
04:09:38 × aplainzetakind quits (~johndoe@captainludd.powered.by.lunarbnc.net) (Client Quit)
04:10:06 aplainzetakind joins (~johndoe@captainludd.powered.by.lunarbnc.net)
04:11:48 × aplainzetakind quits (~johndoe@captainludd.powered.by.lunarbnc.net) (Client Quit)
04:16:10 × typetetris quits (sid275937@tinside.irccloud.com) (Ping timeout: 240 seconds)
04:16:53 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 250 seconds)
04:17:27 azeem joins (~azeem@176.201.38.112)
04:19:39 markpythonicbtc joins (~textual@c-24-6-12-87.hsd1.ca.comcast.net)
04:21:03 typetetris joins (sid275937@tinside.irccloud.com)
04:24:47 × mikoto-c1 quits (~mikoto-ch@83.137.2.244) (Ping timeout: 240 seconds)
04:25:27 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 240 seconds)
04:26:40 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 240 seconds)
04:27:24 aplainzetakind joins (~johndoe@captainludd.powered.by.lunarbnc.net)
04:27:55 hyiltiz joins (~quassel@31.220.5.250)
04:30:47 azeem joins (~azeem@176.201.38.112)
04:34:06 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 250 seconds)
04:36:47 × nate1 quits (~nate@108-233-125-227.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds)
04:38:27 × renzhi quits (~xp@2607:fa49:6500:3d00::d986) (Ping timeout: 240 seconds)
04:40:19 <jle`> can i hire someone on fiverr to remove all my unused imports
04:40:31 <Axman6> just use hls
04:40:44 <jle`> :o
04:40:52 <Axman6> ... I think
04:41:10 <Axman6> just realised that I may have only done that in DAML... but HLS should also have it
04:41:18 <jle`> i should probably figure out how to actually use/install
04:41:25 <Axman6> which editor?
04:41:48 <jle`> vim
04:42:58 <Axman6> Hmm, I'm sure I've heard of it working in vim
04:43:25 <jle`> hm, i'm not sure exactly what it has to offer, just that people say it's useful
04:43:42 <jle`> what is a gh cup?
04:44:05 hyiltiz joins (~quassel@31.220.5.250)
04:44:20 <Axman6> simplest way to manage the install of multiple GHCs and other tools like cabal, hls etc.
04:44:29 <jle`> oh that seems useful :)
04:44:35 <jle`> maybe i can replace my bash scripts
04:44:38 <Axman6> it has revolutionalised my experience managing GHC installs
04:44:54 × slowButPresent quits (~slowButPr@user/slowbutpresent) (Quit: leaving)
04:44:55 <Axman6> yeah you definitely want to give it a go, and then run `ghcup tui`
04:45:05 × zebrag quits (~chris@user/zebrag) (Remote host closed the connection)
04:45:31 <jle`> ty :)
04:47:30 × roboguy_ quits (~roboguy_@2605:a601:afe7:9f00:80b:4b4e:c456:3347) (Remote host closed the connection)
04:47:48 roboguy_ joins (~roboguy_@2605:a601:afe7:9f00:80b:4b4e:c456:3347)
04:47:54 × roboguy_ quits (~roboguy_@2605:a601:afe7:9f00:80b:4b4e:c456:3347) (Client Quit)
04:49:05 falafel joins (~falafel@72.174.188.210)
04:52:22 × falafel quits (~falafel@72.174.188.210) (Remote host closed the connection)
04:54:03 <Axman6> As for setting up hls with vim, I'm not sure how that's done, but it should be apretty well trodden path by now. hls is pretty bloody amazing these days, and Sandy's tactic based code generation stuff should be a lot of fun to play with. I haven't had the chance yet
04:54:41 falafel joins (~falafel@72.174.188.210)
05:00:58 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 250 seconds)
05:01:42 azeem joins (~azeem@176.201.38.112)
05:05:37 × slack1256 quits (~slack1256@191.125.176.239) (Ping timeout: 248 seconds)
05:09:10 × favonia quits (~favonia@user/favonia) (Ping timeout: 240 seconds)
05:12:37 _ht joins (~quassel@82-169-194-8.biz.kpn.net)
05:21:20 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 250 seconds)
05:21:52 azeem joins (~azeem@176.201.38.112)
05:28:04 favonia joins (~favonia@user/favonia)
05:28:07 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 240 seconds)
05:29:08 azeem joins (~azeem@176.201.38.112)
05:33:37 reumeth joins (~reumeth@user/reumeth)
05:35:45 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 250 seconds)
05:38:34 azeem joins (~azeem@176.201.38.112)
05:41:22 <Guest372> what is CPS used for?
05:43:07 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
05:45:20 mei joins (~mei@user/mei)
05:48:37 <int-e> Control flow.
05:48:53 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
05:49:32 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
05:51:24 × reumeth quits (~reumeth@user/reumeth) (Quit: reumeth)
05:52:24 <Axman6> sometimes performance
05:52:34 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
05:53:52 slack1256 joins (~slack1256@191.125.26.192)
05:54:09 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 248 seconds)
05:54:49 × falafel quits (~falafel@72.174.188.210) (Ping timeout: 252 seconds)
05:55:18 falafel joins (~falafel@72.174.188.210)
05:59:57 × slack1256 quits (~slack1256@191.125.26.192) (Remote host closed the connection)
06:00:36 qbt joins (~edun@user/edun)
06:00:53 <Guest372> simple example for control fow?
06:04:21 × falafel quits (~falafel@72.174.188.210) (Ping timeout: 250 seconds)
06:06:37 jakalx parts (~jakalx@base.jakalx.net) ()
06:08:10 jakalx joins (~jakalx@base.jakalx.net)
06:14:45 lortabac joins (~lortabac@62.98.0.240)
06:16:57 falafel joins (~falafel@72.174.188.210)
06:19:34 × _ht quits (~quassel@82-169-194-8.biz.kpn.net) (Remote host closed the connection)
06:19:45 × azeem quits (~azeem@176.201.38.112) (Ping timeout: 248 seconds)
06:20:22 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
06:20:46 × Lycurgus quits (~juan@cpe-45-46-140-49.buffalo.res.rr.com) (Quit: Exeunt)
06:20:49 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Ping timeout: 250 seconds)
06:20:50 <aegon> Guest372: https://www.haskellforall.com/2012/12/the-continuation-monad.html
06:23:01 azeem joins (~azeem@176.201.20.14)
06:23:25 <aegon> Guest372: actually i think i remember this being easier to grok https://www.hacklewayne.com/callcc-in-haskell-and-my-ultimate-monad
06:23:27 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
06:24:19 × sjb0 quits (~stephen@1.145.57.172) (Read error: Connection reset by peer)
06:24:51 × falafel quits (~falafel@72.174.188.210) (Remote host closed the connection)
06:24:57 <aegon> afaik the performance case that Axman is talking about is a side effect of it being able to short circuit further computation when something goes wrong. With something like the Maybe monad, even though Nothing <> _ = Nothing it will still evaluate the entire logic chain. With ContT you can early out and skip the no-ops at runtime
06:25:03 <aegon> Guest372: ^
06:25:15 falafel joins (~falafel@72.174.188.210)
06:25:54 <int-e> since we're filling an empty question with contents... there's also the codensity business, e.g. http://comonad.com/reader/2011/free-monads-for-less/
06:26:53 × cheater quits (~Username@user/cheater) (Ping timeout: 250 seconds)
06:27:31 <int-e> (the problem is that there's more to CPS than the continuation monad, but no context was provided)
06:28:07 <aegon> yeah, callbacks are continuations right?
06:28:11 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 250 seconds)
06:28:15 <aegon> or am i mixed up
06:28:50 <int-e> it also has a low-level manifestation which sits at the core of GHC's runtime model
06:28:52 gehmehgeh joins (~user@user/gehmehgeh)
06:29:27 <int-e> where it replaces what would otherwise be a control stack
06:29:57 × falafel quits (~falafel@72.174.188.210) (Read error: Connection reset by peer)
06:30:11 falafel joins (~falafel@72.174.188.210)
06:30:49 <Guest372> ok
06:31:12 Gurkenglas joins (~Gurkengla@dslb-088-064-053-140.088.064.pools.vodafone-ip.de)
06:34:51 × falafel quits (~falafel@72.174.188.210) (Read error: Connection reset by peer)
06:35:04 falafel joins (~falafel@72.174.188.210)
06:37:17 × favonia quits (~favonia@user/favonia) (Ping timeout: 250 seconds)
06:38:32 × tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
06:39:27 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:41:40 × falafel quits (~falafel@72.174.188.210) (Ping timeout: 240 seconds)
06:42:36 sjb0 joins (~stephen@1.145.117.250)
06:42:37 cheater joins (~Username@user/cheater)
06:43:47 × NinjaTrappeur quits (~ninja@user/ninjatrappeur) (Ping timeout: 240 seconds)
06:44:19 NinjaTrappeur joins (~ninja@user/ninjatrappeur)
06:46:35 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
06:49:00 fendor joins (~fendor@178.165.207.147.wireless.dyn.drei.com)
06:49:25 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
06:52:41 <aegon> hmm, is there a way to derive generic outside of the data declaration?
06:53:12 <tomsmeding> aegon: StandaloneDeriving ?
06:53:46 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
06:56:07 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
06:58:36 <nilof> So, I've been thinking, can you actually embed Tarski's axioms for elementary euclidean geometry in Hindley-Milner type theory?
06:59:13 <nilof> They are written in such a way that they never need to use sets or second order logic, and all of the quantifiers in the (first order logic) axioms seem to just use let-quantifiers
07:03:25 d0ku joins (~d0ku@178.43.56.75.ipv4.supernova.orange.pl)
07:09:06 kenran joins (~kenran@200116b82b180400b489723c692b519e.dip.versatel-1u1.de)
07:11:42 Guest55 joins (~Guest55@182.64.179.3)
07:14:08 lavaman joins (~lavaman@98.38.249.169)
07:14:59 × Skyfire quits (~pyon@user/pyon) (Ping timeout: 250 seconds)
07:15:18 Skyfire joins (~pyon@user/pyon)
07:16:17 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 248 seconds)
07:16:27 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
07:17:14 azeem joins (~azeem@176.201.20.14)
07:18:25 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 252 seconds)
07:19:13 cfricke joins (~cfricke@user/cfricke)
07:23:10 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 240 seconds)
07:23:27 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
07:23:40 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 240 seconds)
07:24:22 azeem joins (~azeem@176.201.20.14)
07:26:36 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
07:26:59 acidjnk joins (~acidjnk@p200300d0c72b9541c8d0619322fc5f47.dip0.t-ipconnect.de)
07:27:32 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
07:31:35 <aegon> tomsmeding: thanks!
07:33:53 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Read error: Connection reset by peer)
07:34:25 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
07:34:37 mikoto-c1 joins (~mikoto-ch@ip-83-134-2-136.dsl.scarlet.be)
07:34:49 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
07:34:53 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
07:35:12 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
07:35:16 vysn joins (~vysn@user/vysn)
07:35:40 × lortabac quits (~lortabac@62.98.0.240) (Read error: Connection reset by peer)
07:35:44 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
07:36:10 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 240 seconds)
07:38:03 azeem joins (~azeem@176.201.20.14)
07:38:23 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
07:39:40 × sjb0 quits (~stephen@1.145.117.250) (Ping timeout: 240 seconds)
07:39:55 lortabac joins (~lortabac@151.73.200.217)
07:43:06 × Vajb quits (~Vajb@hag-jnsbng11-58c3ab-85.dhcp.inet.fi) (Read error: Connection reset by peer)
07:43:17 × Cajun quits (~Cajun@user/cajun) (Quit: Client closed)
07:43:18 Vajb joins (~Vajb@hag-jnsbng11-58c3ab-85.dhcp.inet.fi)
07:44:07 tsmc joins (~tsmc@159.196.170.5)
07:44:40 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 240 seconds)
07:45:23 azeem joins (~azeem@176.201.20.14)
07:45:49 arjun joins (~Srain@user/arjun)
07:46:58 × shriekingnoise quits (~shrieking@186.137.144.80) (Quit: Quit)
07:47:43 × hnOsmium0001 quits (uid453710@id-453710.stonehaven.irccloud.com) (Quit: Connection closed for inactivity)
07:48:27 × bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 240 seconds)
07:49:08 nattiestnate joins (~nate@103.2.146.186)
07:50:27 × mjs2600_ quits (~mjs2600@c-24-91-3-49.hsd1.vt.comcast.net) (Ping timeout: 240 seconds)
07:56:34 sjb0 joins (~stephen@2001:8004:2738:35de:a1a3:a1c1:6e62:ba62)
07:58:44 Ananta-shesha joins (~pjetcetal@128-71-152-79.broadband.corbina.ru)
08:00:26 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
08:01:44 × nattiestnate quits (~nate@103.2.146.186) (Quit: WeeChat 3.2)
08:02:08 amahl joins (~amahl@dsl-jklbng12-54fbca-64.dhcp.inet.fi)
08:05:28 hendursa1 joins (~weechat@user/hendursaga)
08:09:12 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
08:09:21 × hendursaga quits (~weechat@user/hendursaga) (Ping timeout: 276 seconds)
08:09:56 aman joins (~aman@user/aman)
08:11:45 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7) (Remote host closed the connection)
08:13:56 × aegon quits (~mike@174.127.249.180) (Remote host closed the connection)
08:17:39 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
08:17:39 allbery_b joins (~geekosaur@xmonad/geekosaur)
08:17:42 allbery_b is now known as geekosaur
08:18:22 kayprish joins (~kayprish@77.243.29.13)
08:18:40 × xff0x quits (~xff0x@2001:1a81:53dc:be00:b65c:39d2:8f04:a6df) (Ping timeout: 240 seconds)
08:19:30 xff0x joins (~xff0x@2001:1a81:53dc:be00:da3f:ef74:f6f8:c86d)
08:19:38 epolanski joins (uid312403@id-312403.helmsley.irccloud.com)
08:23:56 enoq joins (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7)
08:31:22 burnside_ joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
08:31:22 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
08:32:38 mastarija joins (~mastarija@78-3-210-70.adsl.net.t-com.hr)
08:34:50 <mastarija> What does this warning about extraneous version range for a dependency on "internal" library mean exactly, and how do I get rid of it?
08:34:53 <mastarija> https://paste.tomsmeding.com/Q9wfbZUl
08:35:16 <mastarija> My cabal file: https://paste.tomsmeding.com/6n6fShRZ
08:38:40 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Ping timeout: 240 seconds)
08:39:46 <fendor> mastarija, I think that is a cabal bug and depending on your cabal version, I think not at all
08:40:39 × tsmc quits (~tsmc@159.196.170.5) (Quit: Client closed)
08:40:41 <mastarija> fendor, cool. I suspected it might be, since it showed that same message when I fixed internal library version and it still showed.
08:41:20 nschoe joins (~quassel@178.251.84.79)
08:43:10 × amahl quits (~amahl@dsl-jklbng12-54fbca-64.dhcp.inet.fi) (Ping timeout: 240 seconds)
08:43:48 jtomas joins (~jtomas@233.red-83-34-2.dynamicip.rima-tde.net)
08:44:28 × juhp quits (~juhp@128.106.188.220) (Quit: juhp)
08:44:42 juhp joins (~juhp@128.106.188.220)
08:44:59 Guest|7 joins (~Guest|7@138.229.117.11)
08:45:21 × Guest|7 quits (~Guest|7@138.229.117.11) (Client Quit)
08:47:25 vpan joins (~vilius@212.117.1.172)
08:48:02 <jtomas> Hi, is there a way to write this `f (a, b, c) = W a b c` in a shorter way, without repeating all the parameters one by one?
08:50:30 ubert joins (~Thunderbi@91.141.37.164.wireless.dyn.drei.com)
08:51:50 <Rembane_> jtomas: You need to write a curry3 function first. You could also use lenses, but I doubt it will be any shorter.
08:52:10 × mastarija quits (~mastarija@78-3-210-70.adsl.net.t-com.hr) (Ping timeout: 240 seconds)
08:53:07 <jtomas> thank Rembane_
08:53:12 <jtomas> *thanks
08:53:53 <Rembane_> jtomas: No problem!
08:54:07 × juhp quits (~juhp@128.106.188.220) (Ping timeout: 240 seconds)
08:56:07 timCF joins (~timCF@m91-129-108-244.cust.tele2.ee)
08:56:19 <dminuoso> unsafeCoerce!
08:56:37 dminuoso smiles
08:56:38 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
08:56:39 <Rembane_> dminuoso: What?! Show us! :D
08:56:46 pfurla_ joins (~pfurla@ool-182ed2e2.dyn.optonline.net)
08:56:47 <dminuoso> f = unsafeCoerce
08:56:47 geekosaur joins (~geekosaur@xmonad/geekosaur)
08:56:58 <Rembane_> That is shorter.
08:57:19 <dminuoso> Should I include some warranty or liability notice?
08:57:41 <Rembane_> Isn't it included in the function name?
08:57:46 <dminuoso> I take no responsiblity if, as a result of random crashes, people or kittens die.
08:58:13 <dminuoso> I used to think unsafe was just a boring prefix and I knew better.
08:58:24 <dminuoso> And then unsafePerformIO did things I did not expect it to
08:58:40 <dminuoso> It's quite interesting how wrong ones intuition can be
08:59:03 <Rembane_> That's the thing about intuition right?
08:59:37 × pfurla quits (~pfurla@ool-182ed2e2.dyn.optonline.net) (Ping timeout: 252 seconds)
09:00:54 × Guest55 quits (~Guest55@182.64.179.3) (Quit: Client closed)
09:01:49 × ubert quits (~Thunderbi@91.141.37.164.wireless.dyn.drei.com) (Ping timeout: 252 seconds)
09:01:51 × idf quits (~idf@198.23.223.146) (Quit: ZNC 1.8.2 - https://znc.in)
09:01:52 ubert1 joins (~Thunderbi@91.141.37.164.wireless.dyn.drei.com)
09:01:52 <dminuoso> I reckon, you might be able to `coerce` from (,,) to W though
09:01:56 <dminuoso> jtomas: ^-
09:02:00 idf joins (~idf@198.23.223.146)
09:02:09 <dminuoso> Assuming that `W` takes only 3 arguments at most, of course.
09:02:23 <dminuoso> data W = W Int Char String
09:02:25 <dminuoso> % data W = W Int Char String
09:02:25 <yahb> dminuoso:
09:02:36 × gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving)
09:02:37 <dminuoso> % f :: (Int, Char, String) -> W; f = coerce
09:02:37 <yahb> dminuoso: ; <interactive>:16:36: error:; * Couldn't match representation of type `(Int, Char, String)' with that of `W' arising from a use of `coerce'; * In the expression: coerce; In an equation for `f': f = coerce
09:02:40 <dminuoso> Mmm
09:02:50 <Taneb> It has to be an unsafeCoerce
09:02:54 <dminuoso> Why is that?
09:02:55 × hueso quits (~root@user/hueso) (Ping timeout: 252 seconds)
09:03:11 <Taneb> coerce only works for newtype wrappers, basically
09:03:28 × Megant quits (megant@user/megant) (Ping timeout: 252 seconds)
09:03:29 <dminuoso> Ohh, because W and (,,) have a different representation. Of cours.
09:03:51 hueso joins (~root@user/hueso)
09:03:58 <int-e> Once upon a time, when intuitions worked and accursedUnutterablePerformIO was still called inlinePerformIO...
09:04:10 ubert1 is now known as ubert
09:04:11 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 250 seconds)
09:04:12 <timCF> Hello! I have a question about organization of enterprise Haskell codebase. Once I've learned finally tagless, I always used this as a development pattern in my projects. In most apps there is some implicit environment `Env` used inside of `ReaderT` where stored techincal things like postgres connection pool, which are accessed through different classes for example `Storage`, `ServiceRpc` which are using
09:04:18 <timCF> `Env`, and main application monad `AppM` implements these classes. This way for example it's very easy to "mock" things in tests, just have `TestAppM` and implement these classes differently. This all works fine until some stuff inside `Env` needs to be mutable. At the moment I'm using `MVar` field as a workaround, but thinking maybe `StateT` instead of `ReaderT` will be better and more "pure" solution?
09:04:24 <timCF> But for some reason I have not seen much use of `StateT` in enterprise codebase. What do you think?
09:04:59 Megant joins (megant@user/megant)
09:05:13 <dminuoso> timCF: I generally prefer IORef/MVar/etc in the environment, because it lets me avoid things like MonadBaseControl.
09:05:29 <dminuoso> With just a ReaderT/LoggingT based stack, you get free access to MonadUnliftIO
09:06:02 <dminuoso> StateT has so many unexpected nuances with respect to exceptions if you ever need to unlift something (e.g. as with `bracket`)
09:07:59 <dminuoso> int-e: Heh, the best comment regarding accursedUnutterablePerformIO is the first one here: https://web.archive.org/web/20200111052206/https://www.reddit.com/r/haskell/comments/2cbgpz/flee_traveller_flee_or_you_will_be_corrupted_and/
09:09:25 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
09:09:46 <timCF> dminuoso: yeah, I'm unlifting a lot, because most of the libraries are using just IO, and if IO appears in negative position - it's game over without unlifting.
09:12:10 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7)
09:12:26 Guest55 joins (~Guest55@182.64.179.3)
09:15:49 jakalx joins (~jakalx@base.jakalx.net)
09:16:40 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7) (Ping timeout: 240 seconds)
09:16:47 hegstal joins (~hegstal@2a02:c7f:7604:8a00:16d:5419:a8cf:3833)
09:19:02 retroid_ joins (~retro@5ec19a54.skybroadband.com)
09:21:31 × retro_ quits (~retro@5ec19a54.skybroadband.com) (Ping timeout: 258 seconds)
09:22:55 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
09:24:24 oxide joins (~lambda@user/oxide)
09:26:01 gehmehgeh joins (~user@user/gehmehgeh)
09:33:07 × Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 240 seconds)
09:34:25 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 248 seconds)
09:35:13 azeem joins (~azeem@176.201.20.14)
09:35:47 Katarushisu joins (~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net)
09:41:26 × lortabac quits (~lortabac@151.73.200.217) (Read error: Connection reset by peer)
09:42:02 lortabac joins (~lortabac@151.70.200.251)
09:42:19 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Ping timeout: 250 seconds)
09:45:58 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
09:50:57 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 248 seconds)
09:52:41 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
09:55:22 <Guest55> I have a function `next:: (Int, Hashtable s k v) -> ST s (Int, Hashtable s k v)` I want to do something like `(!! 10) $ iterate (>>= next) (1,mybook)` where `mybook :: Hashtable s k v` (this is inside a `do` block). But this gives me an error saying `type variable s would escape its scope`. Why is this happening?
09:57:15 × burnside_ quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Remote host closed the connection)
09:58:48 <Guest55> Umm I made an error in the question. Ignore the question, sorry
10:06:10 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 252 seconds)
10:06:45 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
10:07:10 × Kaiepi quits (~Kaiepi@156.34.44.192) (Ping timeout: 240 seconds)
10:07:24 azeem joins (~azeem@176.201.20.14)
10:11:08 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
10:12:32 pfurla joins (~pfurla@ool-182ed2e2.dyn.optonline.net)
10:13:54 zer0bitz joins (~zer0bitz@dsl-hkibng31-58c384-213.dhcp.inet.fi)
10:15:25 × hendursa1 quits (~weechat@user/hendursaga) (Remote host closed the connection)
10:15:31 × pfurla_ quits (~pfurla@ool-182ed2e2.dyn.optonline.net) (Ping timeout: 252 seconds)
10:15:48 hendursa1 joins (~weechat@user/hendursaga)
10:18:50 <siers> Ollie[m], I didn't get to the :~: part yet, but it's a very nice paper in other regards as well, thanks!
10:19:03 <Gurkenglas> absurd (error "asd") prints asd, but hasnt absurd no pattern match?
10:19:22 × kayprish quits (~kayprish@77.243.29.13) (Remote host closed the connection)
10:20:05 <Gurkenglas> (I tried to ghci debug, but :set -fbreak-on-exception into :trace absurd (error "asd") into :back into :list just recommends the same rerun o.o
10:20:42 <Guest55> I have an inf list `[ST s (Int, Int)]` I want to extract the first element of this list that satisfies a condition. I initially tried using `sequence` and then `head . dropWhile` but sequence does not work with infinite lists I guess. What are the alternatives?
10:20:57 <Ollie[m]> siers: Good stuff! All Richard's papers are worth a read, probably!
10:24:01 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
10:26:27 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
10:28:10 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
10:30:21 __monty__ joins (~toonn@user/toonn)
10:32:14 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
10:32:34 Kaiepi joins (~Kaiepi@156.34.44.192)
10:36:27 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 240 seconds)
10:37:58 × oxide quits (~lambda@user/oxide) (Quit: oxide)
10:39:07 × kenran quits (~kenran@200116b82b180400b489723c692b519e.dip.versatel-1u1.de) (Quit: WeeChat info:version)
10:40:05 jippiedoe joins (~david@2a02-a44c-e14e-1-3bcd-b242-4a98-4bde.fixed6.kpn.net)
10:41:28 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
10:42:12 sciencentistguy joins (~sciencent@hacksoc/ordinary-member)
10:45:46 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
10:47:42 × vysn quits (~vysn@user/vysn) (Quit: WeeChat 3.2)
10:49:00 mastarija joins (~mastarija@78-3-210-70.adsl.net.t-com.hr)
10:49:00 pfurla_ joins (~pfurla@53.15.195.173.client.static.strong-in52.as13926.net)
10:51:40 × pfurla quits (~pfurla@ool-182ed2e2.dyn.optonline.net) (Ping timeout: 240 seconds)
10:51:56 <Gurkenglas> Ahh, absurd does pattern match its argument; this simply means that the argument is reduced to WHNF and then the result is fully matched against all patterns. Shouldn't https://hackage.haskell.org/package/base-4.15.0.0/docs/src/Data-Void.html#absurd without the `absurd a = case a of {}` line not throw the "lacks an accompanying binding" error because all patterns are matched :)?
10:54:28 kuribas joins (~user@ptr-25vy0i9k5kxqroisf0f.18120a2.ip6.access.telenet.be)
10:54:57 × stiell quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
10:55:24 trcc joins (~trcc@users-1190.st.net.au.dk)
10:55:30 stiell joins (~stiell@gateway/tor-sasl/stiell)
10:56:28 <kuribas> is http://dev.stephendiehl.com/ down?
10:56:45 <kuribas> Or better question, is Stephen Diehl down?
10:57:31 <Guest55> https://www.stephendiehl.com/ is working fine for me
10:57:39 <Guest55> dev is not
10:57:53 <kuribas> right, so google is showing me the wrong link?
10:58:08 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
10:58:25 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Ping timeout: 252 seconds)
10:58:50 <kuribas> erm, it just got up :)
10:59:07 × martin02 quits (~silas@2001:4ca0:0:fe00:0:5efe:a96:1bc1) (Ping timeout: 240 seconds)
11:01:00 alx741 joins (~alx741@181.196.68.187)
11:03:42 × jonathanx quits (~jonathan@dyn-8-sc.cdg.chalmers.se) (Remote host closed the connection)
11:03:59 jonathanx joins (~jonathan@dyn-8-sc.cdg.chalmers.se)
11:04:10 × jippiedoe quits (~david@2a02-a44c-e14e-1-3bcd-b242-4a98-4bde.fixed6.kpn.net) (Ping timeout: 240 seconds)
11:06:59 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:07:33 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
11:09:17 AlexNoo_ joins (~AlexNoo@94.233.240.82)
11:09:35 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
11:10:58 <trcc> I am trying to develop my first haskell library, and I am getting in a bit over my head. It concerns using the Writer Monad and wrapping it in IO. https://paste.tomsmeding.com/TiBDgd9f maybe someone has a minute to help me :)
11:11:09 × AlexZenon quits (~alzenon@178.34.150.125) (Ping timeout: 250 seconds)
11:11:35 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 250 seconds)
11:11:45 <dminuoso> % :t writer
11:11:45 <yahb> dminuoso: MonadWriter w m => (a, w) -> m a
11:12:13 <dminuoso> trcc: What's the type of `doStepResult`?
11:12:26 AlexZenon joins (~alzenon@94.233.240.82)
11:12:33 × Alex_test quits (~al_test@178.34.150.125) (Ping timeout: 248 seconds)
11:12:34 <dminuoso> Oh hold on, I mixed up left and right here.
11:12:38 <trcc> https://paste.tomsmeding.com/TiBDgd9f
11:12:39 <trcc> sorry
11:12:43 × AlexNoo quits (~AlexNoo@178.34.150.125) (Ping timeout: 252 seconds)
11:12:44 AlexNoo_ is now known as AlexNoo
11:12:46 <trcc> I though it did not matter
11:12:56 <trcc> dminuoso: data DoStepResult x = DoStepResult {dsrStatus :: Status, dsrSvs :: SVs, dsrState :: UserState x }
11:13:15 Alex_test joins (~al_test@94.233.240.82)
11:13:32 <dminuoso> This all looks a bit weird, let me look at it again
11:13:47 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7)
11:14:46 <trcc> hehe I am not surprised by that
11:15:44 lavaman joins (~lavaman@98.38.249.169)
11:16:01 <trcc> dminuoso: the actual source is here: https://github.com/HFMU/ex_water-tank/blob/master/src/FMU.hs and related HaskellFMU is here: https://github.com/HFMU/HaskellFmu if it helps...
11:17:03 <dminuoso> What's the point of `output` here?
11:17:24 <dminuoso> Also, you seem to have a monad confusion going on here.
11:17:36 <trcc> dminuoso: The oerall idea is that I want to "EASILY" append to a list of log messages. So the idea of output is just to append log messages to the list of logentries
11:17:45 <trcc> Based on this originally https://kseo.github.io/posts/2017-01-21-writer-monad.html
11:17:59 <dminuoso> First off, generally `Writer` monad is a code smell already.
11:18:17 <dminuoso> For logging output, something like LoggingT (or other solutions) is a better fit.
11:18:24 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7) (Ping timeout: 250 seconds)
11:18:34 <trcc> the messages are later to be outputtet via a function pointer
11:18:35 <dminuoso> So before I address this further, do you do this to explore Writer, or is your need just to have logging?
11:19:15 <trcc> The doStep function is called from within a library. Once it finishes, the library outputs each log message via a function pointer
11:19:29 <trcc> The doStep function is called from within a library. Once it finishes, the library outputs each log message *in [T.LogEntry]* via a function pointer
11:19:32 <dminuoso> I dont know what you mean by function pointer.
11:19:45 <trcc> ia ctually mean a C function pointer
11:20:09 <dminuoso> So one quirky thing is that you're not using `WriterT`
11:20:16 <dminuoso> And there's several other quirks here.
11:20:25 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 252 seconds)
11:20:26 <dminuoso> But really, I'd just drop `WriterT` and use `LoggingT`
11:20:40 <dminuoso> You can feed your log into a C foreign library via LoggingT too
11:21:40 <trcc> Okay, I will try and see if I can figure this part out
11:21:48 <trcc> thank you
11:21:57 <Guest55> I'm applying a function over and over inside state. Doing it manually (line 8 - 11) gives a different result from doing it using `iterate` (line 7). What is happening? https://paste.tomsmeding.com/RxaaJ0nB I'd guess it has something to do with updation of the HashTable, but I'm not sure
11:32:24 <int-e> Guest55: the iterate thing does return (3,6) >>= next mybook, then return (3,6) >>= next mybook >>= next mybook, ... so 15 `>>= next mybook` in total...
11:33:30 <trcc> hehe dminuoso I found a way: although 16 -> 20 is not pretty: https://paste.tomsmeding.com/fgHaFy76
11:33:49 <Guest55> int-e why 15
11:33:57 <int-e> Guest55: 1+2+3+4+5 = 15
11:34:16 <dminuoso> trcc: At the very least use WriterT.
11:34:20 <int-e> gioh the 5 is too much, so it's 10, my bad
11:34:26 <dminuoso> Instead of manually using Writer and IO.
11:34:37 <dminuoso> trcc: But really, at the end, use LoggingT.
11:34:54 pfurla joins (~pfurla@ool-182ed2e2.dyn.optonline.net)
11:34:55 <Guest55> oh.... I thought iterate reused the previous output
11:34:56 <dminuoso> Writer has a way of stabbing you in the back in terms of space leaks.
11:35:02 <trcc> dminuoso: ya, I will try and switch it alter on. But it is a big thing, and I would like to see it working first.. I will try with writerT some time
11:35:06 × enoq quits (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) (Quit: enoq)
11:35:52 <Drew[m]> dminuoso: umm isn't Control.Monad.Trans.Writer.CPS a fix for that?
11:36:28 <Drew[m]> trcc: are you using Control.Monad.Trans.Writer.CPS as your source of `Writer`?
11:36:42 <int-e> Guest55: yes, but it's only building monadic actions here, not running them
11:37:01 <trcc> Drew[m]: no, I never heard of that before
11:37:10 <dminuoso> Drew[m]: Maybe yeah, but you still accumulate a log.
11:37:15 <dminuoso> Unnecessarily
11:37:29 <Guest55> int-e but it's running it only 4 times in total?
11:37:40 × pfurla_ quits (~pfurla@53.15.195.173.client.static.strong-in52.as13926.net) (Ping timeout: 240 seconds)
11:37:57 <dminuoso> With LoggingT you never keep anything around, as it's essentially just some pretty wrapper around (in simplified terms) `ReaderT (String -> IO ()) ...`. There's nothing to "append" to a log.
11:38:17 <dminuoso> With Writer you have the additional problem of unlifting and working with bracket.
11:38:27 <dminuoso> You just get headaches
11:38:38 juhp joins (~juhp@bb116-14-48-29.singnet.com.sg)
11:38:45 <int-e> Guest55: the argument to `sequence` is [return (3,6), return (3,6) >>= next mybook, return (3,6) >>= next mybook >>= next mybook, ...]
11:38:46 × juhp quits (~juhp@bb116-14-48-29.singnet.com.sg) (Read error: Connection reset by peer)
11:38:54 <trcc> Thanks dminuoso and Drew[m]
11:38:58 <trcc> got some input for later :)
11:39:32 <int-e> Guest55: and sequence runs each of these actions, with 0, 1, 2, 3, and finally 4 calls to `next mybook`.
11:39:42 <Guest55> ohhh.... I get it. So when it evaluates, it does not use the previous values, it recomputes from start
11:40:04 <Guest55> So how can I change this behavior?
11:40:18 juhp_ joins (~juhp@bb116-14-48-29.singnet.com.sg)
11:41:00 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:42:24 machinedgod joins (~machinedg@135-23-192-217.cpe.pppoe.ca)
11:43:00 <int-e> Guest55: you can't use iterate+sequence to accomplish this; I'd write a manual recursion. (but there's bound to be a library that has a monadic version of unfoldr that abstracts from this)
11:43:06 jippiedoe joins (~david@2a02-a44c-e14e-1-ff47-c45c-287d-42e8.fixed6.kpn.net)
11:43:38 <Guest55> great! Thanks int-e
11:43:39 <int-e> Guest55: I'm assuming you want to capture the intermediate results
11:44:00 × trcc quits (~trcc@users-1190.st.net.au.dk) ()
11:44:04 <Guest55> I want to find the first result that satisfies a condition
11:44:21 burnside_ joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:44:25 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:44:37 × neo1 quits (~neo3@cpe-292712.ip.primehome.com) (Ping timeout: 252 seconds)
11:44:37 <Guest55> I'll write a recursion myself, thanks again!
11:46:39 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:46:39 × burnside_ quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:46:42 egoist joins (~egoist@186.235.82.117)
11:46:54 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:47:09 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:47:13 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:47:31 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:47:46 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:47:59 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:48:37 burnside_ joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:48:37 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:49:45 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:49:45 × burnside_ quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:52:39 lua joins (~ed@101.100.135.46)
11:54:15 burnside_ joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
11:54:15 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Read error: Connection reset by peer)
11:57:08 oxide joins (~lambda@user/oxide)
11:58:40 × markpythonicbtc quits (~textual@c-24-6-12-87.hsd1.ca.comcast.net) (Quit: My MacBook has gone to sleep. ZZZzzz…)
12:02:57 Codaraxis_ joins (~Codaraxis@user/codaraxis)
12:03:09 × xff0x quits (~xff0x@2001:1a81:53dc:be00:da3f:ef74:f6f8:c86d) (Ping timeout: 250 seconds)
12:04:13 xff0x joins (~xff0x@2001:1a81:53dc:be00:a2ac:ecf7:da22:1207)
12:06:40 × Codaraxis__ quits (~Codaraxis@user/codaraxis) (Ping timeout: 240 seconds)
12:09:14 <Drew[m]> dminuoso: There's no reason to accumulate a log, from what I can tell. You can consume it piecewise so it is garbage collected as you go
12:11:01 <Drew[m]> I wrote a little demo to convince myself the log was still produced lazily
12:11:11 acidjnk_new joins (~acidjnk@p200300d0c72b95925da55fe159cc0756.dip0.t-ipconnect.de)
12:11:27 <Drew[m]> https://paste.tomsmeding.com/gOFJYdLg
12:12:03 <dminuoso> Drew[m]: And you need MonadBaseControl for unlifting. What about log entries produced in `catch`?
12:12:36 <dminuoso> Drew[m]: And that doesnt prove something.
12:13:00 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
12:13:02 <dminuoso> lazily producing is something different from streaming
12:13:15 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
12:13:17 <Gurkenglas> They say you can't have ((a -> Void) -> Void) -> a. But you can do ((a -> Void) -> Void) -> IO a by catch . ($throw). Does this unlock great powers? :)
12:13:17 allbery_b joins (~geekosaur@xmonad/geekosaur)
12:13:20 allbery_b is now known as geekosaur
12:13:30 <dminuoso> Using lazyness to stream logs, while perhaps it can work, it's just not worth the headaches you get in debugging when it doesnt work
12:14:01 <dminuoso> With LoggingT you *know* you have no space leaks, and that logging happens *exactly* when you want it.
12:14:07 <dminuoso> With WriterT you have no clue when logging actually happens.
12:14:25 × acidjnk quits (~acidjnk@p200300d0c72b9541c8d0619322fc5f47.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
12:14:38 <dminuoso> It happens separate, later.
12:14:49 <dminuoso> WriterT is just not a good fit for logs for so many reasons.
12:15:21 Ananta-shesha is now known as ArcticVaultETMar
12:15:38 ArcticVaultETMar is now known as ArcticVauETMarsH
12:15:38 <dminuoso> Consider something like:
12:15:48 ArcticVauETMarsH is now known as ArcticVauMarsHel
12:15:51 ArcticVauMarsHel is now known as ArcticVauMarsHPJ
12:16:03 ArcticVauMarsHPJ is now known as ArctVaultMarsHMP
12:16:33 ArctVaultMarsHMP is now known as ArctVaulMarsHMPJ
12:16:49 <dminuoso> `tell "Deleting file" >> deleteFile "someFile"`
12:17:04 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 252 seconds)
12:17:23 <dminuoso> When will the outside consumer of this log pop that entry? You dont know and cant control it.
12:18:52 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
12:23:18 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:23:37 slowButPresent joins (~slowButPr@user/slowbutpresent)
12:27:26 chisui joins (~chisui@200116b868a14e009fa6896fe3af5cba.dip.versatel-1u1.de)
12:28:49 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 248 seconds)
12:28:54 markpythonicbtc joins (~textual@50.228.44.6)
12:30:10 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 240 seconds)
12:31:27 neo1 joins (~neo3@cpe-292712.ip.primehome.com)
12:31:40 × mastarija quits (~mastarija@78-3-210-70.adsl.net.t-com.hr) (Ping timeout: 240 seconds)
12:32:25 hyiltiz joins (~quassel@31.220.5.250)
12:38:35 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
12:38:49 favonia joins (~favonia@user/favonia)
12:38:56 <Drew[m]> fair
12:44:45 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
12:45:52 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 245 seconds)
12:46:42 renzhi joins (~xp@2607:fa49:6500:3d00::d986)
12:47:47 azeem joins (~azeem@176.201.20.14)
12:49:52 shriekingnoise joins (~shrieking@186.137.144.80)
12:57:38 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 250 seconds)
12:59:07 × aman quits (~aman@user/aman) (Ping timeout: 240 seconds)
12:59:27 × cheater quits (~Username@user/cheater) (Ping timeout: 240 seconds)
13:03:58 × derelict quits (~derelict@user/derelict) (Quit: WeeChat 3.2)
13:05:45 × Codaraxis_ quits (~Codaraxis@user/codaraxis) (Remote host closed the connection)
13:06:10 Codaraxis_ joins (~Codaraxis@user/codaraxis)
13:08:08 × burnside_ quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Remote host closed the connection)
13:09:16 cheater joins (~Username@user/cheater)
13:09:53 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
13:10:09 × nschoe quits (~quassel@178.251.84.79) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
13:12:02 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Remote host closed the connection)
13:15:32 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7)
13:16:13 × lua quits (~ed@101.100.135.46) (Quit: WeeChat 2.8)
13:19:40 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:c1b3:f9cf:5870:faa7) (Ping timeout: 240 seconds)
13:21:32 × Guest55 quits (~Guest55@182.64.179.3) (Quit: Client closed)
13:22:09 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
13:22:31 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Remote host closed the connection)
13:22:57 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
13:27:02 × FragByte quits (~christian@user/fragbyte) (Quit: Quit)
13:27:10 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 240 seconds)
13:28:52 FragByte joins (~christian@user/fragbyte)
13:29:07 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 240 seconds)
13:29:54 azeem joins (~azeem@176.201.20.14)
13:30:22 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
13:32:39 × t3hyoshi quits (~snicf@2600:8804:1b96:4900:a9b2:143c:7dd0:6ceb) (Quit: Konversation terminated!)
13:33:35 Sgeo joins (~Sgeo@user/sgeo)
13:34:22 hololeap joins (~hololeap@user/hololeap)
13:37:51 Neuromancer joins (~Neuromanc@user/neuromancer)
13:38:22 × haykam quits (~haykam@static.100.2.21.65.clients.your-server.de) (Remote host closed the connection)
13:38:35 haykam joins (~haykam@static.100.2.21.65.clients.your-server.de)
13:44:01 × qbt quits (~edun@user/edun) (Ping timeout: 248 seconds)
13:45:50 <kuribas> When do you use a list comprehension, instead of list monad?
13:46:06 <kuribas> maybe to avoid the extra "pure"?
13:46:24 <Hecate> kuribas: list comprehensions are implemented with list monad
13:47:02 <dminuoso> kuribas: Mmm, hard to say.
13:47:13 <dminuoso> I tend to prefer do-notation actually
13:47:32 <kuribas> then it's mostly redundant syntactic sugar?
13:49:01 <[exa]> kuribas: list comprehension removes `guard`, do-syntax is better if there's more conditions or complicated return that's best "explained" at the end instead of at the beginning
13:49:18 <dminuoso> [exa]: they dont remove guard.
13:49:27 Guest48 joins (~Guest48@2606:54c0:5bc0:8::49:64)
13:49:31 dhouthoo joins (~dhouthoo@178-117-36-167.access.telenet.be)
13:49:44 <[exa]> well you don't need to type `guard` in there right?
13:49:52 <dminuoso> % [ x | x <- [1,2,3], x > 2 ]
13:49:53 <yahb> dminuoso: [3]
13:49:58 <dminuoso> @undo [ x | x <- [1,2,3], x > 2 ]
13:49:58 <lambdabot> concatMap (\ x -> if x > 2 then [x] else []) [1, 2, 3]
13:50:01 <Hecate> kuribas: is it redundant if it improves readability? ;)
13:50:08 <dminuoso> Mmm, well.
13:50:10 <dminuoso> This is just guard.
13:50:14 <[exa]> dminuoso: yeah
13:50:19 <kuribas> Hecate: no, but it's debatable...
13:50:45 × Guest48 quits (~Guest48@2606:54c0:5bc0:8::49:64) (Quit: Client closed)
13:50:48 <[exa]> kuribas: one difference is that with `do` syntax you might get a Monad constraint with polymorphic type, which in cases might not be the way you want
13:51:06 <[exa]> ie when relying on memoization
13:51:32 <[exa]> (s/ie/eg/ whoops)
13:52:13 × ArctVaulMarsHMPJ quits (~pjetcetal@128-71-152-79.broadband.corbina.ru) (Quit: EXIT)
13:52:14 <kuribas> [exa]: how so?
13:52:49 <[exa]> if you don't explicitly bind a list, the monad type may stay undecided
13:53:13 <kuribas> hmm, right
13:53:45 <kuribas> perhaps do notation came after comprehensions?
13:54:32 <Drew[m]> Comprehensions predate the whole language IIRC
13:54:49 <[exa]> not sure but likely, given the original haskell had lazy lists for IO
13:55:06 <kuribas> if you think of set notation as comprehensions...
13:55:08 <dminuoso> at the end, list comprehensions are just an adaption of set builder syntax in math
13:55:31 <dminuoso> If you squint a bit, <- even looks similar to ∈
13:55:44 <[exa]> kuribas: also check out MonadComprehensions
13:56:07 × arjun quits (~Srain@user/arjun) (Ping timeout: 240 seconds)
13:56:17 <[exa]> isn't there any SQL package that would build SQL queries from this?
13:56:41 fendor_ joins (~fendor@77.119.210.198.wireless.dyn.drei.com)
13:56:52 <Rembane_> Sounds a bit like Selda.
13:57:33 <[exa]> we actually used selda, but never reached that far
13:57:38 <kuribas> [exa]: my query builder is a monad, so it would work with monad comprehensions :)
13:58:17 <[exa]> good, good, more set notation! (*laughs in godel numerals*)
13:58:21 <Hecate> https://github.com/tchoutri/pg-entity <- my query builder is a bit simpler
13:59:10 × fendor quits (~fendor@178.165.207.147.wireless.dyn.drei.com) (Ping timeout: 240 seconds)
13:59:39 <Drew[m]> kuribas: You don't even need to go back to set builder notation. Miranda had list comprehensions, and Haskell was heavily inspired by that.
14:00:35 <kuribas> [exa]: I cannot see much reason motivate using monad comprehensions.
14:00:40 mastarija joins (~mastarija@78-3-210-70.adsl.net.t-com.hr)
14:00:45 <kuribas> Hecate: you query builder is just SQL :)
14:00:57 <kuribas> Hecate: but then, does it compose?
14:01:29 <kuribas> Hecate: "It is my personal belief, firmly rooted in experience, that we should not aim to produce statically-checked SQL and have it "verified" by the compiler. "
14:01:34 <kuribas> Hecate: I very much agree :)
14:01:43 <Hecate> :)
14:02:34 <Hecate> you can't arbitrarily compose it, because it's made for capturing wider patterns, rather than spewing SQL from an eDSL
14:02:37 <Hecate> :D
14:02:46 <Hecate> (which makes it simpler to develop and test)
14:02:52 <[exa]> kuribas: what about: [(userID x, tweet x) | x <- tweets, y <- friendsOf user, userId x `in` userId y]
14:03:13 <kuribas> Hecate: I find being able to type check the types of columns and table very useful though.
14:04:35 <kuribas> [exa]: do x <- tweets; y <- friendsOf user; guard $ userId x `in` userId y; pure (userID x, tweet x)
14:05:13 <[exa]> kuribas: yeah ofcourse, but reads less like SELECT ... FROM ... WHERE ...
14:05:25 <kuribas> ah right...
14:05:31 <[exa]> not that it would be wrong tho
14:07:07 <kuribas> doesn't f# has this kind of syntax?
14:07:12 <kuribas> or C# even...
14:08:06 <kuribas> ah f# has query expressions, C# linq
14:09:23 <kuribas> https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/query-expressions
14:13:28 × zaquest quits (~notzaques@5.128.210.178) (Remote host closed the connection)
14:13:40 × azeem quits (~azeem@176.201.20.14) (Ping timeout: 252 seconds)
14:16:30 zaquest joins (~notzaques@5.128.210.178)
14:16:58 × vpan quits (~vilius@212.117.1.172) (Ping timeout: 252 seconds)
14:18:27 <hololeap> shouldn't this short-circuit when i==6 ? foldMap (\i -> if i > 5 then Just (First i) else Nothing) [0..]
14:18:35 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
14:20:10 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
14:20:10 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
14:20:10 wroathe joins (~wroathe@user/wroathe)
14:20:23 <janus> > foldMap (\i -> if i > 5 then Just (First i) else Nothing) [0..]
14:20:25 <lambdabot> error:
14:20:25 <lambdabot> Ambiguous occurrence ‘First’
14:20:25 <lambdabot> It could refer to
14:20:31 <[exa]> hololeap: you seem to imply that all numbers that come after 5 are larger than 5
14:20:35 <[exa]> :]
14:21:12 <int-e> > First 1
14:21:13 <hololeap> [exa]: it's more that I expected First to short-circuit it somehow when it hits its first `Just (First Int)` result
14:21:14 <lambdabot> error:
14:21:14 <lambdabot> • No instance for (Num (Maybe ())) arising from a use of ‘e_11’
14:21:14 <lambdabot> • In the expression: e_11
14:21:14 <janus> aaah
14:21:20 <janus> so you'd need to map first in first ?
14:21:22 <int-e> > First (Just 1)
14:21:23 <lambdabot> First {getFirst = Just 1}
14:21:27 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 240 seconds)
14:21:35 <hololeap> (this is Data.Semigroup.First, btw)
14:21:37 <[exa]> hololeap: ah so I see that now
14:21:40 <janus> then foldMap wouldn't need to know about monotonic properties of the sequence
14:21:41 <kuribas> :t First
14:21:42 <lambdabot> Maybe a -> First a
14:22:04 <kuribas> > foldMap (\i -> if i > 5 then Just (First i) else Nothing) [0::Int..]
14:22:06 <lambdabot> <hint>:1:63: error: Operator applied to too few arguments: Int..
14:22:14 martin02 joins (~silas@141.84.69.76)
14:22:28 <kuribas> Looks like a type error...
14:22:34 <hololeap> % f = foldMap (\i -> if i > 5 then Just (Data.Semigroup.First i) else Nothing)
14:22:36 <yahb> hololeap:
14:22:41 <hololeap> % :t f
14:22:41 <yahb> hololeap: (Foldable t, Ord a, Num a) => t a -> Maybe (Data.Semigroup.First a)
14:22:49 <hololeap> % f [0..]
14:22:52 <yahb> hololeap: *** Exception: heap overflow
14:23:07 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 250 seconds)
14:23:13 <janus> % f [0..10]
14:23:15 <yahb> janus: Just (First {getFirst = 6})
14:23:48 <geekosaur> beware of that, "Int.." is parsed as operator (.) in module Int
14:24:08 <kuribas> > foldMap (\i -> if i > 5 then Just (Data.Semigroup.First i) else Nothing) [0::Expr .. 6]
14:24:10 <lambdabot> error:
14:24:10 <lambdabot> Not in scope: data constructor ‘Data.Semigroup.First’
14:24:10 <lambdabot> No module named ‘Data.Semigroup’ is imported.
14:24:27 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds)
14:24:36 <janus> bummer that yahb doesn't have Expr
14:24:47 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Ping timeout: 240 seconds)
14:24:49 <[exa]> hololeap: don't you need foldMap' ?
14:25:19 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
14:25:23 <[exa]> foldMap doc says it's left-associative, so it looks to me that it can't short-circuit
14:26:04 <[exa]> oh no I'm reading the wrong docs :D
14:26:26 <hololeap> % f' = foldMap' (\i -> if i > 5 then Just (Data.Semigroup.First i) else Nothing)
14:26:27 <yahb> hololeap:
14:26:33 <hololeap> % f' [0..]
14:26:35 <yahb> hololeap: *** Exception: heap overflow
14:27:20 × mikoto-c1 quits (~mikoto-ch@ip-83-134-2-136.dsl.scarlet.be) (Quit: mikoto-c1)
14:27:40 mikoto-chan joins (~mikoto-ch@ip-83-134-2-136.dsl.scarlet.be)
14:28:46 <int-e> hololeap: Just (First 0) <> undefined doesn't short-cut, at which point you've lost already. The reason being, the Monoid instance for Maybe doesn't know that the inner monoid has short-cutting capabilities.
14:29:17 <int-e> > Just [1] <> Nothing <> Just [2] -- you can't stop at Nothing
14:29:19 <lambdabot> Just [1,2]
14:29:53 <Taneb> > First 0 <> undefined
14:29:54 <lambdabot> error:
14:29:55 <lambdabot> • No instance for (Num (Maybe ())) arising from a use of ‘e_10’
14:29:55 <lambdabot> • In the expression: e_10
14:30:01 <hololeap> % Data.Monoid.First (Just 4) <> undefined
14:30:02 <yahb> hololeap: *** Exception: heap overflow
14:30:26 <hololeap> % 4
14:30:27 <yahb> hololeap: 4
14:30:36 <int-e> @let import qualified Data.Semigroup
14:30:37 <lambdabot> Defined.
14:30:39 <int-e> > Data.Semigroup.First 1 <> undefined
14:30:41 <lambdabot> First {getFirst = 1}
14:31:13 <janus> > foldMap (\i -> if i > 5 then Just (Data.Semigroup.First i) else Nothing) [0::Expr .. 6]
14:31:14 <lambdabot> Just (First {getFirst = 6})
14:31:16 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Ping timeout: 252 seconds)
14:31:40 <hololeap> well, it looks like First from Data.Monoid is what I want, then
14:31:47 <int-e> Oh I misread the test (i > 5), my bad.
14:31:50 <jippiedoe> Ah, I think I know! The Monoid instance for Maybe forces the right element
14:32:20 <jippiedoe> ..and while I checked that int-e already said so too :)
14:32:28 <[exa]> sneaky how First is supposed to contain the Maybe inside.
14:32:52 <hololeap> int-e: thanks for pointing that out. Data.Monoid.First doesn't have this behavior, this returns First (Just 4): Data.Maybe.First (Just 4) <> undefined
14:33:13 <janus> so if one used a naive Maybe and made a First for that, it would work?
14:33:28 <int-e> [exa]: yeah but this question explains why that is, really.
14:34:01 × markpythonicbtc quits (~textual@50.228.44.6) (Ping timeout: 252 seconds)
14:34:10 <[exa]> yeah
14:34:52 derelict joins (~derelict@user/derelict)
14:35:38 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
14:35:43 <janus> why does Maybe force the right argument?
14:35:58 <janus> (for mappend) ?
14:36:02 <int-e> janus: because Just x <> Just y = Just (x <> y)
14:36:14 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
14:36:19 <int-e> you can't get that without inspecting the right argument
14:36:54 <int-e> (generically, without knowing anything about the inner <>)
14:36:55 <janus> oh, i thought there was some strictness hack. but it actually needs the value
14:37:07 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
14:38:45 <hololeap> int-e, so it seems like this behavior would also arise for other types that "inherit" their contents' Semigroup instance, such as (,)
14:39:45 <hololeap> (x1,y1) <> (x2,y2) = (x1<>x2, y1<>y2) -- it has to inspect the right argument here, too
14:40:12 azeem joins (~azeem@62.19.187.81)
14:41:11 <janus> hmmm, if Ord was written with a max/min interface instead of relying on its own types, i wonder if the example with Expr could be illustrative
14:41:12 <int-e> hololeap: Right, the actual implementation (from GHC.Base of all places... interesting) is (a,b) <> (a',b') = (a<>a',b<>b')
14:41:38 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
14:41:46 <int-e> hololeap: one /could/ get away with ~(a,b) <> ~(a',b') = (a<>a',b<>b') here, but it's probably a bad trade-off (performance for extra laziness)
14:42:31 <janus> surely an interface "class Ord where min :: (a,a) -> a" should be equivalent to what standard Ord provides?
14:42:42 <int-e> And in any case this use of irrefutable patterns only works for single constructor types.
14:42:43 <hololeap> ultimately, I'm running a fold that accumulates something like (Maybe X, Maybe Y), and I want it to short-circuit as soon as the accumulator hits (Just X, Just Y)
14:43:13 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 248 seconds)
14:43:17 <hololeap> and I thought maybe I could glue something together out of pieces from Data.Monoid and Data.Semigroup
14:43:22 × acidjnk_new quits (~acidjnk@p200300d0c72b95925da55fe159cc0756.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
14:43:46 <int-e> janus: that's... horrible.
14:44:00 <int-e> :t min
14:44:01 <lambdabot> Ord a => a -> a -> a
14:44:07 × azeem quits (~azeem@62.19.187.81) (Ping timeout: 240 seconds)
14:44:39 <int-e> the thought of computing x <= y as min x y == x makes me cringe.
14:44:52 <janus> int-e: but it works better with Expr , no ? ;)
14:45:07 <int-e> > let xs = [1..]; ys = [2..] in xs < ys
14:45:08 <lambdabot> True
14:45:16 <int-e> > let xs = [1..]; ys = [2..] in min xs ys == xs
14:45:22 <lambdabot> mueval-core: Time limit exceeded
14:45:29 <int-e> so that's a hard no
14:45:51 <sszark2> What does c signify in this expression? `c <- [1..10], b <- [1..c]`
14:45:57 <janus> i made no claim about infinite lists ;)
14:46:07 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
14:46:10 sszark2 is now known as sszark
14:46:10 <dminuoso> sszark2: This is not a full expression.
14:46:11 <int-e> sszark2: that's not an expression. it's probably part of a list comprehension
14:46:11 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
14:46:35 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.2)
14:46:43 <int-e> sszark: where intuitively, c <- [1..10] makes c (a fresh variable at that point) range over the elements of [1..10]
14:47:04 <janus> i really just wanted to ponder whether an alternate ord could be defined such that it would work for the [0::Expr .. 6] example above
14:47:58 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
14:48:26 <int-e> janus: well, no. you don't even get out of that problem, because you'll still need (==), and (==) :: Expr -> Expr -> Bool runs into the same problem that you wanted to avoid.
14:48:38 <mastarija> Do we have some kind of reader monad in base or is it necessary to use transformers package?
14:48:45 <sszark> So c just makes the range for b the same length as c here?
14:49:19 <mastarija> I want to use doctest, and write an example with a reader monad, but I don't want to include transformers package just for that.
14:49:29 <int-e> sszark: yes. it's enumerating c,b with 1 <= b <= c <= 10
14:49:41 <janus> int-e: damn, gotta make a continuation based Eq also then... :P
14:49:47 <maerwald> mastarija: yes ((->) r)
14:50:09 <janus> purge all bools
14:50:12 <mastarija> oh.. right, function is monad
14:50:24 <int-e> janus: This may be too high a price to pay for solving the Expr.. problem.
14:50:35 <janus> there are no limits to my masochism
14:50:57 <int-e> > map fromIntegral [1..6] :: [Expr]
14:50:59 <lambdabot> [1,2,3,4,5,6]
14:51:55 azeem joins (~azeem@176.201.15.153)
14:53:22 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
14:53:32 notzmv joins (~zmv@user/notzmv)
14:53:58 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
14:55:55 × gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving)
14:56:47 × peterhil quits (~peterhil@dsl-hkibng32-54fb52-57.dhcp.inet.fi) (Ping timeout: 240 seconds)
14:57:37 × epolanski quits (uid312403@id-312403.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
14:57:57 × jippiedoe quits (~david@2a02-a44c-e14e-1-ff47-c45c-287d-42e8.fixed6.kpn.net) (Quit: Leaving)
15:00:47 lavaman joins (~lavaman@98.38.249.169)
15:01:50 hnOsmium0001 joins (uid453710@id-453710.stonehaven.irccloud.com)
15:02:52 vpan joins (~vilius@212.117.1.172)
15:03:47 × xff0x quits (~xff0x@2001:1a81:53dc:be00:a2ac:ecf7:da22:1207) (Ping timeout: 240 seconds)
15:04:57 xff0x joins (~xff0x@2001:1a81:53dc:be00:a197:89df:f531:cbff)
15:05:07 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
15:07:01 notzmv joins (~zmv@user/notzmv)
15:08:05 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Read error: Connection reset by peer)
15:08:06 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
15:08:16 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
15:08:40 ziman joins (~ziman@user/ziman)
15:10:20 <ziman> hello! I have a typeclass (Serialise metadata a), where I'd like instances to depend only on `a`, i.e. make it impossible that `metadata` could affect the serialisation procedure.
15:10:42 <ziman> i'd like to mark `metadata` as irrelevant in some way but is that possible in Haskell?
15:10:58 <ziman> fundeps don't do what i want because i want instances to work for arbitrary `metadata` for any single `a`
15:11:12 <timCF> ziman: why it's needed in class definition then?
15:12:31 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 250 seconds)
15:13:15 <ziman> no behaviour depends on it, it is only used to express that this typeclass is not available for some `metadata`, so not all instances are universally quantified over `metadata`; some instances exist only for one `metadata` value
15:15:10 <c_wraith> Well then, the type *does* affect the process, in that it's just not available for some types.
15:15:37 <c_wraith> Haskell makes classes open. It's always assumed another module could add another instance
15:16:18 <ziman> the typeclass contains a method called toBS, which converts the type to bytestring
15:16:24 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
15:16:26 <c_wraith> So the compiler has to assume the type does impact the functionality
15:16:28 <ziman> i'd like to express that the result of toBS cannot depend on the metadata
15:16:32 × hendursa1 quits (~weechat@user/hendursaga) (Quit: hendursa1)
15:16:42 <c_wraith> But you've just said it can
15:17:03 hendursaga joins (~weechat@user/hendursaga)
15:17:05 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
15:17:05 <c_wraith> In that if the metadata type is wrong, you can't call it
15:17:15 <c_wraith> that is a dependency
15:17:15 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
15:18:30 <c_wraith> Maybe you want to split the class in two? One class without the metadata type involved, one class with?
15:19:09 <c_wraith> You could have the class with the metadata depend on the one without, so you'd only need to write that one in type signatures
15:19:39 <ziman> hmmm
15:19:40 × dsrt^ quits (~dsrt@12.16.129.111) (Ping timeout: 240 seconds)
15:20:56 <hololeap> @hoogle (Maybe a, Maybe b) -> Maybe (a,b)
15:20:57 <lambdabot> No results found
15:21:40 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Ping timeout: 240 seconds)
15:21:47 <c_wraith> :t uncurry $ liftA2 (,)
15:21:48 neo2 joins (~neo3@cpe-292712.ip.primehome.com)
15:21:48 <lambdabot> Applicative f => (f a, f b) -> f (a, b)
15:21:55 <ziman> thanks, i'll think about it
15:22:12 <ziman> maybe one just can't do it in haskell
15:22:34 <c_wraith> Haskell makes assumptions about instances that makes restricting them difficult
15:22:58 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 252 seconds)
15:23:15 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
15:23:55 doyougnu joins (~user@c-73-25-202-122.hsd1.or.comcast.net)
15:24:31 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Read error: Connection reset by peer)
15:24:48 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
15:25:10 × neo1 quits (~neo3@cpe-292712.ip.primehome.com) (Ping timeout: 252 seconds)
15:28:28 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
15:29:10 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
15:29:18 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 250 seconds)
15:33:15 hexfive joins (~eric@50.35.83.177)
15:34:51 glider_ is now known as glider
15:39:51 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
15:40:17 × martin02 quits (~silas@141.84.69.76) (Ping timeout: 248 seconds)
15:40:45 asthasr joins (~asthasr@162.210.28.151)
15:41:48 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
15:44:47 waleee joins (~waleee@2001:9b0:216:8200:d457:9189:7843:1dbd)
15:44:51 jakalx parts (~jakalx@base.jakalx.net) ()
15:45:32 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
15:46:59 jakalx joins (~jakalx@base.jakalx.net)
15:47:13 × Skyfire quits (~pyon@user/pyon) (Quit: WeeChat 3.2)
15:48:55 × dajoer quits (~david@user/gvx) (Quit: leaving)
15:50:09 × hexfive quits (~eric@50.35.83.177) (Quit: WeeChat 3.0.1)
15:50:14 argento joins (~argent0@168-227-96-26.ptr.westnet.com.ar)
15:51:05 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 250 seconds)
15:51:36 Guest55 joins (~Guest55@188.64.207.213)
15:51:44 × egoist quits (~egoist@186.235.82.117) (Quit: WeeChat 3.2)
15:51:51 × hendursaga quits (~weechat@user/hendursaga) (Remote host closed the connection)
15:51:52 <Guest55> hey
15:52:18 hendursaga joins (~weechat@user/hendursaga)
15:52:47 × lortabac quits (~lortabac@151.70.200.251) (Quit: WeeChat 2.8)
15:53:00 × cheater quits (~Username@user/cheater) (Remote host closed the connection)
15:53:51 <Guest55> i wanna find the longest truthiness sequence [False, False, True, True, False, True, False, False, True, True, True, True, False, False, True, True].
15:54:04 <Guest55> the starting point and length of it
15:54:26 <Guest55> everything i come up with looks messy. any ideas?
15:55:01 <c_wraith> are you allowed to use stuff from Data.List?
15:55:09 <Guest55> ye sure
15:55:22 <c_wraith> > group [False, False, True, True, False, True, False, False, True, True, True, True, False, False, True, True]
15:55:23 <lambdabot> [[False,False],[True,True],[False],[True],[False,False],[True,True,True,True...
15:55:40 <Guest55> well yea lol. but look at what im trying to achive
15:55:58 <Guest55> i know how to group. just pulling the indexes after that is messy af
15:56:05 <c_wraith> that's just step one
15:56:06 <mastarija> Index first
15:56:18 <mastarija> and then use "groupOn snd"
15:56:22 <c_wraith> > map (head &&& length) $ group [False, False, True, True, False, True, False, False, True, True, True, True, False, False, True, True]
15:56:23 <mastarija> or something like that
15:56:24 <lambdabot> [(False,2),(True,2),(False,1),(True,1),(False,2),(True,4),(False,2),(True,2)]
15:56:24 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
15:56:26 <Guest55> ok then assume im way past step 1 now
15:56:38 <Guest55> ive tryied everything you're saying
15:56:42 <Guest55> tried*
15:57:42 <c_wraith> and then at that point, it's probably easiest to go to to explicit recursion
15:58:01 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
15:58:14 <Guest55> can you show how? that's the exact place im stuck at
15:58:32 aegon joins (~mike@174.127.249.180)
15:59:24 cheater joins (~Username@user/cheater)
16:02:43 <hololeap> is there another way to accomplish this using premade monoids/semigroups/alternatives ... ? http://sprunge.us/0xuc7T
16:03:03 <c_wraith> Guest55: what should it do if there is no True?
16:03:40 <Guest55> umm maybe (0,0) idk
16:03:49 lbseale joins (~lbseale@user/ep1ctetus)
16:03:58 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 250 seconds)
16:04:01 <Guest55> less of an issue. just an exercise ive come up with
16:07:18 <hololeap> (fixed it so that it behaves how I actually want: http://sprunge.us/W2QrRQ)
16:09:12 <hololeap> basically, the folding function doesn't care about previous values, but if they are Just, the first one is kept. the whole thing short circuits when all the Maybes are Just
16:09:25 <c_wraith> Guest55: https://paste.tomsmeding.com/BAq8Rd3s works. Maybe not ideal (it should probably return a Maybe (Int, Int)), but solid
16:10:15 pgib joins (~textual@173.38.117.82)
16:12:30 <hololeap> the overall idea is that it tries to gather all the pieces for building a product type from a list, and once all those pieces have been collected, it stops reading from the list
16:13:33 <hololeap> I feel like this would be common enough that I wouldn't have to roll my own function for this
16:14:24 × phma quits (~phma@host-67-44-208-131.hnremote.net) (Read error: Connection reset by peer)
16:15:51 phma joins (~phma@host-67-44-208-218.hnremote.net)
16:16:36 <sclv> hololeap: i'd just say `find (\(x,y) -> isJust x && isJust y)` or something for that?
16:18:41 <sclv> but what you may want is something like `concatMap (\(x,y) -> liftM2 (,) x y)` and then pattern match out the head
16:18:53 <sclv> or er not concatMap, but mapMaybe
16:19:36 _ht joins (~quassel@82-169-194-8.biz.kpn.net)
16:21:21 × azeem quits (~azeem@176.201.15.153) (Ping timeout: 248 seconds)
16:22:33 <c_wraith> there are so many silly ways to do this:
16:22:34 <c_wraith> :t \f -> getFirst . foldMap (First . uncurry (liftA2 (,)) . f)
16:22:35 <lambdabot> Foldable t => (a1 -> (Maybe a2, Maybe b)) -> t a1 -> Maybe (a2, b)
16:23:28 <Guest55> c_wraith thanks. ill try to understand what you wrote
16:23:49 <c_wraith> Ah, that version isn't quite right. To really be right you'd want to bimap over the pair, which gets uglier
16:24:18 <byorgey> what's an easy way to get a function Map k (Maybe a) -> Map k a which deletes the Nothing values from the map?
16:24:36 <c_wraith> :t \f -> bimap getFirst getFirst . foldMap (bimap First First . f)
16:24:37 <lambdabot> (Bifunctor p, Foldable t, Monoid (p (First a1) (First a2))) => (a3 -> p (Maybe a1) (Maybe a2)) -> t a3 -> p (Maybe a1) (Maybe a2)
16:24:40 <hololeap> c_wraith: that would discard an intermediate value like (Just x, Nothing) ... the `uncurry (liftA2 (,))` would transform that into Nothing and you would lose `Just x`
16:24:42 <c_wraith> enjoy that type signature
16:24:48 <c_wraith> hololeap: yes, I just fixed that
16:25:05 <Guest55> the problem btw was to find longest increasing&following number subsequence
16:25:11 <sclv> byorgey: the easiest way is to use witherable :-)
16:25:44 <Guest55> i just converted it to a lists of booleans indicating if one is a successor of the previous
16:26:06 <byorgey> sclv: ah, perfect!
16:26:57 <byorgey> Yes, exactly. I used to have a list and used catMaybes. But now the list is changing to a map, and... I can still use catMaybes! \o/
16:29:29 azeem joins (~azeem@176.200.202.67)
16:29:35 <dminuoso> byorgey: traverseMaybeWithKey is a thing in new versions of container
16:29:43 <dminuoso> Avoids the dependency on witherable
16:29:47 <c_wraith> hololeap: though.. I'm not sure that's appropriately lazy anymore, since the Firsts are inside the tuple. Better off going with one of sclv's suggestsions
16:30:24 × Morrow_ quits (~Morrow@bzq-110-168-31-106.red.bezeqint.net) (Ping timeout: 250 seconds)
16:31:29 <dminuoso> Though catMaybes from witherable might be a better exact fit. But traverseMaybeWithKey is still useful in case this is the output of a traverse already.
16:33:59 <byorgey> dminuoso: oh, good to know, thanks, that's actually an even better fit, because I do a traverse right before the catMaybes
16:35:54 markpythonicbtc joins (~textual@2601:647:5a00:35:f814:103:43a8:3466)
16:39:24 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Quit: WeeChat 3.2)
16:41:25 arjun joins (~Srain@user/arjun)
16:47:40 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 252 seconds)
16:48:25 × Guest55 quits (~Guest55@188.64.207.213) (Ping timeout: 246 seconds)
16:50:01 × Boomerang quits (~Boomerang@xd520f68c.cust.hiper.dk) (Ping timeout: 250 seconds)
16:51:59 martin02 joins (~silas@141.84.69.76)
16:52:15 azeem joins (~azeem@176.200.202.67)
16:53:03 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
16:55:02 × arjun quits (~Srain@user/arjun) (Remote host closed the connection)
16:59:51 <maerwald> is there an easy way to make the Map fromJSON instance of aeson more permissive without redefining it? As in: if it can't parse a key, I want it to just skip that element
17:00:47 <sclv> https://hackage.haskell.org/package/aeson-1.5.6.0/docs/Data-Aeson.html#v:defaultOptions is all i know of?
17:01:03 <maerwald> the instance is here https://hackage.haskell.org/package/aeson-1.5.6.0/docs/src/Data.Aeson.Types.FromJSON.html#line-1896
17:01:09 <maerwald> I'm sure I could just overwrite it, but
17:01:45 <maerwald> it seems like a common use case, isn't it?
17:02:07 <sclv> i'm not sure i see where that errors -- as in the key can't be parsed because its malformed as json?
17:02:11 mc47 joins (~mc47@xmonad/TheMC47)
17:02:15 <dminuoso> Dunno, the the protocol interactions we have are very strict.
17:02:18 × mastarija quits (~mastarija@78-3-210-70.adsl.net.t-com.hr) (Read error: Connection reset by peer)
17:02:26 <dminuoso> Simply dropping keys could induce a lot of bizarre failure
17:02:29 <maerwald> well, `FromJSONKey k` will fail
17:02:36 <maerwald> it would have to catch it
17:02:54 Morrow_ joins (~Morrow@bzq-110-168-31-106.red.bezeqint.net)
17:03:35 <sclv> oh uh i'd just parse into a map from string keys in that case
17:05:43 elf_fortrez joins (~elf_fortr@adsl-72-50-7-8.prtc.net)
17:05:43 <maerwald> that's gonna be a little annoyong, because those are several nested maps, which then have to be translated to something not-stringy :p
17:06:13 <maerwald> I guess I'll just make an overlapping instance
17:06:15 <sclv> ok then newtype wrap the maps and write your own instance?
17:07:07 × vpan quits (~vilius@212.117.1.172) (Quit: Leaving.)
17:08:01 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 252 seconds)
17:08:04 × smitop quits (~smitop@user/smitop) (Remote host closed the connection)
17:10:14 <aegon> i'm trying to grok arrow syntax better / when its good to use anyone got a favorite tutorial / overview? I've got 6 open
17:10:25 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Ping timeout: 248 seconds)
17:12:06 fef joins (~thedawn@user/thedawn)
17:12:24 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
17:13:37 <maerwald> in 8 years of haskell or so I've never used arrows
17:13:51 <maerwald> although I've read several papers that make use of them
17:14:18 <maerwald> then they usually end up doing something similar with monads
17:15:57 <aegon> i did something with wire a while back. It seems like the intent is that arrows can be paralellized but I don't see any parallelization happening unless ghc is doing that when it sees they aren't dependent on eachother
17:16:07 <maerwald> whenever I try to build an intuition about them, I simply can't find enough use cases
17:16:30 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
17:17:12 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
17:17:12 × tput quits (~tim@S0106a84e3fe54613.ed.shawcable.net) (Ping timeout: 250 seconds)
17:17:33 <maerwald> and then I wonder why I spent 2 hours reading about something I don't need :p
17:18:33 <aegon> lol
17:18:50 <hololeap> sclv, c_wraith: the best solution I've come up with so far is to roll a First2 monoid: http://sprunge.us/9RSGe0
17:18:53 <aegon> i want all that sugar at my disposal when planning
17:19:23 <maerwald> except for making an impression at the next haskell meetup
17:19:30 <maerwald> where ppl will go "omg, that arrow dude"
17:20:09 smitop joins (~smitop@user/smitop)
17:20:35 nilof joins (~olofs@90-227-86-119-no542.tbcn.telia.com)
17:20:48 <hololeap> but it would be cool to find a solution that could do this with any number of arguments
17:21:36 <maerwald> also, 'arrow' is a hell of a nickname
17:24:56 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:26:33 <[exa]> hololeap: take `both First` (with `both` from tuple extras) and generalize over `both` ?
17:28:22 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 252 seconds)
17:29:38 <[exa]> (and well, unzip)
17:29:47 × nilof quits (~olofs@90-227-86-119-no542.tbcn.telia.com) (Quit: Leaving)
17:29:55 × dyeplexer quits (~dyeplexer@user/dyeplexer) (Quit: Leaving)
17:30:49 <hololeap> hm, no both needs the tuple to look like (a,a), which isn't the case here... the tuple here is (Maybe a, Maybe b)
17:31:38 <[exa]> ah so that would make a higher-order-polymorphic `both`
17:33:04 dsrt^ joins (~dsrt@12.16.129.111)
17:33:48 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
17:34:13 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 250 seconds)
17:36:07 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
17:39:57 chris joins (~chris@81.96.113.213)
17:40:00 chris is now known as Guest1015
17:40:10 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
17:41:31 Skyfire joins (~pyon@user/pyon)
17:43:27 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 240 seconds)
17:45:41 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
17:47:07 × neo2 quits (~neo3@cpe-292712.ip.primehome.com) (Ping timeout: 240 seconds)
17:47:55 Erutuon joins (~Erutuon@user/erutuon)
17:50:44 × thyriaen_ quits (~thyriaen@dynamic-089-012-236-255.89.12.pool.telefonica.de) (Quit: Leaving)
17:54:49 takuan joins (~takuan@178-116-218-225.access.telenet.be)
17:56:03 vysn joins (~vysn@user/vysn)
17:57:50 × bgamari quits (~bgamari@2001:470:e438::1) (Quit: ZNC 1.8.1 - https://znc.in)
17:58:12 bgamari joins (~bgamari@72.65.101.163)
17:58:47 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
17:59:29 × Guest1015 quits (~chris@81.96.113.213) (Ping timeout: 248 seconds)
18:00:27 <Cale> maerwald: They have some good use cases for things like building state machines, FRP, that sort of thing, but the details of how the class is defined and the stuff it leaves out tends to also undermine those use cases quite a bit.
18:02:15 <Cale> It ought to be fixed up so that it fits the definition of a symmetric monoidal category a bit more closely. The extra operations that explicitly reassociate and swap tuples, introduce an eliminate units, actually become quite important, because they let you do some static analysis of your computation to simplify it before running, which is a trick that monads struggle with.
18:03:36 <Cale> Currently, if you use the proc/do syntax, it will shove a black box "arr" in between every pair of arrows in your computation, which destroys any hope of simplifying things.
18:05:05 <Cale> It's possible to get that down to basically just the cases where you have a complex (non-tuple-like) construction on the right of a -< or where you're doing a fancier pattern match on the left of a <-
18:05:45 chris joins (~chris@81.96.113.213)
18:05:48 chris is now known as Guest5790
18:06:18 <Cale> But that said, even if it were improved to the point that it didn't undermine its best use cases, those use cases are still probably pretty rare :)
18:07:34 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
18:09:25 × doyougnu quits (~user@c-73-25-202-122.hsd1.or.comcast.net) (Remote host closed the connection)
18:10:11 × Guest5790 quits (~chris@81.96.113.213) (Ping timeout: 250 seconds)
18:11:38 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
18:12:07 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 240 seconds)
18:12:36 doyougnu joins (~user@c-73-25-202-122.hsd1.or.comcast.net)
18:12:57 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
18:14:25 <sm> interesting!
18:14:26 hyiltiz joins (~quassel@31.220.5.250)
18:14:57 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 248 seconds)
18:16:02 sm has been missing the Cale insight drops in here
18:16:32 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
18:18:09 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 248 seconds)
18:18:44 <maerwald> yeah, I still have to get into FRP as well, but the same thing applies as well: can't find a use case :p
18:18:54 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Read error: Connection reset by peer)
18:19:31 zebrag joins (~chris@user/zebrag)
18:19:59 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
18:20:52 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
18:21:10 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Ping timeout: 252 seconds)
18:21:39 geekosaur joins (~geekosaur@xmonad/geekosaur)
18:22:49 × argento quits (~argent0@168-227-96-26.ptr.westnet.com.ar) (Ping timeout: 252 seconds)
18:24:01 × Morrow_ quits (~Morrow@bzq-110-168-31-106.red.bezeqint.net) (Ping timeout: 248 seconds)
18:27:01 <srid[m]> web apps
18:27:19 <srid[m]> or cli apps
18:27:44 <srid[m]> https://github.com/reflex-frp/reflex-ghci for instance
18:27:53 <maerwald> for web apps I don't use haskell
18:28:10 <maerwald> for cli, I use brick, which isn't FRP and much simple
18:29:26 argento joins (~argent0@168-227-96-26.ptr.westnet.com.ar)
18:30:02 <maerwald> I think I only tried to get reflex-vty working once and gave up pretty early
18:32:07 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 240 seconds)
18:32:25 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
18:34:53 pavonia joins (~user@user/siracusa)
18:36:47 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 240 seconds)
18:37:01 azeem joins (~azeem@176.200.202.67)
18:37:33 × fef quits (~thedawn@user/thedawn) (Remote host closed the connection)
18:39:32 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
18:41:38 × carbolymer quits (~carbolyme@dropacid.net) (Quit: carbolymer)
18:41:51 carbolymer joins (~carbolyme@dropacid.net)
18:42:37 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 252 seconds)
18:42:54 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
18:43:10 × sszark quits (~sszark@h-155-4-128-59.na.cust.bahnhof.se) (Ping timeout: 252 seconds)
18:43:49 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Remote host closed the connection)
18:44:16 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
18:44:16 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
18:44:16 wroathe joins (~wroathe@user/wroathe)
18:45:03 sszark joins (~sszark@h-155-4-128-59.NA.cust.bahnhof.se)
18:45:39 qbt joins (~edun@user/edun)
18:50:26 tput joins (~tim@199-7-159-34.eng.wind.ca)
18:51:45 × sciencentistguy quits (~sciencent@hacksoc/ordinary-member) (Ping timeout: 248 seconds)
18:53:44 × tput quits (~tim@199-7-159-34.eng.wind.ca) (Read error: Connection reset by peer)
18:55:51 tput joins (~tim@24.244.29.189)
18:57:21 × qbt quits (~edun@user/edun) (Remote host closed the connection)
18:59:43 Morrow_ joins (~Morrow@bzq-110-168-31-106.red.bezeqint.net)
19:00:51 tfeb joins (~tfb@88.98.95.237)
19:03:44 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
19:08:00 qbt joins (~edun@user/edun)
19:08:28 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 252 seconds)
19:08:41 <aegon> cli apps i use ansii-term its simple
19:08:45 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
19:09:00 fresheyeball joins (~fresheyeb@c-71-237-105-37.hsd1.co.comcast.net)
19:09:17 <aegon> web apps i've been using scotty-web
19:09:25 <aegon> srid[m]: ^
19:11:29 × argento quits (~argent0@168-227-96-26.ptr.westnet.com.ar) (Ping timeout: 248 seconds)
19:11:35 <maerwald> who's building web apps still, so 90s
19:12:13 <maerwald> have login, a database and customer support
19:14:17 <aegon> i assume webapps meant api consumed by something like react
19:14:17 <maerwald> after 20 years this nonsense should be abstracted out so hard that you shouldn't know about it anymore
19:14:17 <maerwald> but for some reason we haven't managed
19:14:17 argento joins (~argent0@191.81.228.237)
19:14:17 <aegon> the browser is a crazy land and javascript along with it. blows my mind javascript is the most used language today
19:14:17 <aegon> no one thought that through
19:14:17 <aegon> :P
19:14:17 <maerwald> I don't think js is the problem here, or even languages at all
19:14:17 <monochrom> Blew DIjkstra's mind BASIC was the most learned language, too.
19:14:35 <maerwald> it's the complete lack of *engineering*
19:14:44 <monochrom> Yes I'm now comparing you with Dijkstra. >:)
19:16:17 <maerwald> why can't you build your startup platform web app in 10 clicks via a GUI? I'm pretty sure there's nothing *technically* new about your idea, use case, database constraints etc etc
19:16:50 <maerwald> it has been done a million times and yet we still do it from scratch again
19:16:54 <maerwald> because it pays well?
19:16:54 × tfeb quits (~tfb@88.98.95.237) (Quit: died)
19:17:09 <aegon> :O
19:17:10 <monochrom> I think it's called WordPress and FourSquare etc.
19:17:17 burnsidesLlama joins (~burnsides@dhcp168-011.wadham.ox.ac.uk)
19:17:22 aegon is now known as DJ
19:17:29 DJ is now known as DJ_Ikstra
19:17:29 kayprish joins (~kayprish@185.37.26.225)
19:18:14 <monochrom> But I do not object to the possibilities that most programmers are scammers.
19:18:20 × kayprish quits (~kayprish@185.37.26.225) (Remote host closed the connection)
19:19:09 <DJ_Ikstra> maerwald: we must all fight django for at least 2 years in our career before noticing how silly it is and vowing never again
19:19:09 <maerwald> I wonder if you could apply unix principles to web development
19:19:26 <maerwald> oh no, I believe ppl will interpret this as microservices
19:19:30 <maerwald> ok, I didn't say anything
19:19:32 <maerwald> forget it
19:22:00 <monochrom> Functional programming is the closest to realizing unix principles without unix flaws (such as "everything is a string" and "there is only one input source and only one output destination").
19:22:41 × burnsidesLlama quits (~burnsides@dhcp168-011.wadham.ox.ac.uk) (Ping timeout: 248 seconds)
19:23:13 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 248 seconds)
19:23:19 <monochrom> John Hughes paper is almost "why unix but strongly statically typed matters"
19:24:43 <maerwald> I ultimately believe in coding via moving pictures around my screen and connecting them with lines
19:25:05 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
19:26:04 <monochrom> Arrow is almost like that, but trapped in plain text files.
19:27:10 Logio_ is now known as Logio
19:28:30 Codaraxis__ joins (~Codaraxis@user/codaraxis)
19:31:47 × Codaraxis_ quits (~Codaraxis@user/codaraxis) (Ping timeout: 240 seconds)
19:38:09 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 250 seconds)
19:40:50 Codaraxis_ joins (~Codaraxis@user/codaraxis)
19:41:22 × orhan89 quits (~orhan89@151.91.188.35.bc.googleusercontent.com) (Ping timeout: 240 seconds)
19:41:40 × elf_fortrez quits (~elf_fortr@adsl-72-50-7-8.prtc.net) (Quit: Client closed)
19:42:40 × dsrt^ quits (~dsrt@12.16.129.111) (Ping timeout: 240 seconds)
19:42:48 notzmv joins (~zmv@user/notzmv)
19:42:56 <byorgey> Does lens provide a combinator of type (something like) MonadState s m => Lens' s a -> (a -> m a) -> m s ?
19:43:16 dsrt^ joins (~dsrt@12.16.129.111)
19:43:28 <byorgey> I can do it with get >>= theLens f where f :: a -> m a , but wondered if there was already an operator to do this
19:43:35 orhan89 joins (~orhan89@151.91.188.35.bc.googleusercontent.com)
19:44:07 <byorgey> :t \lens f -> get >>= lens f
19:44:08 <lambdabot> MonadState a m => (t -> a -> m b) -> t -> m b
19:44:10 × Codaraxis__ quits (~Codaraxis@user/codaraxis) (Ping timeout: 240 seconds)
19:46:26 <hololeap> I found a solution to my problem that seems ok: make a new typeclass for semigroups/monoids that have a "short-circuit state", so that wrappers can know whether or not to evaluate the second argument to `sappend`: http://sprunge.us/hYNINa
19:47:36 <byorgey> In other words, I want to apply an update to the component of the monadic state targeted by the lens, but the update may itself have some effects in the monad
19:48:10 × hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 240 seconds)
19:48:47 hyiltiz joins (~quassel@31.220.5.250)
19:52:16 <byorgey> wait, I'm not even sure get >>= lens f does what I want, because I think that throws out the returned state which has the updated thing in it. Maybe it should be get >>= lens f >>= put.
19:55:10 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
19:57:13 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 250 seconds)
19:57:28 azeem joins (~azeem@176.200.202.67)
19:58:32 <byorgey> oh, that doesn't work because the put overwrites any changes to the state made by the 'lens f' part! Never mind, maybe there's no concise, lawful way to do this, because what if the effects of the 'lens f' part modify the part of the state the lens is targeting?
19:59:38 <byorgey> In my situation that's not the case, but anyway, I will stick with something like do { a <- use lens; a' <- f a; lens %= a' }
20:01:10 × _ht quits (~quassel@82-169-194-8.biz.kpn.net) (Remote host closed the connection)
20:01:28 lavaman joins (~lavaman@98.38.249.169)
20:04:58 Hanicef joins (~gustaf@81-229-9-108-no92.tbcn.telia.com)
20:06:13 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 252 seconds)
20:06:25 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
20:09:07 × oxide quits (~lambda@user/oxide) (Ping timeout: 240 seconds)
20:10:39 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 250 seconds)
20:10:47 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 240 seconds)
20:10:56 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
20:11:31 azeem joins (~azeem@176.200.202.67)
20:12:49 × argento quits (~argent0@191.81.228.237) (Ping timeout: 248 seconds)
20:18:53 × Morrow_ quits (~Morrow@bzq-110-168-31-106.red.bezeqint.net) (Ping timeout: 250 seconds)
20:20:13 × Athas quits (athas@2a01:7c8:aaac:1cf:21e7:9b03:b2c:cc0f) (Quit: ZNC 1.8.2 - https://znc.in)
20:20:23 Athas joins (athas@sigkill.dk)
20:23:25 <shachaf> byorgey: I guess the odd thing about that type is that the (a -> m a) function knows about both a and s.
20:29:10 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 250 seconds)
20:29:16 × chisui quits (~chisui@200116b868a14e009fa6896fe3af5cba.dip.versatel-1u1.de) (Ping timeout: 246 seconds)
20:30:54 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 250 seconds)
20:31:07 × sszark quits (~sszark@h-155-4-128-59.NA.cust.bahnhof.se) (Ping timeout: 240 seconds)
20:31:13 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Quit: FinnElija)
20:32:26 azeem joins (~azeem@176.200.202.67)
20:33:22 sszark joins (~sszark@h-155-4-128-59.NA.cust.bahnhof.se)
20:34:16 jumper149 joins (~jumper149@80.240.31.34)
20:35:06 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
20:35:37 wysteriary[m] joins (~wysteriar@2001:470:69fc:105::a42e)
20:38:07 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 240 seconds)
20:38:25 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
20:40:47 × qbt quits (~edun@user/edun) (Ping timeout: 240 seconds)
20:45:53 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Ping timeout: 248 seconds)
20:47:03 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 250 seconds)
20:47:20 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
20:48:00 geekosaur joins (~geekosaur@xmonad/geekosaur)
20:48:01 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 252 seconds)
20:48:55 azeem joins (~azeem@176.200.202.67)
20:51:52 × pbrisbin quits (~patrick@174-081-116-011.res.spectrum.com) (Ping timeout: 252 seconds)
20:52:43 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
20:53:07 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 240 seconds)
20:55:23 azeem joins (~azeem@176.200.202.67)
20:58:19 × ubert quits (~Thunderbi@91.141.37.164.wireless.dyn.drei.com) (Ping timeout: 250 seconds)
20:59:34 × tput quits (~tim@24.244.29.189) (Ping timeout: 252 seconds)
21:02:00 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
21:02:53 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Client Quit)
21:04:49 × mikoto-chan quits (~mikoto-ch@ip-83-134-2-136.dsl.scarlet.be) (Ping timeout: 250 seconds)
21:05:23 × dhouthoo quits (~dhouthoo@178-117-36-167.access.telenet.be) (Quit: WeeChat 3.2)
21:11:13 argento joins (~argent0@191.81.228.237)
21:14:45 × fendor_ quits (~fendor@77.119.210.198.wireless.dyn.drei.com) (Remote host closed the connection)
21:15:01 elf_fortrez joins (~elf_fortr@adsl-72-50-4-145.prtc.net)
21:20:01 acidjnk_new joins (~acidjnk@p200300d0c72b95925da55fe159cc0756.dip0.t-ipconnect.de)
21:20:26 Pickchea joins (~private@user/pickchea)
21:20:27 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 240 seconds)
21:20:48 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
21:21:12 azeem joins (~azeem@176.200.202.67)
21:21:38 geekosaur joins (~geekosaur@xmonad/geekosaur)
21:29:12 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
21:32:22 doors joins (~a@p200300ef970830a645b8de8f8152bf35.dip0.t-ipconnect.de)
21:33:07 × azeem quits (~azeem@176.200.202.67) (Ping timeout: 252 seconds)
21:33:11 minimario joins (~minimario@2603:900a:1600:ba00:a4f2:2ae3:8f32:437f)
21:33:16 <doors> Can I make this a valid type alias? type Foo a = Applicative f => a -> f a
21:33:28 <doors> Right now the compiler says "f not in scope".
21:33:40 azeem joins (~azeem@5.168.199.98)
21:34:00 <minimario> i tried to install something with "runhaskell Setup.hs install" (ik i should use cabal, just trying this out), and getting the error "/usr/local/share/doc/x86_64-linux-ghc-8.10.4: createDirectory: permission denied", is there a way to manually install packages like this?
21:35:12 <geekosaur> I think you want to pass --user, the default was --global
21:35:13 <dsal> doors: You're mixing up types and constraints.
21:35:24 <hpc> it depends on what you want
21:35:39 <hpc> if you want a higher-ranked type, with extensions you can do type Foo a = forall f. Applicative f => a -> f a
21:36:00 × hegstal quits (~hegstal@2a02:c7f:7604:8a00:16d:5419:a8cf:3833) (Remote host closed the connection)
21:36:01 gehmehgeh joins (~user@user/gehmehgeh)
21:36:07 <minimario> runhaskell Setup.hs install --user also didn't work
21:36:21 <hpc> if you want f to be whatever has the name f wherever you use Foo, you can use... i forget the extension but then you name it ?f and do a bunch of weird stuff
21:36:34 <doors> hpc: I had RankNTypes but the forall was missing. Thank you.
21:36:36 <hpc> (but you definitely don't want that one, even if you think you do)
21:36:44 <hpc> ah, cool
21:37:53 <monochrom> Refining "didn't work" to the exact verbatim error message would be more helpful.
21:38:04 × MQ-17J quits (~MQ-17J@d14-69-206-129.try.wideopenwest.com) (Ping timeout: 252 seconds)
21:38:09 × d0ku quits (~d0ku@178.43.56.75.ipv4.supernova.orange.pl) (Ping timeout: 248 seconds)
21:38:22 <minimario> oh same as before, "/usr/local/share/doc/x86_64-linux-ghc-8.10.4: createDirectory: permission denied"
21:38:25 <geekosaur> minimario, I think you also havw to configure with --user, but what monochrom said
21:38:34 <minimario> oh i see
21:38:36 × Vajb quits (~Vajb@hag-jnsbng11-58c3ab-85.dhcp.inet.fi) (Read error: Connection reset by peer)
21:38:47 Vajb joins (~Vajb@hag-jnsbng11-58c3ab-85.dhcp.inet.fi)
21:38:48 <monochrom> Ah yeah, "... configure --user"
21:38:56 mikoto-chan joins (~mikoto-ch@83.137.2.251)
21:38:59 <minimario> can you explain why that fixed it
21:39:02 <minimario> (it works)
21:39:53 <monochrom> Setup's way is that most configurations and choices are set in stone at "Setup configure <options>" time. The remaining commands don't change anything.
21:40:15 <minimario> er like, why --user instead of global
21:40:38 <geekosaur> most users don't have permission to install into /usr/local
21:40:38 <monochrom> --global means /usr/local, --user means $HOME
21:40:56 <monochrom> Why --global is the default? Because Setup.hs is for linux distro people.
21:41:32 <monochrom> Note how Setup.hs does not audo-download-build dependencies. Because linux distro people already do that manually.
21:42:44 <monochrom> (and linux distro people will have to add --prefix=/usr)
21:43:32 <hpc> or because they want to pull down build dependencies some other way (like if they're making .debs)
21:44:20 <minimario> gotcha
21:44:21 <minimario> makes sense
21:44:35 <minimario> didn't know --global meant /usr/local and --user meant $HOME
21:44:44 <minimario> but that helps
21:44:45 kuribas parts (~user@ptr-25vy0i9k5kxqroisf0f.18120a2.ip6.access.telenet.be) (ERC (IRC client for Emacs 26.3))
21:45:08 × AWizzArd quits (~code@gehrels.uberspace.de) (Changing host)
21:45:08 AWizzArd joins (~code@user/awizzard)
21:46:52 hannessteffenhag joins (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de)
21:51:27 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
21:51:40 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 240 seconds)
21:52:18 azeem joins (~azeem@5.168.199.98)
21:52:22 × hannessteffenhag quits (~hannesste@ip4d14ffc8.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds)
21:55:55 × micro quits (~micro@user/micro) (Ping timeout: 268 seconds)
21:56:41 micro joins (~micro@user/micro)
21:59:57 × gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving)
22:00:43 × sszark quits (~sszark@h-155-4-128-59.NA.cust.bahnhof.se) (Ping timeout: 250 seconds)
22:04:28 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
22:05:03 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 250 seconds)
22:05:37 azeem joins (~azeem@5.168.199.98)
22:12:10 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 240 seconds)
22:13:41 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
22:14:21 azeem joins (~azeem@5.168.199.98)
22:14:55 Cajun joins (~Cajun@user/cajun)
22:17:49 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
22:19:12 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
22:19:41 MQ-17J joins (~MQ-17J@d14-69-206-129.try.wideopenwest.com)
22:21:34 × doors quits (~a@p200300ef970830a645b8de8f8152bf35.dip0.t-ipconnect.de) (Quit: WeeChat 3.0.1)
22:22:10 son0p joins (~ff@181.136.122.143)
22:22:20 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
22:23:18 × Hanicef quits (~gustaf@81-229-9-108-no92.tbcn.telia.com) (Quit: leaving)
22:24:01 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.2)
22:25:25 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 250 seconds)
22:29:24 lavaman joins (~lavaman@98.38.249.169)
22:33:05 × Gurkenglas quits (~Gurkengla@dslb-088-064-053-140.088.064.pools.vodafone-ip.de) (Ping timeout: 248 seconds)
22:33:27 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 240 seconds)
22:35:14 Morrow_ joins (~Morrow@bzq-110-168-31-106.red.bezeqint.net)
22:41:46 CnnibisIndica is now known as CannabisIndica
22:43:07 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 240 seconds)
22:43:40 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 240 seconds)
22:45:47 × doyougnu quits (~user@c-73-25-202-122.hsd1.or.comcast.net) (Ping timeout: 240 seconds)
22:47:50 azeem joins (~azeem@5.168.199.98)
22:48:32 × jumper149 quits (~jumper149@80.240.31.34) (Quit: WeeChat 3.2)
22:49:49 <jle`> hm .. what's the version of %%= for lens that only modifies/doesn't return a result?
22:50:25 <glguy> %= ?
22:50:26 <jle`> #mylens %%= \x -> ((), f x)
22:50:44 <jle`> ah, thanks :)
22:51:10 <jle`> ooh, it was in Control.Lens.Setter
22:55:34 × minimario quits (~minimario@2603:900a:1600:ba00:a4f2:2ae3:8f32:437f) (Ping timeout: 246 seconds)
22:57:27 × mikoto-chan quits (~mikoto-ch@83.137.2.251) (Ping timeout: 240 seconds)
22:58:17 <hololeap> what was the function that takes a list and repeats infinitely?
22:59:03 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Remote host closed the connection)
23:00:14 <nitrix> repeat ._.
23:00:26 <nitrix> Oh, cycle?
23:00:40 <nitrix> > cycle [1,2,3]
23:00:41 <lambdabot> [1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2...
23:09:22 × machinedgod quits (~machinedg@135-23-192-217.cpe.pppoe.ca) (Ping timeout: 252 seconds)
23:09:38 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea)
23:11:21 × vysn quits (~vysn@user/vysn) (Ping timeout: 250 seconds)
23:13:57 eggplant_ joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
23:15:34 × argento quits (~argent0@191.81.228.237) (Ping timeout: 250 seconds)
23:15:47 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5b4:3a1f:2123:21ea) (Read error: Connection reset by peer)
23:17:32 argento joins (~argent0@168-227-96-26.ptr.westnet.com.ar)
23:25:19 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 252 seconds)
23:27:37 azeem joins (~azeem@5.168.199.98)
23:28:55 dajoer joins (~david@user/gvx)
23:38:47 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 240 seconds)
23:43:51 × acidjnk_new quits (~acidjnk@p200300d0c72b95925da55fe159cc0756.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
23:44:58 azeem joins (~azeem@5.168.199.98)
23:49:31 × azeem quits (~azeem@5.168.199.98) (Ping timeout: 252 seconds)
23:50:11 azeem joins (~azeem@5.168.199.98)

All times are in UTC on 2021-08-27.