Home liberachat/#haskell: Logs Calendar

Logs on 2024-10-03 (liberachat/#haskell)

00:00:09 <dolio> Oh, I guess unless the implementation in that paper has since replaced the original implementation in GHC, because the one in that paper does ensure every transaction sees a consistent memory state (I think).
00:00:29 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
00:01:14 × alexherbo2 quits (~alexherbo@2a02-8440-3118-adab-f186-fae0-9a30-1276.rev.sfr.net) (Remote host closed the connection)
00:01:46 <dolio> They call the property that ensures that, 'opacity.'
00:03:57 <c_wraith> I'm just getting there in the paper...
00:04:50 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
00:04:55 <c_wraith> it would be nice to know if GHC switched inplemrntations
00:05:04 <dolio> Yeah. That I don't know.
00:08:51 × troojg quits (~troojg@user/troojg) (Ping timeout: 276 seconds)
00:12:23 × supercode quits (~supercode@user/supercode) (Quit: Client closed)
00:15:55 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
00:22:16 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 272 seconds)
00:27:52 × JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: JuanDaugherty)
00:32:32 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
00:37:06 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
00:43:00 × nkatte quits (~nkatte@191.177.174.42) (Quit: nkatte)
00:44:11 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
00:45:41 × xff0x quits (~xff0x@2405:6580:b080:900:409b:fd54:4c14:6dc) (Ping timeout: 248 seconds)
00:48:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
00:50:03 × acidjnk quits (~acidjnk@p200300d6e72cfb85cd0cf194bbc9b0a3.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
00:55:04 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
00:55:12 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
01:01:32 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 272 seconds)
01:06:11 × emmanuelux quits (~emmanuelu@user/emmanuelux) (Quit: au revoir)
01:06:17 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
01:06:18 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
01:11:16 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
01:12:07 weary-traveler joins (~user@user/user363627)
01:21:45 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
01:27:42 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
01:33:06 × tomboy64 quits (~tomboy64@user/tomboy64) (Ping timeout: 246 seconds)
01:38:27 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
01:42:13 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
01:42:24 shailangsa joins (~shailangs@host86-182-139-82.range86-182.btcentralplus.com)
01:43:05 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
01:47:05 tomboy64 joins (~tomboy64@user/tomboy64)
01:50:10 athan joins (~athan@syn-098-153-145-140.biz.spectrum.com)
01:54:11 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
01:58:59 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
02:09:42 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
02:14:35 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
02:19:25 × td_ quits (~td@i5387093C.versanet.de) (Ping timeout: 265 seconds)
02:20:56 td_ joins (~td@i5387091A.versanet.de)
02:25:24 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
02:26:46 codaraxis__ joins (~codaraxis@user/codaraxis)
02:29:40 Digitteknohippie joins (~user@user/digit)
02:29:54 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 260 seconds)
02:29:54 × Digit quits (~user@user/digit) (Ping timeout: 260 seconds)
02:29:54 × lambdabot quits (~lambdabot@haskell/bot/lambdabot) (Ping timeout: 260 seconds)
02:30:02 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
02:31:17 lambdabot joins (~lambdabot@haskell/bot/lambdabot)
02:31:17 ChanServ sets mode +v lambdabot
02:34:48 × identity quits (~identity@user/ZharMeny) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.4))
02:36:07 Digitteknohippie is now known as Digit
02:40:50 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
02:43:35 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 265 seconds)
02:45:39 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
02:49:26 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
02:51:07 neuroevolutus joins (~neuroevol@37.19.200.152)
02:51:29 × komikat quits (~user@218.185.248.66) (Ping timeout: 260 seconds)
02:56:26 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
02:56:33 × neuroevolutus quits (~neuroevol@37.19.200.152) (Ping timeout: 256 seconds)
02:56:46 neuroevolutus joins (~neuroevol@146.70.211.46)
03:01:34 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
03:06:13 zmt01 joins (~zmt00@user/zmt00)
03:10:13 × zmt00 quits (~zmt00@user/zmt00) (Ping timeout: 248 seconds)
03:12:46 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
03:17:44 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
03:19:32 aforemny_ joins (~aforemny@i59F4C77A.versanet.de)
03:20:48 × aforemny quits (~aforemny@2001:9e8:6cd7:c200:342e:20f9:8752:4727) (Ping timeout: 265 seconds)
03:26:03 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
03:28:11 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
03:32:44 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
03:41:39 billchenchina- joins (~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe)
03:43:18 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 246 seconds)
03:43:44 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
03:44:18 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
03:45:47 <haskellbridge> <thirdofmay18081814goya> can all problems regarding whether or not a computable function terminates be reduced to a logic program?
03:47:00 <EvanR> is it even a computable function if it doesn't terminate
03:47:09 <EvanR> for some inputs
03:47:39 <EvanR> if not, that makes some undecidable problems computable
03:48:27 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
03:49:49 <haskellbridge> <thirdofmay18081814goya> EvanR: yeah I think termination and computability are distinct things
03:50:00 <EvanR> :thonk:
03:50:13 <EvanR> not saying they are the same
03:51:54 pavonia joins (~user@user/siracusa)
03:51:59 <haskellbridge> <thirdofmay18081814goya> i mean i think they are independent from one another, and termination or non-termination is a property of computable functions
03:52:56 <EvanR> a mathematical function from integers to integers is computable if there's an algorithm which can implement this function, so non-termination wouldn't come up here because of the codomain in the premise
03:53:16 <EvanR> these functions wouldn't be missing any answers, and so an non-termination would be a failure to implement
03:53:42 <EvanR> any* non-termination
03:54:21 <Lears> thirdofmay: Computable functions are mathematical functions; they have no inherent notion of implementation or termination; they're defined at every argument.
03:54:34 <Lears> You probably want the "general recursive functions".
03:55:50 <Lears> "reduced to a logic program" is also unclear.
03:55:54 <EvanR> you could posit a mathematical function into a space that includes an additional bottom value
03:56:07 <EvanR> but I figured that'd be weird
03:56:48 <EvanR> and use a convention that "computing the bottom" means the algorithm provably freezes up xD
03:57:12 <EvanR> haskell maths
03:58:30 <haskellbridge> <thirdofmay18081814goya> ty for ref
03:58:50 × mud quits (~mud@user/kadoban) (Quit: quit)
03:59:09 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
04:00:48 × cyphase quits (~cyphase@user/cyphase) (Ping timeout: 246 seconds)
04:01:10 cyphase joins (~cyphase@user/cyphase)
04:02:30 mud joins (~mud@user/kadoban)
04:03:33 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
04:06:56 × mud quits (~mud@user/kadoban) (Client Quit)
04:08:21 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
04:10:07 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
04:10:25 mud joins (~mud@user/kadoban)
04:12:45 Tisoxin joins (~Ikosit@user/ikosit)
04:14:48 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
04:15:59 amano joins (amano@gateway/vpn/airvpn/amano)
04:16:36 <amano> Let's assume StateT (DataType a) m a. Can StateT replace DataType a with DataType b?
04:17:10 <amano> I mean StateT (DataType a) m ()
04:20:37 <Lears> :t StateT
04:20:38 <lambdabot> (s -> m (a, s)) -> StateT s m a
04:20:41 <c_wraith> nothing in mtl/transformers provides that. mmorph doesn't seem to provide that. lens *does*, as part of the Zoom interface.
04:21:20 <c_wraith> the trick, and why it appears in lens, is that the transformation needs to be bidirectional
04:21:51 <amano> Then, I have to use existential typeclass in a data type?
04:22:19 <c_wraith> uh, not sure what you mean by that.
04:22:32 <Lears> StateT uses the same type for the input state as the output state; so not unless you change both. If you lift this restriction with your own StateT', then you cannot make it a Monad, though you can make it an indexed monad.
04:23:01 <Lears> If the type parameter to `DataType` is recoverable, then yes, it's simplest just to hide it with `Some DataType`.
04:23:23 <c_wraith> I just mean that in (s -> m (a, s)), s appears in both positive and negative position. This means it's not covariant or contravariant - you can't map it simply.
04:23:42 <c_wraith> Lens is all about bidirectional mapping, so it handles that case relatively easily.
04:25:54 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
04:26:29 <amano> I mean data SomeType = forall a. TypeClass a => SomeType a
04:26:33 <amano> This is existential typeclass
04:27:11 <c_wraith> and it's kinda useless.
04:27:16 <amano> Why?
04:27:41 <amano> This is the only way I know to use multiple typeclass instances in StateT.
04:27:44 <c_wraith> it's no different from just passing around a function, or a record of them.
04:28:03 <amano> I know it can be represented as a record of functions....
04:28:11 <amano> But, I prefer existential typeclass...
04:28:48 <Lears> I don't know why there's a class involved here at all? All you need is `data Some f = forall a. Some (f a)`.
04:29:20 <dmj`> * uses existential to solve problem, now has two problems *
04:29:21 <amano> What is f?
04:29:31 <Lears> `DataType`
04:29:58 <amano> I need `a` to be a typeclass instance.
04:30:17 <amano> I need to call a few functions on `a`.
04:30:18 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
04:30:36 <amano> You can write functions without a typeclass, but a typeclass makes it formal.
04:30:54 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
04:34:32 <amano> Sometimes, existential typeclass seems to be the right way.
04:34:46 <c_wraith> It's only ever added complexity when I've used it
04:35:09 <amano> But, polymorphism can split a giant case statement into tiny ones.
04:35:30 <amano> StateT is involved, so I have to hide polymorphism in an existential data type.
04:35:49 <amano> Right now, I have a big sum type....
04:35:54 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
04:36:07 <amano> A big sum type requires a giant case statement or a long list of pattern match statements.
04:36:25 <amano> Polymorphism splits a giant case statement into multiple modules.
04:37:00 <amano> Polymorphism unentangles a giant sum type.
04:37:08 <jackdk> Would you be able to help me take a step back from the Haskell features you're considering to solve your problem, and help me understand the problem you're trying to solve?
04:37:12 <dmj`> sounds like you're using existentials to avoid more typing
04:37:14 <amano> Simplicity results from pulling things apart.
04:37:16 <c_wraith> When you're taking an operation-oriented viewpoint, I prefer to focus on the operations. Not some fake data type designed to hide them.
04:37:39 <amano> dmj`: There is no other type that allows polymorphism in StateT.
04:37:59 michalz joins (~michalz@185.246.207.203)
04:38:11 <amano> I can't eliminate StateT because I'm using someone else's library which is used by many people.
04:38:57 <dmj`> amano: why do you need to abstract over StateT
04:38:59 <amano> You are stuck with existential typeclass, a giant case statement, a giant record type, or a giant list of pattern match statements.
04:39:11 <amano> dmj`: I didn't need. StateT is used by brick TUI library.
04:39:12 <dmj`> amano: paste code
04:39:58 <amano> data EventM n s a = ... StateT s ...
04:40:08 <amano> I need polymorphism in EventM.
04:40:18 <amano> polymorphism for s in EventM.
04:41:03 <amano> s is application state which consists of many modes...
04:41:19 <amano> It can be a typeclass or a sum type or a giant record type which carries state for all modes.
04:42:26 <dmj`> yea why not just use a giant record, use lenses to get and set stuff
04:42:47 <amano> That's not elegant.
04:42:57 <amano> The author of brick uses a giant record.
04:43:00 <amano> I have used a giant sum type.
04:43:41 <dmj`> well I'm sure its a mix of both
04:44:01 <amano> I want to unentangle my application design.
04:44:18 <dmj`> what is the application you're trying to design
04:44:35 <amano> I already finished writing it months ago.
04:45:10 <dmj`> well it's hard to discuss tradeoffs w/o knowing what it does
04:45:35 <amano> https://codeberg.org/amano.kenji/brick-trading-journal
04:46:35 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
04:48:03 <amano> It is a program that can be written with existential typeclass.
04:48:10 <dmj`> so you do have a big sum for BrickEvent and a big product
04:48:39 <dmj`> what benefit do you so in doing that?
04:48:40 <c_wraith> I mean, you could just do a tagless final encoding.
04:48:53 <amano> What is tagless final encoding?
04:48:56 <dmj`> do you see* (exist. typeclass approach)
04:49:31 <dmj`> no shiny things yet, why use an existential typeclass
04:49:52 <amano> I don't like giant case statements.
04:49:55 <dmj`> are you trying to "componentize" your application
04:49:55 <c_wraith> Divide your functionality up into a set of classes and write all your code as polymorphic over the set of classes it needs on the state. Only choose a concrete type that implements all those classes in one spot.
04:50:55 <c_wraith> no need for an existential at all.
04:51:04 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
04:51:09 <amano> c_wraith: I'm afraid that StateT is compatible with that.
04:51:22 <amano> I can't just ditch StateT which comes from brick which I have no control over.
04:51:30 <c_wraith> StateT works fine with it
04:51:39 <amano> Can you show me an example code?
04:51:40 <c_wraith> Foo s => StateT s m a
04:52:07 <amano> But, state transformations can't replace Foo s1 with Foo s2.
04:52:19 <c_wraith> Write your class so they don't need to
04:52:48 <amano> You mean a giant sum type or a giant record as a typeclass instance?
04:52:51 <dmj`> amano: well then you can make a nested sum type, data Event = EventFoo FooEvent | EventBar BarEvent, so you'd have smaller case statements for each part of the app, then you can use "zoom" on each
04:53:20 <haskellbridge> <sm> interesting app
04:53:48 <dmj`> amano: are you familiar with zoom
04:53:54 <amano> dmj`: zoom zoom yes.
04:54:10 <amano> I have used zoom extensively in my application.
04:54:56 <c_wraith> Having an existential over the state type requires runtime checking identical to what just being concrete does.
04:55:16 <amano> c_wraith: I want to see an example or a description.
04:55:32 <amano> Your suggestion seems no different than a giant case statement that I already have now.
04:55:45 <amano> or a giant record
04:56:26 <amano> You are telling me to hide a giant case statement behind one typeclass intance, correct?
04:56:40 <c_wraith> you were talking about modularization. I'm telling you how to modularize it.
04:57:03 <amano> How would I modularize https://codeberg.org/amano.kenji/brick-trading-journal/src/branch/master/app/Main.hs ?
04:57:21 <amano> I just can't envision what you said.
04:58:06 <haskellbridge> <sm> do you mean, big cases like this one ? modehttps://codeberg.org/amano.kenji/brick-trading-journal/src/commit/2111a0b66bfe51a31dc818b4a0592a90c81c5819/app/Main.hs#L108
04:58:10 <amano> Does tagless final mean erasing typeclass constraints later?
04:58:15 <haskellbridge> <sm> * https://codeberg.org/amano.kenji/brick-trading-journal/src/commit/2111a0b66bfe51a31dc818b4a0592a90c81c5819/app/Main.hs#L108
04:58:32 <amano> Yes
04:58:33 × Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity)
04:59:24 <amano> Next time, I design a haskell application, I want to be free of a giant sum type or a giant record.
05:00:05 <dmj`> amano: zoom solves your problem for giant record, but giant sum make a tree of the sum types (as I posted above), then case on the sums and pass the action to the zoomed part of the state
05:00:10 <haskellbridge> <sm> in https://github.com/simonmichael/hledger/blob/master/hledger-ui/Hledger/UI/Main.hs#L300 you can see I broke it up into a separate module for each type of screen.. but there's so much boilerplate, I'm not sure that your way isn't better
05:00:22 <c_wraith> this seems like the perfect case for a record of functions.
05:00:35 <c_wraith> You can easily split it into lots of related parts
05:01:45 <c_wraith> (If you see an event type you don't know how to handle, pass it along to the next handler)
05:01:59 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
05:02:49 <amano> sm: That just looks like a sum type.
05:03:41 <amano> Your case statement just uses different functions for each mode.
05:04:13 <haskellbridge> <sm> yes, it's still a big case statement, but split up into per-screen modules
05:05:01 <haskellbridge> <sm> and each module still has a fairly big case. I think it's the natural shape of this type of code, really
05:05:20 <amano> Except my application has more modes....
05:05:24 <haskellbridge> <sm> I mean: a long list of possible events and state code to handle each
05:05:32 <amano> I don't really want to see a bigger case statement.
05:05:35 <haskellbridge> <sm> * states, and
05:05:51 <amano> Your design is basically the same as mine.
05:05:59 <haskellbridge> <sm> yup
05:06:23 <c_wraith> there's no way to escape from "I have all these cases that need to do different things"
05:06:29 <c_wraith> that's... what the code does.
05:06:34 <c_wraith> There are a lot of different things.
05:06:39 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
05:06:42 <dmj`> yea the state has got to live somewhere
05:06:43 <amano> Polymorphism, help me.
05:06:54 <c_wraith> That just splits the code apart.
05:07:03 <c_wraith> You can do that by writing functions, too
05:07:21 <haskellbridge> <sm> now how does it look different in OO code ? The logic must be the same but maybe it looks more tidy ?
05:07:26 <amano> Existential typeclass unentangles the code cleanly.
05:08:31 <dmj`> amano: how does an existential type class remove the number of constructors have you have to pattern match on?
05:08:37 <haskellbridge> <sm> c_wraith: this sounds interesting. I am wary of records of functions though, they make introspection and debugging hard
05:08:50 <amano> In a presentation called simple made easy by rich hickey, he said switch statement and pattern matching entangle multiple who/what pairs....
05:09:02 <amano> Polymorphism unentangles such things...
05:09:13 <c_wraith> Rich Hickey is mostly wrong about Haskell
05:09:16 <c_wraith> I wouldn't trust him
05:09:29 <amano> dmj`: There is no pattern matching if you use existential type class...
05:09:36 <amano> There is only polymorphic dispatch.
05:09:50 <c_wraith> You mean the same as if you have a function?
05:10:00 <dmj`> amano: you still have to dispatch on all constructors though, it just moves the logic somewhere else
05:10:16 <amano> c_wraith: He may be the wrong about haskell types, but he is right about simplicity.
05:10:24 <haskellbridge> <sm> well I for one would like to see any other method of organising brick code
05:10:34 <c_wraith> By the way: it's 100% fine to have a record with one function and one string value for "how to display this"
05:10:46 <haskellbridge> <sm> maybe check the other brick apps ?
05:10:53 <amano> Existential typeclass is the new way of organizing brick code...
05:11:05 <dmj`> amano: do you have an example you can show
05:11:09 <c_wraith> Which is a simpler way of doing the same thing as the existential typeclass antipattern
05:11:24 <amano> c_wraith: Why is it an antipattern?
05:11:42 <amano> It is just said to be an antipattern by a few people, but they didn't really explain much....
05:11:50 <c_wraith> Because it's lots of extra indirection around just having a function
05:11:56 <amano> Just saying it is an antipattern doesn't make it an anti-pattern.
05:11:57 <c_wraith> You could just write direct code instead
05:12:16 <amano> There is not a lot of extra indirection.
05:12:27 <amano> It's just polymorphic dispatch.
05:12:57 <haskellbridge> <sm> why not write a small prototype and show us
05:12:59 <probie> amano: `data T = forall a . C a => T a` and `data T = forall a . T (R a) a` are "the same"
05:13:31 <Lears> @where existential-antipattern
05:13:32 <lambdabot> "Haskell Antipattern: Existential Typeclass" by Luke Palmer at <https://web.archive.org/web/20220121105027/https://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/>
05:13:37 <dmj`> amano: you can remove your giant case if you make your sum type more granular
05:14:19 <Lears> amano: ^ I think this is the origin of the notion, though it's been echoed far more loudly than is merited.
05:14:24 <amano> sm: data AppState = forall n. UIState ui => AppState { uiState :: ui, ... }
05:15:08 <amano> You can put multiple different UIState instances in uiState.
05:15:25 <amano> UIState type class has draw function and handleEvent function....
05:15:32 <amano> You call draw and handleEvent on ui.
05:15:41 <haskellbridge> <sm> I mean, a working prototype. When it comes to this stuff that's all I trust
05:15:57 <amano> sm: I don't have a working prototype, but that should work.... That's the idea.
05:16:22 <amano> That's existential typeclass...
05:16:46 <amano> dmj`: A more granular sum type would require a bigger case statement....
05:16:48 <haskellbridge> <sm> you said Existential typeclass is the new way of organizing brick code, and dmj asked for an example.. I'd like to see that too
05:16:49 <amano> Granular means more...
05:16:57 <probie> If `R` is a record with every element being a function which takes `a` as the first argument (and doesn't not take `a` anywhere else), then there's a function `R a -> a -> R ()` (i.e you can drop the existential)
05:17:05 <amano> sm: That's the only example I have for now...
05:17:12 <monochrom> Yeah I am wondering what's the purpose of all this hour of hot air is about. If you already have a stance, just do it, why "argue".
05:17:18 <haskellbridge> <sm> ok. I thought maybe you had seen it used.
05:17:26 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
05:18:15 <probie> then you can come up with a new type `R'` which is `R`, but simply "removes" the first argument of every function in the record, and there's also a function from `R () -> R'` at which point it seems like you don't even need polymorphism
05:18:19 <amano> monochrom: I thought maybe other people had an idea that's better in all aspects....
05:18:41 <amano> sm: Can you understand my example?
05:18:56 <monochrom> Huh, all aspects? Look up the "expression problem" already. There is none.
05:18:58 takuan joins (~takuan@178-116-218-225.access.telenet.be)
05:19:17 <amano> Okay, anybody know something better?
05:20:26 <haskellbridge> <sm> https://hackage.haskell.org/package/matterhorn-90000.0.1/docs/src/Matterhorn.Events.html#onEvent has split up the giant case statement into separate functions...
05:20:55 <dmj`> ^ what sm posted is what I'm referring to
05:20:59 <dmj`> amano:
05:21:00 <haskellbridge> <sm> amano: no I can't, or if I did I wouldn't trust my understanding till I saw it working
05:21:48 <amano> sm: Look up haskell existential typeclass.
05:21:58 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
05:22:14 <amano> That's just pattern matching....
05:22:27 JuanDaugherty joins (~juan@user/JuanDaugherty)
05:22:37 <amano> I was trying to avoid a huge list of pattern match statements, too.
05:22:42 × ThePenguin quits (~ThePengui@cust-95-80-24-166.csbnet.se) (Ping timeout: 246 seconds)
05:23:00 <dmj`> amano: you don't need it to be an existential typeclass if you split up the case into separate functions, can just use a regular typeclass
05:23:28 <dmj`> but the logic has to live somewhere, be it in a case, a function, or an instance
05:23:29 <amano> dmj`: StateT doesn't allow replacing one typeclass instance with another.
05:24:03 <amano> JuanDaugherty: Are you brick author?
05:24:14 <dmj`> amano: that doesn't matter, it doesn't have to
05:24:17 <JuanDaugherty> amano, no.
05:24:30 <monochrom> I feel like this is religiously avoiding pattern matching at all costs, not rationally avoiding pattern matching under an informed decision on a case-by-case basis, just because a celebrity said to.
05:24:33 × sand-witch quits (~m-mzmz6l@vmi833741.contaboserver.net) (Ping timeout: 245 seconds)
05:24:50 <amano> monochrom: I just want polymorphism... That's all...
05:24:53 <monochrom> s/informed/weighed/ even
05:25:05 <JuanDaugherty> google's 'generative AI' gives an amusing result for "ghc major version timeline"
05:25:09 × aforemny_ quits (~aforemny@i59F4C77A.versanet.de) (Ping timeout: 246 seconds)
05:25:15 <JuanDaugherty> apparently stack versions
05:25:23 <monochrom> OK s/avoiding pattern matching/going for polymorphism/ same difference.
05:25:45 <amano> And, I actually like splitting up each mode into different files...
05:25:55 <monochrom> BTW do you like my pun with "on a case-by-case basis"? >:)
05:26:11 <amano> I haven't seen any roadblock for using existential typeclass in my application.
05:26:59 aforemny joins (~aforemny@i59F4C77A.versanet.de)
05:27:57 sand-witch joins (~m-mzmz6l@vmi833741.contaboserver.net)
05:28:05 <probie> amano: Can you give me a toy example of what "needs" existential typeclasses, and I'll attempt to give an example that doesn't use them _and_ meets your requirement of not being a giant case statement?
05:28:28 <amano> I don't need anything technically.
05:28:43 <amano> I just prefer existential typeclasses in my application.
05:29:06 <amano> probie: No giant case statement. No giant list of pattern matching function statements.
05:29:17 <amano> probie: https://codeberg.org/amano.kenji/brick-trading-journal/src/branch/master/app/Main.hs#L108
05:30:09 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
05:32:51 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
05:33:20 <probie> That's not a toy example though :p Hang on, let me write something
05:35:47 × neuroevolutus quits (~neuroevol@146.70.211.46) (Ping timeout: 256 seconds)
05:37:37 <JuanDaugherty> "timeline of ghc major versions" is an irritating rabbit hole but "when was ghc 6.4 released" does the right thing
05:37:44 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
05:39:42 tzh_ joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net)
05:40:23 × JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: JuanDaugherty)
05:40:41 × tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Ping timeout: 252 seconds)
05:41:55 <haskellbridge> <thirdofmay18081814goya> for any total hylomorphism is time complexity decidable?
05:43:42 × TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 246 seconds)
05:43:56 × hueso quits (~root@user/hueso) (Ping timeout: 255 seconds)
05:44:06 hueso joins (~root@user/hueso)
05:45:52 TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker)
05:48:23 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
05:52:48 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
06:00:09 × m5zs7k quits (aquares@web10.mydevil.net) (Ping timeout: 246 seconds)
06:01:52 adanwan_ joins (~adanwan@gateway/tor-sasl/adanwan)
06:02:11 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 260 seconds)
06:03:51 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
06:03:58 <probie> amano: https://play.haskell.org/saved/Lcwk9WaE for a boring record solution that may still allow you to do what you want
06:06:42 araujo joins (~araujo@216.73.163.154)
06:08:53 <amano> That's not how I am going to organize brick code.
06:09:25 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
06:11:07 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
06:11:11 <haskellbridge> <sm> It's a nice example but I have doubts about this when it grows into a real world app. I used to use records-of-functions in mine, and it made debugging very difficult.
06:11:33 m5zs7k joins (aquares@web10.mydevil.net)
06:13:00 <amano> sm: I don't even know how to debug a haskell application.
06:13:39 <haskellbridge> <sm> haven't you had a bug in yours yet ?
06:13:49 <probie> sm: I don't think it scales either, but I posit it is _no worse_ for that than `data SomeType = forall a. TypeClass a => SomeType a`
06:13:53 <amano> sm: Not yet.
06:13:58 neuroevolutus joins (~neuroevol@146.70.211.46)
06:14:35 <amano> probie: Your example is more convoluted than existential typeclass...
06:14:42 <haskellbridge> <sm> amano: I think your giant case statement might be helping - it's simple and clear!
06:15:17 <amano> At least, existential typeclass is easy to reason about.
06:15:37 <amano> Its drawback is type information loss.
06:15:39 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
06:18:47 × benjaminl quits (~benjaminl@user/benjaminl) (Read error: Connection reset by peer)
06:19:03 benjaminl joins (~benjaminl@user/benjaminl)
06:22:33 <amano> Why do people want to avoid existential typeclass when it seems easy and simple?
06:25:52 <amano> I'm not going to rewrite my application with existential typeclass, but my next application will attempt existential typeclass.
06:26:32 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
06:27:02 × amano quits (amano@gateway/vpn/airvpn/amano) (Quit: amano)
06:29:58 <probie> Is a record of functions actually more convoluted than an existential typeclass?
06:31:18 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
06:31:30 <Lears> It kinda is when e.g. `click :: a -> a` becomes `data Widget = Widget{ click :: Widget, ... }`.
06:35:21 <probie> The type is more generic, since `click :: Widget -> Widget` is really modelling `click :: Widget a => a -> SomeWidget`
06:37:07 <Lears> In any case, the "existential antipattern" is given vastly more weight by the Haskell community than it deserves. The worst misuses of existentials cut themselves off with dead ends, while the lesser ones merely leave your code base a little clunkier than it needs to be.
06:37:16 <Lears> They just aren't something that needs to be so desperately avoided.
06:42:15 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
06:43:33 <probie> I still don't really buy that a record of functions is more convoluted; there's one less layer of indirection. I think it just "feels" more different from what you'd do in an OO language.
06:45:25 <geekosaur> I suppose that depends on what you're doing with it. I really wouldn't want to have to shoehorn xmonad's `LayoutClass` into a record of functions, given that constructors are (`State`-style) "mutable"
06:45:55 <Lears> I'm pretty much a Haskell native, just BTW.
06:46:42 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
06:47:03 amano joins (amano@gateway/vpn/airvpn/amano)
06:47:17 <amano> Okay. No more debate. I'm just going to use existential typeclass without asking a question like a man.
06:47:42 <amano> Next time I write something, use existential typeclass... without a question like a real man.
06:48:14 <amano> Asking questions about existential typeclass without using it is autistic.
06:48:26 <geekosaur> watch your language
06:48:48 <probie> I'm pretty sure it's a thing neurotypical people do as well tbh
06:49:08 <amano> Autism'
06:49:20 <amano> The characteristic of autism is obsession over details.
06:49:31 <amano> Masculine competitive men don't obsess over details.
06:49:38 <amano> They don't think too much.
06:49:45 <geekosaur> common but not characteristic
06:49:46 <dibblego> remember when #haskell was interesting
06:50:14 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
06:50:25 <probie> dibblego: the early days of lenses?
06:50:35 <dibblego> haha, before then even
06:51:02 <amano> A ahracteristic of autism is inflexible patterns of behavior. Lack of flexibility.
06:51:09 <amano> * characteristic
06:51:36 <geekosaur> actually, I figured out early on that that didn't work and flipped it on its head
06:53:00 <geekosaur> not that anyone had a clue about high-cog autism back then
06:53:05 <geekosaur> (myself included)
06:54:44 <amano> Inflexibility leads to obsession over details...
06:55:04 <amano> If you are willing to adapt, you don't pay too much attention to details.
06:55:15 × neuroevolutus quits (~neuroevol@146.70.211.46) (Quit: Client closed)
06:55:25 <geekosaur> I'm not the one who seems to be obsessing here
06:55:36 <amano> geekosaur: Right. I was obsessing.
06:55:42 <amano> I am trying to become a real man.
06:55:48 <amano> overcome my autism.
06:56:58 <probie> I'm trying to overcome my blue eyes. No luck so far
06:57:04 <amano> Oh, I have to use this. I have to. I have to compare pros and cons because I have to make sure it is the best option.
06:57:21 <amano> Shut up. You are autistic. Become a man. Adapt.
06:57:35 <Lears> Setting aside this overly divergent tangent, I should point out that the actual loss of type information is not necessary so long as the set of alternatives is statically known.
06:57:43 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
06:57:53 ThePenguin joins (~ThePengui@cust-95-80-24-166.csbnet.se)
06:58:14 <Lears> You can replace the existential with a sum GADT that allows you to recover the type within.
06:58:27 <amano> Lears: That's what I'm already doing. A giant sum type.
06:58:40 <amano> Next time, I want to try existential typeclass and gather direct experiences.
06:59:00 <Lears> I mean that, you can use e.g. `data Sum f xs = forall x. Sum (Index x xs) (f x)`.
06:59:43 <amano> What is that type?
07:00:04 × caconym quits (~caconym@user/caconym) (Quit: bye)
07:00:18 <Lears> (where e.g. `data Index x xs where { Z :: Index x (x:xs); S :: Index x xs -> Index x (y:xs) }`)
07:00:41 caconym joins (~caconym@user/caconym)
07:00:49 <Lears> The `f` can hold a constraint on `x`, if you need one.
07:02:09 <Lears> Then `Sum f [X, Y, Z]` can be any one of `f X`, `f Y` or `f Z`, the type being recoverable by matching on the index. When you don't care, you just use `f x`.
07:02:16 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:02:27 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
07:04:06 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 265 seconds)
07:06:25 <probie> And you can also write helpful functions like `All p xs => (p x => x -> y) -> Sum I xs -> Sum (K y) xs` à la generics-sop? :p
07:06:35 <amano> Lears: Wait. Does that type have to have all relevant types in the type signature?
07:06:40 <amano> That's ugly.
07:07:07 <Lears> amano: You'd only declare them in one place, then put it either in a type synonym or under a newtype.
07:07:26 <amano> I still prefer existential typeclass.
07:07:43 <amano> I actually don't care type information loss...
07:07:47 <amano> I shouldn't care about internal details....
07:08:10 <amano> My specific application doesn't care about details like a real man.
07:08:28 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
07:09:22 × billchenchina- quits (~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe) (Remote host closed the connection)
07:10:55 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
07:15:29 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
07:16:19 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds)
07:17:27 <jackdk> My experience is that things all seem to be fine initially but then at some point in the future I wound up having to use higher-powered tools from packages like `constraints` and ended up regretting my choices. But I don't have that code any more so I can't make the example concrete.
07:17:27 × AWizzArd quits (~code@user/awizzard) (Read error: Connection reset by peer)
07:20:49 <jackdk> It also dovetails nicely with my stance on typeclasses, which I think are justified only when one wants (commonly) to abstract over a bunch of related types, _using laws_, or (less commonly) needs to do type-directed dispatch in something like `servant`. Otherwise, I tend to find they obscure more than they help (`data-default`), or invite silent changes where you don't expect them (any serialisation typeclass ever), or
07:21:27 <jackdk> , or you have to invent `newtype`s just to make things line up, or start playing around with dark magic like `reflection` because you _only_ have access to a typeclassy interface.
07:22:16 <amano> That's not a good reason to avoid existential typeclasses when they seem to make sense.
07:22:56 <amano> For self-contained end-user applications, existential typeclasses don't really hurt much.
07:23:09 lxsameer joins (~lxsameer@Serene/lxsameer)
07:23:12 <amano> Libraries may need to pay more attention because they affect other people.
07:23:28 AWizzArd joins (~code@gehrels.uberspace.de)
07:24:23 <jackdk> Another example: the amount of (cool) machinery that `constraints-extras` uses to prove things like "given GADT tag x, we have `Show (f a)` for every possible `x` in `tag`" is much greater than just being able to accept a function `(tag x -> f x -> String)`
07:24:42 <amano> My types are simple, and my existential typeclasses will be simple, too.
07:25:01 <jackdk> *shrug* you do you, man
07:26:19 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
07:26:19 × synchromesh quits (~john@2406:5a00:241a:5600:cddc:9175:fad4:c3aa) (Read error: Connection reset by peer)
07:26:24 <jackdk> The heuristic I outlined has worked well for me across multiple contexts, and came from some painful and frustrating lessons.
07:26:41 synchromesh joins (~john@2406:5a00:241a:5600:c4f0:795f:9391:8816)
07:27:16 <amano> I just aim for orthogonal design which is totally compatible with existential typeclasses.
07:27:26 <amano> When different typeclasses need to know each other, they break down.
07:27:41 <amano> When things are disentangled, existential typeclasses don't hurt.
07:27:55 <amano> They don't need to know each other, and everything is fine.
07:28:42 <amano> In my application, ui mode is totally independent from ui state. Thus, I can have an existential typeclass for ui mode and another for ui state.
07:28:57 <jackdk> When I have been that confident in how I expect my code to evolve, I have often been humbled N < 10 months down the line.
07:29:46 <amano> If I fail to predict module boundaries, then existential typeclasses break down.
07:30:27 xff0x_ joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
07:30:32 <amano> My application is largely finished and will probably not change....
07:30:32 × alioguzhan quits (~Thunderbi@78.173.89.238) (Remote host closed the connection)
07:30:43 <amano> until my death probably.
07:30:49 alioguzhan joins (~Thunderbi@78.173.89.238)
07:30:59 <jackdk> I believe that one must be clairvoyant to reliably predict module boundaries. Applying modus ponens, we then conclude...
07:31:02 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
07:31:56 <jackdk> Anyway, not my code, not my problem if the design hits trouble. I wish you the very best of luck and I genuinely hope that it succeeds.
07:32:20 <amano> The code is not the problem. The problem is the pilot that uses the program.
07:32:53 <probie> I've given up attempting any sort of predication and (for personal projects) just start by dumping everything in a single module to be pulled apart as it becomes clearer how to do so
07:33:38 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 252 seconds)
07:33:46 <amano> probie: My application is already complete.
07:34:38 × amano quits (amano@gateway/vpn/airvpn/amano) (Quit: amano)
07:35:15 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
07:38:10 polyphem joins (~rod@p4fc2c55e.dip0.t-ipconnect.de)
07:39:52 × arahael quits (~arahael@user/arahael) (Remote host closed the connection)
07:41:44 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
07:42:47 machinedgod joins (~machinedg@d50-99-47-73.abhsia.telus.net)
07:42:52 × tzh_ quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz)
07:46:43 wootehfoot joins (~wootehfoo@user/wootehfoot)
07:46:49 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
07:48:30 × raym quits (~ray@user/raym) (Quit: updating server)
07:54:35 misterfish joins (~misterfis@84.53.85.146)
07:57:33 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
08:02:24 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
08:12:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
08:17:05 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
08:25:57 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
08:26:05 Inst_ joins (~Inst@user/Inst)
08:27:42 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
08:28:41 × Inst quits (~Inst@user/Inst) (Ping timeout: 265 seconds)
08:32:17 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
08:39:19 mari-estel joins (~mari-este@dynamic-176-000-160-069.176.0.pool.telefonica.de)
08:39:56 alexherbo2 joins (~alexherbo@2a02-8440-3207-288e-206f-9822-5a5d-6079.rev.sfr.net)
08:43:08 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
08:44:07 × alexherbo2 quits (~alexherbo@2a02-8440-3207-288e-206f-9822-5a5d-6079.rev.sfr.net) (Remote host closed the connection)
08:46:58 acidjnk joins (~acidjnk@p200300d6e72cfb63d87029be15e343a0.dip0.t-ipconnect.de)
08:47:54 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
08:50:44 × feetwind quits (~mike@user/feetwind) (Quit: WeeChat 4.1.2)
08:52:35 liamzy__ joins (~Inst@user/Inst)
08:55:01 × Inst_ quits (~Inst@user/Inst) (Ping timeout: 252 seconds)
08:58:44 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
09:03:29 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
09:12:14 yoneda joins (~mike@193.206.102.122)
09:13:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
09:14:19 kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be)
09:17:45 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
09:19:11 raym joins (~ray@user/raym)
09:26:41 × leah2 quits (~leah@vuxu.org) (Ping timeout: 255 seconds)
09:28:38 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
09:32:48 sawilagar joins (~sawilagar@user/sawilagar)
09:33:26 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
09:39:56 leah2 joins (~leah@vuxu.org)
09:43:49 × xff0x_ quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 248 seconds)
09:44:04 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
09:44:35 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
09:46:34 × misterfish quits (~misterfis@84.53.85.146) (Ping timeout: 272 seconds)
09:48:56 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
09:55:23 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 245 seconds)
09:55:25 × sawilagar quits (~sawilagar@user/sawilagar) (Remote host closed the connection)
09:55:39 sawilagar joins (~sawilagar@user/sawilagar)
09:59:40 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
09:59:56 Digitteknohippie joins (~user@user/digit)
10:00:30 × Digit quits (~user@user/digit) (Ping timeout: 272 seconds)
10:02:58 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
10:04:04 __monty__ joins (~toonn@user/toonn)
10:04:17 × pointlessslippe1 quits (~pointless@62.106.85.17) (Read error: Connection reset by peer)
10:04:42 × Digitteknohippie quits (~user@user/digit) (Ping timeout: 252 seconds)
10:06:54 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
10:09:32 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
10:09:34 × mari-estel quits (~mari-este@dynamic-176-000-160-069.176.0.pool.telefonica.de) (Ping timeout: 260 seconds)
10:10:13 pointlessslippe1 joins (~pointless@62.106.85.17)
10:14:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
10:16:38 × hueso quits (~root@user/hueso) (Ping timeout: 245 seconds)
10:17:36 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 272 seconds)
10:18:53 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
10:19:51 <probie> I remember last time I tried to use llvm as a library with Haskell (which was probably ~5 years ago) it was a bit of a headache making versions line up. Are there any other reasonable alternatives with some Haskell support for a JIT compiler (that works on aarch64)?
10:23:18 × araujo quits (~araujo@216.73.163.154) (Remote host closed the connection)
10:29:33 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
10:33:03 × sawilagar quits (~sawilagar@user/sawilagar) (Remote host closed the connection)
10:33:27 sawilagar joins (~sawilagar@user/sawilagar)
10:34:11 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
10:41:46 xff0x joins (~xff0x@2405:6580:b080:900:1c0c:a36e:c661:24b2)
10:41:48 morb joins (~morb@pool-108-41-100-120.nycmny.fios.verizon.net)
10:45:00 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
10:46:19 × morb quits (~morb@pool-108-41-100-120.nycmny.fios.verizon.net) (Ping timeout: 260 seconds)
10:48:21 lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4)
10:49:48 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
10:56:15 × alp_ quits (~alp@2001:861:e3d6:8f80:ae1f:5c06:1786:e17) (Ping timeout: 246 seconds)
10:56:55 Digit joins (~user@user/digit)
11:00:04 × caconym quits (~caconym@user/caconym) (Quit: bye)
11:00:32 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
11:02:16 caconym joins (~caconym@user/caconym)
11:05:00 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
11:15:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
11:16:31 smalltalkman joins (uid545680@id-545680.hampstead.irccloud.com)
11:19:52 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
11:24:03 libertyprime joins (~libertypr@118-92-68-68.dsl.dyn.ihug.co.nz)
11:30:44 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
11:35:54 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
11:38:35 codaraxis joins (~codaraxis@user/codaraxis)
11:41:32 × codaraxis__ quits (~codaraxis@user/codaraxis) (Ping timeout: 265 seconds)
11:43:27 codaraxis__ joins (~codaraxis@user/codaraxis)
11:46:17 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
11:47:34 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 260 seconds)
11:48:21 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
11:51:12 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
11:52:00 identity joins (~identity@user/ZharMeny)
12:01:02 × libertyprime quits (~libertypr@118-92-68-68.dsl.dyn.ihug.co.nz) (Ping timeout: 255 seconds)
12:01:10 <tomsmeding> the llvm problem is still there
12:01:46 <tomsmeding> probie: consider llvm-pretty, which is just an LLVM IR pretty-printer but you can pass that to the `clang` command-line program to compile it
12:01:49 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
12:01:54 <tomsmeding> LLVM version issues mostly disappear
12:02:09 <probie> tomsmeding: That works as pretty well for an AOT compiler, but not for a JIT
12:02:19 <tomsmeding> what's the difference, really?
12:03:23 <tomsmeding> if you need to call back and forth between the compiled code and functions in your own executable, compile the LLVM IR to a .so and dlopen() that
12:04:01 <tomsmeding> sure, clang takes a while to compile code, but then most (admittedly not all) of that time is in LLVM anyway
12:04:38 <tomsmeding> if you feel this LLVMIR-to-clang approach is too slow for JIT, then you'll not have much more luck binding to LLVM directly
12:06:13 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 245 seconds)
12:07:12 <probie> That's fair. If I'm going that route, I might also play around with QBE and see how that works out
12:07:27 <tomsmeding> (I was just going to mention QBE as well :P)
12:16:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
12:20:37 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
12:23:09 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 260 seconds)
12:26:32 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
12:31:36 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
12:36:38 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
12:41:57 × aforemny quits (~aforemny@i59F4C77A.versanet.de) (Ping timeout: 248 seconds)
12:47:04 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
12:50:09 × pointlessslippe1 quits (~pointless@62.106.85.17) (Read error: Connection reset by peer)
12:52:36 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 276 seconds)
12:56:17 × nckhexen quits (nckx@libera/staff/owl/nckx) (Ping timeout: 608 seconds)
12:57:28 weary-traveler joins (~user@user/user363627)
12:57:55 pointlessslippe1 joins (~pointless@62.106.85.17)
13:02:41 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
13:05:26 × codaraxis__ quits (~codaraxis@user/codaraxis) (Ping timeout: 272 seconds)
13:05:28 hueso joins (~root@user/hueso)
13:07:29 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
13:17:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
13:22:02 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
13:22:15 alp_ joins (~alp@2001:861:e3d6:8f80:a9cc:355d:4963:1655)
13:31:34 × identity quits (~identity@user/ZharMeny) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.4))
13:32:39 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
13:35:57 identity joins (~identity@user/ZharMeny)
13:37:27 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
13:42:09 ljdarj joins (~Thunderbi@user/ljdarj)
13:44:36 alexherbo2 joins (~alexherbo@2a02-8440-3105-0250-8807-c34f-69f1-3589.rev.sfr.net)
13:48:11 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
13:49:55 × identity quits (~identity@user/ZharMeny) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.4))
13:50:28 identity joins (~identity@user/ZharMeny)
13:52:59 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
13:55:54 ljdarj1 joins (~Thunderbi@user/ljdarj)
13:57:05 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 244 seconds)
13:57:05 ljdarj1 is now known as ljdarj
14:03:40 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
14:08:15 codaraxis joins (~codaraxis@user/codaraxis)
14:08:18 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 245 seconds)
14:09:59 codaraxis__ joins (~codaraxis@user/codaraxis)
14:11:00 × codaraxis__ quits (~codaraxis@user/codaraxis) (Max SendQ exceeded)
14:13:47 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 265 seconds)
14:15:49 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.2.2)
14:18:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
14:19:21 crazazy joins (~user@mail.wibeco.nl)
14:22:19 Leonard26 joins (~Leonard26@49.236.57.54)
14:24:53 Sgeo joins (~Sgeo@user/sgeo)
14:25:02 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
14:26:14 <Leonard26> Hello! I wanted to know how I could get a list of type [0.00,0.05,0.1,0.15,0.2,0.25,0.3,0.35..1.0]. I am trying with [i+0.05 | i<-[0.0..1.0]] but I just get [5.0e-2,1.05] :(
14:28:01 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 248 seconds)
14:28:12 <geekosaur> welcome to IEEE floating point. use Data.Scientific (Scientific), Data.CReal (numbers), or some other exact-representation package. Or use Rational instead of Float/Double
14:32:09 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
14:32:14 KicksonButt joins (~quassel@2804:14d:7e52:809e:22e6:a05b:6e89:899e)
14:33:12 <__monty__> > take 21 $ iterate (+ 0.05) 0 -- If you must have Doubles/Floats
14:33:15 <lambdabot> [0.0,5.0e-2,0.1,0.15000000000000002,0.2,0.25,0.3,0.35,0.39999999999999997,0....
14:33:59 <crazazy> > [0.0,0.05..1.0]
14:34:01 <lambdabot> [0.0,5.0e-2,0.1,0.15000000000000002,0.2,0.25,0.30000000000000004,0.350000000...
14:34:30 <__monty__> > last [0.0,0.05..1.0]
14:34:31 <lambdabot> 1.0
14:34:50 <__monty__> Thought it'd be excluded but I suppose that makes sense.
14:34:59 <crazazy> :)
14:35:46 <__monty__> Why does [0.0..1.0] only enum integer(?) values though? Is it defaulted to [Integer]?
14:36:00 crazazy parts (~user@mail.wibeco.nl) (ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.4))
14:36:27 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
14:38:44 <Leonard26> Thank you :]
14:39:59 <int-e> > [0.5..10]
14:40:01 <lambdabot> [0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5]
14:40:15 <int-e> __monty__: no, it defaults to 1 as the difference between elements
14:40:27 <int-e> > succ 0.5
14:40:29 <lambdabot> 1.5
14:41:24 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
14:42:43 <__monty__> int-e: Ah, of course. >.<
14:43:35 × manwithluck quits (manwithluc@gateway/vpn/protonvpn/manwithluck) (Remote host closed the connection)
14:44:01 manwithluck joins (manwithluc@gateway/vpn/protonvpn/manwithluck)
14:45:02 crazazy joins (~crazazy@tilde.town)
14:51:15 × Leonard26 quits (~Leonard26@49.236.57.54) (Quit: Client closed)
14:51:25 × athan quits (~athan@syn-098-153-145-140.biz.spectrum.com) (Ping timeout: 252 seconds)
14:51:52 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
14:53:08 <geekosaur> __monty__, no, it's not defaulting, it's the (considered by many to be broken) Enum instance for Double/Float
14:53:42 <geekosaur> (combined with the fact that the general behavior for "ticking" a floating point number doesn't do anything at all intuitive)
14:56:54 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 272 seconds)
15:00:13 rosco joins (~rosco@183.171.106.209)
15:00:58 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 252 seconds)
15:01:57 fireking04 joins (~user@36-227-74-59.dynamic-ip.hinet.net)
15:07:29 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
15:09:46 Leonard26 joins (~Leonard26@49.236.57.54)
15:10:46 <Leonard26> [0.0,0.05..1.0] this seems to work well, but is there any way to turn that 5.0e-2 into 0.05?
15:12:19 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
15:13:56 × KicksonButt quits (~quassel@2804:14d:7e52:809e:22e6:a05b:6e89:899e) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
15:14:26 <geekosaur> use a number formatter
15:14:31 <int-e> > Numeric.showFFloat Nothing 0.05 ""
15:14:33 <lambdabot> "0.05"
15:14:54 <int-e> (read the documentation too)
15:15:04 × Leonard26 quits (~Leonard26@49.236.57.54) (Quit: Client closed)
15:19:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
15:19:11 marinelli joins (~weechat@gateway/tor-sasl/marinelli)
15:28:13 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
15:28:36 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 276 seconds)
15:32:46 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
15:39:24 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
15:39:35 ljdarj joins (~Thunderbi@user/ljdarj)
15:43:49 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
15:48:34 vhs joins (~vhs@d149-67-186-245.col.wideopenwest.com)
15:50:14 × vhs quits (~vhs@d149-67-186-245.col.wideopenwest.com) (Client Quit)
15:54:49 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
15:57:15 athan joins (~athan@syn-098-153-145-140.biz.spectrum.com)
15:57:54 <haskellbridge> <sm> I tend to use printf just for convenience
15:59:38 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
16:04:50 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
16:06:48 × kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection)
16:08:50 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:10:17 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
16:15:19 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 260 seconds)
16:15:51 <geekosaur> I tend to avoid it because (a) very not-Haskell (b) subject to extremely weird type errors if you make a mistake or especially if you try to partially apply it
16:20:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
16:21:29 billchenchina- joins (~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe)
16:21:38 <Franciman> :t printf
16:21:39 <lambdabot> PrintfType r => String -> r
16:22:32 <haskellbridge> <sm> for me, having one versatile and familiar display-hammer usually outweighs those
16:22:51 × rosco quits (~rosco@183.171.106.209) (Quit: Lost terminal)
16:24:05 <geekosaur> yeh but I always expect partial applicsation to work
16:24:34 <geekosaur> need an explicit type signature to do that with printf
16:25:17 <ghoulguy> printf can be a much more readable replacement for the code you'd need to replace it even with the extra type ascription
16:25:26 <haskellbridge> <sm> yes I wish it did with printf
16:25:52 <haskellbridge> <sm> (that's interesting, I never managed to get it working even with a type signature)
16:26:07 <ghoulguy> DSLs can be pretty great
16:26:22 <haskellbridge> <sm> indeed
16:26:48 <haskellbridge> <sm> regexps are another example
16:26:50 ljdarj1 joins (~Thunderbi@user/ljdarj)
16:27:14 <ghoulguy> > let date = printf "%d/%d/%d" :: Int -> Int -> Int -> String in date 12 25 2024
16:27:16 <lambdabot> "12/25/2024"
16:27:33 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 248 seconds)
16:27:33 ljdarj1 is now known as ljdarj
16:28:05 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
16:35:22 <EvanR> that's a lot of code for what it's doing
16:35:39 <EvanR> oh, it's glguy again
16:37:07 <geekosaur> and it's demonstrating my point
16:38:24 <ghoulguy> it's demonstrating your prefernces
16:38:45 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
16:39:32 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
16:42:24 <EvanR> formatTime defaultTimeLocale "%Y/%m/%d" (fromGregorian 2024 25 12)
16:42:33 <EvanR> now it's a DSL and also shorter xD
16:42:38 <ghoulguy> yeah, that would also look worse without the DSL
16:43:31 <EvanR> and lambdabot can give me the type of this but can't evaluate it xD
16:43:44 × alexherbo2 quits (~alexherbo@2a02-8440-3105-0250-8807-c34f-69f1-3589.rev.sfr.net) (Remote host closed the connection)
16:43:50 <EvanR> that's against natural law
16:44:05 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
16:46:45 <haskellbridge> <sm> > printf "%.2f" 0.123
16:46:53 <haskellbridge> <sm> ...
16:46:53 <haskellbridge> > printf "%.2f" 0.123
16:46:55 <lambdabot> error:
16:46:55 <lambdabot> • Ambiguous type variable ‘a0’ arising from a use of ‘show_M404553957665...
16:46:55 <lambdabot> prevents the constraint ‘(Show a0)’ from being solved.
16:47:20 <haskellbridge> <sm> bah.
16:47:20 <haskellbridge> > printf "%.2f" (0.123::Float)
16:47:22 <lambdabot> error:
16:47:22 <lambdabot> • Ambiguous type variable ‘a0’ arising from a use of ‘show_M344862853565...
16:47:22 <lambdabot> prevents the constraint ‘(Show a0)’ from being solved.
16:47:38 <ghoulguy> geekosaur: Why is the bridge talking as itself?
16:47:44 <EvanR> > printf "%.2f" 0.123 :: String
16:47:46 <lambdabot> "0.12"
16:47:54 × euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.)
16:48:25 <EvanR> you can't use lambdabot through the bridge? yet? xD
16:48:26 <geekosaur> when sending multiline messages to IRC, only the first has a user prefix by default
16:48:26 <haskellbridge> <sm> sigh thank you EvanR! printf is still a bit of a pain but usually better than digging for type specific display functions and imports IMHO
16:48:36 <haskellbridge> <sm> * IME
16:48:36 tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net)
16:48:51 <geekosaur> which is convenient if you want to use lambdabot across the bridge
16:49:47 <haskellbridge> <sm> so you need to write a nonempty first line, newline, then lambdabot command
16:52:45 euphores joins (~SASL_euph@user/euphores)
16:53:16 <EvanR> show (floor x) ++ "." ++ leftPad 2 '0' (show (floor (x * 100 `mod` 100)))
16:53:23 <EvanR> cabal install leftPad
16:53:32 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 255 seconds)
16:55:02 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
16:57:34 raehik joins (~raehik@rdng-25-b2-v4wan-169990-cust1344.vm39.cable.virginm.net)
16:58:36 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
16:59:33 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 245 seconds)
17:01:34 × polyphem quits (~rod@p4fc2c55e.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
17:04:56 <gentauro> Hey all. Having a discussion with the author of https://discourse.haskell.org/t/question-on-a-simple-repl-example-for-side-effects/10459 about if `e = print 5` in `ghci` is not triggering `print 5` on binding due to `IO` effects (his claim) or due to Haskells lazy nature (my claim). Which is it?
17:05:03 <gentauro> Thx in advance :-)
17:05:37 <geekosaur> both to some extent, but the major omne is that `e` is bound to an IO action
17:07:06 <geekosaur> `:set -fprint-bind-result` will allow `let`s to show results but I think you'd just get a type error because `IO` actions don't have `Show` instances
17:07:11 ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207)
17:07:29 <gentauro> geekosaur: my example for Ocaml/F# is: `let e = System.Console.WriteLine 5` would print 5. However: `let el () = System.Console.WriteLine 5` would not (this is how you tend to mimic Haskell lazyness in F# for example)
17:08:33 <geekosaur> right, but the way it's being mimicked will affect the result
17:09:19 <geekosaur> `e = print 5` binds `e` to an IO action. you need to sequence the IO action to have it do anything
17:10:03 <geekosaur> okay, I'm in count, must go, sorry
17:10:17 <gentauro> geekosaur: No probs and tx.
17:10:20 <gentauro> thx I mean
17:10:32 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
17:11:13 <geekosaur> I think with `-fprint-bind-result` you'll see it because ghci detects things that are in `MonadIO` and sequences them for you
17:11:45 <geekosaur> otherwise you'd need to evaluate `e` separately
17:11:53 <gentauro> λ> :set -fprint-bind-result
17:12:01 <EvanR> % print 5
17:12:01 <yahb2> 5
17:12:04 <gentauro> λ> e = print 5
17:12:12 <gentauro> (0.01 secs, 114,280 bytes)
17:12:20 <gentauro> % e = print 5
17:12:21 <yahb2> <no output>
17:12:28 <gentauro> % !e = print 5
17:12:28 <yahb2> <no output>
17:12:34 <gentauro> hmmmm
17:12:38 <c_wraith> Yeah, seems to me that the best answer is "IO values aren't executed simply for existing"
17:12:48 <EvanR> except in ghci
17:13:03 <c_wraith> even simply *existing* doesn't cause them to execute in ghci
17:13:11 <c_wraith> seq (print 5) ()
17:13:26 <EvanR> true, existence is an act of mental construction
17:13:30 <c_wraith> it's just that ghci binds IO actions that are entered at the top level
17:13:32 <EvanR> you actually have to type it in ghci
17:13:47 <EvanR> on top of that
17:14:06 <EvanR> gentauro was asking about ghci's behavior I thought
17:14:14 <EvanR> which is weird
17:14:51 <c_wraith> ghci's behavior is "you are entering lines in a do block that makes up the entry point of the program". Nice and simple.
17:14:57 <gentauro> EvanR: Yes and no. My guess for what author is experiencing was the lazy nature of Haskell and hereby `ghci`
17:15:07 <c_wraith> well, it was until people started demanding the ability to add declarations in ghci
17:15:10 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
17:15:12 <c_wraith> that made it complicated for no value
17:15:14 <gentauro> but I think that the behavior might have to due solely to `ghci`
17:15:51 <EvanR> ^
17:16:00 <c_wraith> I mean, no
17:16:04 <c_wraith> seq (print 5) ()
17:16:14 <c_wraith> that strictly evaluates (print 5)
17:16:22 <geekosaur> % :set -fprint-bind-result
17:16:22 <yahb2> <no output>
17:16:27 <c_wraith> No relevant laziness
17:16:27 <geekosaur> % !e = print 5
17:16:27 <yahb2> <no output>
17:16:30 <EvanR> if the expression is an IO action it executes, otherwise no
17:16:36 <geekosaur> % !e <- print 5
17:16:36 <yahb2> 5
17:16:50 <geekosaur> okay, so print-bind-result doens't apply to let I guess
17:16:57 <gentauro> geekosaur: yeah, I noticed that
17:17:06 <EvanR> simulating being inside a do block theory has its wheels fall off sometimes
17:17:27 <c_wraith> EvanR: it used to be correct, before people insisted ghci become complicated for no reason
17:18:19 <c_wraith> (though you did have to accept that sometimes it inserts implicit uses of print)
17:18:27 × machinedgod quits (~machinedg@d50-99-47-73.abhsia.telus.net) (Ping timeout: 276 seconds)
17:19:02 vanishingideal joins (~vanishing@user/vanishingideal)
17:20:42 <c_wraith> ah, here's an even better example of "not laziness"
17:20:54 <c_wraith> % evaluate (print 5)
17:20:54 <yahb2> <interactive>:47:1: error: [GHC-88464] ; Variable not in scope: evaluate :: IO () -> t
17:21:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
17:21:12 <c_wraith> % :m + Control.Exception
17:21:12 <yahb2> <no output>
17:21:14 <c_wraith> % evaluate (print 5)
17:21:14 <yahb2> <no output>
17:21:30 <c_wraith> that absolutely 100% evaluates the IO action.
17:21:53 <gentauro> %:t evaluate
17:21:56 <gentauro> % :t evaluate
17:21:56 <yahb2> evaluate :: a -> IO a
17:22:21 <EvanR> evaluates the argument to WHNF
17:22:39 <EvanR> only works in IO though
17:22:49 <EvanR> very useful
17:23:08 <EvanR> e.g. when the argument is something that might explode when evaluated and you want it to explode now
17:23:45 <EvanR> or would take up gratuitous resources to delay evaluation
17:24:19 <c_wraith> which is why it's hidden away inside Control.Exception - it was originally intended for turning bottoms into exceptions at a predictable point in the IO action
17:25:26 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
17:25:28 alexherbo2 joins (~alexherbo@2a02-8440-3105-0250-8807-c34f-69f1-3589.rev.sfr.net)
17:27:14 vanishingideal joins (~vanishing@user/vanishingideal)
17:30:07 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
17:30:30 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
17:37:17 Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi)
17:38:45 × fireking04 quits (~user@36-227-74-59.dynamic-ip.hinet.net) (Ping timeout: 246 seconds)
17:39:53 <EvanR> it's not in prelude because people would be putting evaluate everywhere for no reason? xD
17:40:14 <EvanR> import Control.Exception signals your intentionality
17:41:17 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
17:45:24 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 246 seconds)
17:45:58 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
17:47:35 vanishingideal joins (~vanishing@user/vanishingideal)
17:50:24 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
17:54:45 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
17:55:56 vanishingideal joins (~vanishing@user/vanishingideal)
17:56:30 vanishingideal is now known as vanishing
17:56:37 vanishing is now known as vanishingideal
17:56:43 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
17:59:25 <dolio> Pretty sure ghci always allowed stuff like `5 + 5`.
18:03:01 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 248 seconds)
18:03:07 <dmj`> > do do do 2 + 2
18:03:09 <lambdabot> 4
18:07:09 × gawen quits (~gawen@user/gawen) (Quit: cya)
18:08:32 gawen joins (~gawen@user/gawen)
18:09:14 × ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Remote host closed the connection)
18:13:58 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
18:14:03 × AWizzArd quits (~code@gehrels.uberspace.de) (Changing host)
18:14:03 AWizzArd joins (~code@user/awizzard)
18:18:18 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
18:20:37 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 248 seconds)
18:21:04 <c_wraith> yeah, that's the "implicit print" case
18:22:38 vanishingideal joins (~vanishing@user/vanishingideal)
18:23:11 <dolio> Oh, I see.
18:27:36 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:36:14 × noctux quits (~noctux@user/noctux) (Read error: Connection reset by peer)
18:37:30 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
18:38:33 noctux joins (~noctux@user/noctux)
18:38:39 × Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity)
18:38:46 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 252 seconds)
18:39:43 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
18:42:22 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 272 seconds)
18:44:17 ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207)
18:44:34 × ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Client Quit)
18:51:14 × son0p quits (~ff@190.69.124.252) (Ping timeout: 252 seconds)
18:51:43 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
18:52:55 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
18:55:35 × califax quits (~califax@user/califx) (Remote host closed the connection)
18:55:54 califax joins (~califax@user/califx)
18:56:13 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 245 seconds)
18:57:30 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
18:59:08 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
19:00:00 × caconym quits (~caconym@user/caconym) (Quit: bye)
19:00:36 caconym joins (~caconym@user/caconym)
19:04:19 × TMA quits (tma@twin.jikos.cz) (Ping timeout: 264 seconds)
19:04:35 TMA joins (tma@twin.jikos.cz)
19:06:56 visilii joins (~visilii@46.61.242.109)
19:08:22 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
19:10:20 × lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 255 seconds)
19:10:55 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 264 seconds)
19:11:46 × AlexZenon quits (~alzenon@178.34.162.53) (Ping timeout: 252 seconds)
19:13:30 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 276 seconds)
19:19:45 AlexZenon joins (~alzenon@178.34.162.53)
19:22:50 × athan quits (~athan@syn-098-153-145-140.biz.spectrum.com) (Quit: Konversation terminated!)
19:23:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
19:27:31 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
19:28:34 × lystra quits (~lystra@208.59.105.41) (Ping timeout: 260 seconds)
19:31:49 lystra joins (~lystra@208.59.105.41)
19:38:31 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
19:42:06 × ljdarj quits (~Thunderbi@user/ljdarj) (Quit: ljdarj)
19:42:34 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 260 seconds)
19:43:18 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
19:44:00 vanishingideal joins (~vanishing@user/vanishingideal)
19:44:44 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 260 seconds)
19:47:47 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
19:54:05 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
19:56:51 × alexherbo2 quits (~alexherbo@2a02-8440-3105-0250-8807-c34f-69f1-3589.rev.sfr.net) (Remote host closed the connection)
19:58:29 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
20:02:22 peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com)
20:09:28 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
20:10:34 Digitteknohippie joins (~user@user/digit)
20:10:48 × Digit quits (~user@user/digit) (Ping timeout: 252 seconds)
20:13:48 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
20:13:54 × peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds)
20:16:52 Digitteknohippie is now known as Digit
20:18:48 × billchenchina- quits (~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe) (Remote host closed the connection)
20:23:43 × raehik quits (~raehik@rdng-25-b2-v4wan-169990-cust1344.vm39.cable.virginm.net) (Ping timeout: 245 seconds)
20:24:06 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
20:25:50 ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207)
20:25:55 × michalz quits (~michalz@185.246.207.203) (Remote host closed the connection)
20:27:49 × ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Client Quit)
20:28:46 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
20:29:08 × ubert quits (~Thunderbi@178.165.166.66.wireless.dyn.drei.com) (Ping timeout: 252 seconds)
20:29:37 × TonyStone quits (~TonyStone@user/TonyStone) (Remote host closed the connection)
20:32:56 × califax quits (~califax@user/califx) (Remote host closed the connection)
20:33:10 califax joins (~califax@user/califx)
20:35:38 machinedgod joins (~machinedg@d50-99-47-73.abhsia.telus.net)
20:36:07 dyniec joins (~dyniec@dybiec.info)
20:36:27 mvk joins (~mvk@2607:fea8:5c96:5800::e590)
20:39:31 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
20:39:53 × mvk quits (~mvk@2607:fea8:5c96:5800::e590) (Client Quit)
20:44:10 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
20:46:03 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
20:46:42 morb joins (~morb@pool-108-41-100-120.nycmny.fios.verizon.net)
20:51:14 × morb quits (~morb@pool-108-41-100-120.nycmny.fios.verizon.net) (Ping timeout: 260 seconds)
20:54:56 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
20:59:47 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
21:00:14 son0p joins (~ff@186.121.100.73)
21:00:54 × ghodawalaaman quits (~thelounge@user/thelounge8234) (Read error: Connection reset by peer)
21:01:40 ephilalethes joins (~noumenon@113.51-175-156.customer.lyse.net)
21:01:49 ghodawalaaman joins (~thelounge@user/thelounge8234)
21:08:56 gmg joins (~user@user/gehmehgeh)
21:10:27 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
21:10:30 × leah2 quits (~leah@vuxu.org) (Ping timeout: 276 seconds)
21:10:46 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
21:14:42 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
21:19:33 L29Ah joins (~L29Ah@wikipedia/L29Ah)
21:22:31 × shailangsa quits (~shailangs@host86-182-139-82.range86-182.btcentralplus.com) (Remote host closed the connection)
21:22:34 leah2 joins (~leah@vuxu.org)
21:25:53 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
21:30:02 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
21:30:12 × _d0t quits (~{-d0t-}@user/-d0t-/x-7915216) (Ping timeout: 272 seconds)
21:30:35 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Client Quit)
21:30:43 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
21:32:12 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
21:33:19 _d0t joins (~{-d0t-}@user/-d0t-/x-7915216)
21:33:23 × ephilalethes quits (~noumenon@113.51-175-156.customer.lyse.net) (Read error: Connection reset by peer)
21:39:33 ephilalethes joins (~noumenon@113.51-175-156.customer.lyse.net)
21:40:19 × identity quits (~identity@user/ZharMeny) (Ping timeout: 264 seconds)
21:41:28 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
21:46:08 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
21:47:33 libertyprime joins (~libertypr@118-92-68-68.dsl.dyn.ihug.co.nz)
21:48:23 supercode joins (~supercode@user/supercode)
21:49:47 identity joins (~identity@user/ZharMeny)
21:52:58 × Angelz quits (Angelz@Angelz.oddprotocol.org) (Changing host)
21:52:58 Angelz joins (Angelz@user/angelz)
21:56:54 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
21:57:19 athan joins (~athan@syn-098-153-145-140.biz.spectrum.com)
22:01:47 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 255 seconds)
22:06:35 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
22:10:36 morb joins (~morb@pool-108-41-100-120.nycmny.fios.verizon.net)
22:12:30 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
22:14:58 × morb quits (~morb@pool-108-41-100-120.nycmny.fios.verizon.net) (Ping timeout: 245 seconds)
22:17:17 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
22:28:10 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
22:28:49 thegeekinside joins (~thegeekin@189.217.93.202)
22:29:48 × thegeekinside quits (~thegeekin@189.217.93.202) (Remote host closed the connection)
22:30:52 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
22:31:08 hgolden_ joins (~hgolden@169.150.203.23)
22:31:35 thegeekinside joins (~thegeekin@189.217.93.202)
22:32:25 × thegeekinside quits (~thegeekin@189.217.93.202) (Remote host closed the connection)
22:33:04 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
22:34:02 × hgolden__ quits (~hgolden@23.162.40.69) (Ping timeout: 265 seconds)
22:36:24 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 260 seconds)
22:39:59 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
22:43:27 × acidjnk quits (~acidjnk@p200300d6e72cfb63d87029be15e343a0.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
22:43:35 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
22:48:13 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 244 seconds)
22:50:44 weary-traveler joins (~user@user/user363627)
22:59:12 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
23:03:54 × paddymahoney quits (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com) (Ping timeout: 246 seconds)
23:04:15 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 276 seconds)
23:07:28 paddymahoney joins (~paddymaho@pool-99-250-10-137.cpe.net.cable.rogers.com)
23:08:47 × AWizzArd quits (~code@user/awizzard) (Read error: Connection reset by peer)
23:11:28 × sawilagar quits (~sawilagar@user/sawilagar) (Ping timeout: 244 seconds)
23:11:41 × ephilalethes quits (~noumenon@113.51-175-156.customer.lyse.net) (Quit: Leaving)
23:14:11 AWizzArd joins (~code@gehrels.uberspace.de)
23:14:42 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
23:16:45 × supercode quits (~supercode@user/supercode) (Quit: Client closed)
23:17:11 spew joins (~spew@201.141.99.170)
23:18:43 morb joins (~morb@pool-108-41-100-120.nycmny.fios.verizon.net)
23:19:15 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
23:30:18 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
23:35:25 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 265 seconds)
23:36:53 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
23:41:38 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 252 seconds)
23:43:17 Smiles joins (uid551636@id-551636.lymington.irccloud.com)
23:43:27 ario parts (~ario@159.65.220.102) ()
23:48:28 × gentauro quits (~gentauro@user/gentauro) (Read error: Connection reset by peer)
23:52:21 merijn joins (~merijn@204-220-045-062.dynamic.caiway.nl)
23:53:55 gentauro joins (~gentauro@user/gentauro)
23:57:08 × merijn quits (~merijn@204-220-045-062.dynamic.caiway.nl) (Ping timeout: 272 seconds)

All times are in UTC on 2024-10-03.