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.