Logs on 2025-04-08 (liberachat/#haskell)
| 00:04:06 | × | jespada quits (~jespada@r190-133-49-11.dialup.adsl.anteldata.net.uy) (Ping timeout: 252 seconds) |
| 00:08:47 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:09:24 | × | emojelly quits (~eselber_p@user/endojelly) (Ping timeout: 260 seconds) |
| 00:09:42 | → | emojelly joins (~eselber_p@user/endojelly) |
| 00:12:56 | × | anpad quits (~pandeyan@user/anpad) (Quit: ZNC 1.8.2 - https://znc.in) |
| 00:13:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 00:13:48 | → | anpad joins (~pandeyan@user/anpad) |
| 00:13:55 | × | nurupo quits (~nurupo.ga@user/nurupo) (Quit: nurupo.ga) |
| 00:14:30 | → | nurupo joins (~nurupo.ga@user/nurupo) |
| 00:16:21 | → | notdabs joins (~Owner@2600:1700:69cf:9000:20c6:7b0d:8034:a6ce) |
| 00:20:03 | × | j1n37- quits (~j1n37@user/j1n37) (Ping timeout: 265 seconds) |
| 00:21:34 | → | j1n37 joins (~j1n37@user/j1n37) |
| 00:24:18 | × | ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Quit: Lost terminal) |
| 00:24:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:25:35 | × | acidjnk_new3 quits (~acidjnk@p200300d6e71c4f1839a5a90aae0b2850.dip0.t-ipconnect.de) (Ping timeout: 268 seconds) |
| 00:29:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds) |
| 00:40:21 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:47:21 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 00:54:52 | <emojelly> | I have a question about profiling. So according to +RTS -pa, most of the time is spent in the following cost center: |
| 00:54:54 | <emojelly> | gettingrun SigTest tests/SigTest.hs:101:175-177 1760 24025 64.3 45.8 81.5 58.5 865788 24019809720 |
| 00:54:56 | <emojelly> | resume Control.Monad.Coroutine Control/Monad/Coroutine.hs:88:4-9 1803 57732070 0.0 0.0 0.0 0.0 0 0 |
| 00:55:04 | <emojelly> | the first one, which I named "gettingrun", here: |
| 00:55:40 | <emojelly> | combineEx (Right (Left (Request i1 nextco1))) (Right (Left (Request i2 nextco2))) = let |
| 00:55:42 | <emojelly> | nextCombined c o = combineRe (unwrapEx ({-# SCC runningco1 #-}(nextco1 o))) (unwrapEx ({-# SCC runningco2 #-}(nextco2 o))) c |
| 00:55:44 | <emojelly> | in (liftWith (\(!run) -> {-# SCC rewrapping #-}rewrapCo $ \c -> Right $ Left $ Request ({-# SCC pasting #-}(i1 `paste` i2)) ({-# SCC running #-}(({-# SCC gettingrun #-}run) . {-# SCC runcombined #-}nextCombined c)))) >>= ({-# SCC restoring #-}restoreT) . {-# SCC returning #-}return |
| 00:56:31 | <emojelly> | Now "run" itself should in my minimal test case just be "runIdentityT", I doubt we can spend all the time (or really any time) in there. |
| 00:56:36 | × | user363627 quits (~user@user/user363627) (Quit: Konversation terminated!) |
| 00:56:53 | → | user363627 joins (~user@user/user363627) |
| 00:56:54 | <emojelly> | So I guess it's really what's getting evaluated within runIdentityT. But why don't I see any cost centers for that? |
| 00:57:17 | <emojelly> | Is my suspicion correct, that this time is spent in other modules, that are somehow not built for profiling? |
| 00:58:25 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 00:59:21 | <emojelly> | Also, the first entry below "gettingrun", which is "resume", somehow has 57732070 ticks (which is a looot) but is 0.0 / 0.0 in execution time. I noticed this pattern throughout the profiling report, that often/always the first cost center hierarchically under the large ones have a lot of ticks? |
| 01:01:00 | × | otto_s quits (~user@p5de2f09d.dip0.t-ipconnect.de) (Ping timeout: 244 seconds) |
| 01:02:37 | → | otto_s joins (~user@p5b044d5e.dip0.t-ipconnect.de) |
| 01:03:04 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 01:06:00 | × | Pixi quits (~Pixi@user/pixi) (Quit: Leaving) |
| 01:06:54 | → | Pixi joins (~Pixi@user/pixi) |
| 01:08:44 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 01:12:20 | × | xff0x quits (~xff0x@ai066236.d.east.v6connect.net) (Ping timeout: 272 seconds) |
| 01:12:21 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 248 seconds) |
| 01:12:21 | ljdarj1 | is now known as ljdarj |
| 01:13:47 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:16:38 | <EvanR> | emojelly, to be serious about profiling you have to have all your dependencies built for profiling |
| 01:18:45 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 01:20:37 | <monochrom> | I think cabal does that automatically once you enable profiling. |
| 01:22:39 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 01:29:18 | × | exarkun quits (~exarkun@user/exarkun) (Excess Flood) |
| 01:29:31 | × | machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 252 seconds) |
| 01:29:33 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:30:39 | × | s4msung quits (DQyKc40dMf@user/s4msung) (Ping timeout: 260 seconds) |
| 01:31:03 | → | s4msung joins (HpS7xJgsJj@user/s4msung) |
| 01:31:41 | → | exarkun joins (~exarkun@user/exarkun) |
| 01:34:58 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds) |
| 01:36:55 | <geekosaur> | yes |
| 01:37:02 | <geekosaur> | so does stack |
| 01:37:23 | <emojelly> | I've used cabal... |
| 01:37:27 | <emojelly> | --enable-profiling |
| 01:37:50 | <emojelly> | It's weird now. I have this cost center where it claims that 64.3% of the time is spent in, but there is no further breakdown. |
| 01:38:06 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 01:38:15 | <geekosaur> | also remember laziness: if something gets forced inside a profiled function/etc., it'll be accrued to that |
| 01:38:16 | <emojelly> | It's this expression: (({-# SCC gettingrun #-}run) . {-# SCC runcombined #-}nextCombined c))) |
| 01:38:21 | <emojelly> | I don't know where to go from there. |
| 01:38:27 | <emojelly> | geekosaur: I know, yeah |
| 01:38:38 | <emojelly> | but how do I find out what that is? |
| 01:40:39 | <emojelly> | Cleaned up, the expression is just "run . nextCombined c" |
| 01:40:54 | <emojelly> | and run, as said, should just be "runIdentityT", I doubt there's any time spent in that |
| 01:41:38 | <emojelly> | "nextCombine c" has 17% cumulative. That's also a lot, but nearly near the 64%/81% of the whole expression |
| 01:44:24 | <emojelly> | not nearly I mean |
| 01:44:39 | <emojelly> | So to summarize: |
| 01:45:03 | <emojelly> | (run . nextCombined c): 64% direct, 81% inherited |
| 01:45:19 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 01:46:14 | × | yin quits (~z@user/zero) (Ping timeout: 260 seconds) |
| 01:46:20 | <emojelly> | nextCombined c: 0% direct, 17% inherited |
| 01:46:43 | <emojelly> | that leaves 64% that are unaccounted for, and that I have no idea on how to find out where it's spent |
| 01:47:21 | → | yin joins (~z@user/zero) |
| 01:48:01 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 244 seconds) |
| 01:48:39 | <chiselfuse> | https://www.haskell.org/onlinereport/classes.gif |
| 01:48:57 | <chiselfuse> | what's the strange symbol between brackets under Eq here? |
| 01:49:10 | <chiselfuse> | "All except IO, (??)" |
| 01:49:47 | <geekosaur> | same as under the others on that line, it just got mangled worse by pixelation. (->) |
| 01:49:55 | <EvanR> | wow that picture has no aged well |
| 01:49:58 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds) |
| 01:50:15 | <geekosaur> | meaning, functions |
| 01:50:22 | <EvanR> | I think it is outdated too |
| 01:50:51 | <geekosaur> | well outdated, yes |
| 01:51:10 | <geekosaur> | missing AMP, missing Num losing Eq and Show "superclasses" |
| 01:51:18 | <geekosaur> | to say nothing of FTP |
| 01:51:38 | <geekosaur> | but then, that's the Haskell 98 report |
| 01:52:42 | <geekosaur> | (you may want https://www.haskell.org/onlinereport/haskell2010, but it'll still be missing those changes |
| 01:52:59 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 252 seconds) |
| 01:54:45 | <EvanR> | .oO( all (what) have an Eq instance except IO and ->) |
| 02:01:06 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:03:33 | → | xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) |
| 02:03:50 | <chiselfuse> | geekosaur: so the changes are post 2010 spec? if so is there a website with the new draft? |
| 02:05:15 | <geekosaur> | no, the committee got "stuck" some time back and no new / updated draft is in sight, just what ghc's `base` currently implements |
| 02:05:51 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 02:06:33 | <chiselfuse> | hm |
| 02:06:45 | <chiselfuse> | geekosaur: can you link me this `base` thing? i don't know what you're referring to |
| 02:07:12 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 02:07:28 | <geekosaur> | https://hackage.haskell.org/package/base-4.21.0.0 |
| 02:10:20 | <EvanR> | all your base are belong to us |
| 02:10:24 | <chiselfuse> | geekosaur: is this a fully updated one? https://cs.lmu.edu/~ray/images/haskell-typeclasses.png |
| 02:11:34 | <geekosaur> | looks closer, at least. I think what you really want is https://wiki.haskell.org/index.php?title=Typeclassopedia |
| 02:14:21 | <chiselfuse> | geekosaur: why does the graph there not have Num and many others? |
| 02:16:54 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:18:21 | <geekosaur> | because it focuses on the ones that aren't reasonably obvious to newcommers, which are the ones that come from abstract algebra or category theory |
| 02:18:25 | <emojelly> | How do I rebuild all dependencies of my cabal project with different flags? |
| 02:18:39 | <geekosaur> | Num, Eq, etc. are trivial. |
| 02:20:33 | <geekosaur> | emojelly, typically you add something to cabal.project or cabal.project.local (preferred) like https://paste.tomsmeding.com/o6Cbtvr5 (you can include most cabal declarations in the package block |
| 02:21:45 | <chiselfuse> | that's nice but i'm kind of looking for an updated one of the basic ones (Num, Eq, ...) because i'm still newb |
| 02:23:49 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 02:24:27 | <emojelly> | geekosaur: thanks, I found exactly that in the cabal documentation in the meantime, and it seems to work! |
| 02:24:27 | <EvanR> | if you type :info Num in ghci you will get the details |
| 02:24:43 | <emojelly> | package * |
| 02:24:45 | <emojelly> | profiling: true |
| 02:24:47 | <emojelly> | optimization: 0 |
| 02:24:49 | <EvanR> | if you look in the base haddocks, there is documentation there for Num, Eq, Ord, etc |
| 02:24:49 | <emojelly> | flags: -rtsopts -O0 -fprof-auto |
| 02:24:56 | <emojelly> | let's see if profiling will be more helpful... |
| 02:25:20 | <EvanR> | :i Eq |
| 02:25:26 | <EvanR> | % :i Eq |
| 02:25:26 | <yahb2> | type Eq :: * -> Constraint ; class Eq a where ; (==) :: a -> a -> Bool ; (/=) :: a -> a -> Bool ; {-# MINIMAL (==) | (/=) #-} ; -- Defined in ‘GHC.Classes’ ; instance [safe] Eq Nat -- Defi... |
| 02:25:56 | <EvanR> | provides the == and /= (doesn't equal) operations |
| 02:26:02 | <geekosaur> | use %% instead, it'll use a pastebin |
| 02:26:09 | × | chiselfuse quits (~chiselfus@user/chiselfuse) (Remote host closed the connection) |
| 02:26:14 | <EvanR> | %% :i Num |
| 02:26:14 | <yahb2> | https://paste.tomsmeding.com/eh7HAAXo |
| 02:26:21 | <EvanR> | snazzy |
| 02:26:44 | <monochrom> | "eh7" eh? :) |
| 02:26:48 | → | chiselfuse joins (~chiselfus@user/chiselfuse) |
| 02:27:29 | <monochrom> | But I am not sure of the value of profiling unoptimized code. |
| 02:28:04 | <geekosaur> | that example doesn't know about `profiling-detail: late` (IIRC that's the option) |
| 02:31:14 | <chiselfuse> | EvanR: can you help me read some of that output? `instance Eq a => Eq [a] -- Defined in ‘GHC.Classes’` what does this mean? |
| 02:31:57 | <geekosaur> | if some type a has an Eq instance, then the type "list of a" has an Eq instance |
| 02:32:17 | <EvanR> | ^ |
| 02:32:27 | <emojelly> | aaah, much better I think |
| 02:33:12 | <EvanR> | the list Eq instance uses the Eq instance of the element type |
| 02:33:34 | <EvanR> | > [1,2,3] == [1,2,4] |
| 02:33:35 | <lambdabot> | False |
| 02:34:25 | <chiselfuse> | so it's just `instance <type signature> -- defined in ...` where anything of type `<type signature>` is an instance of the typeclass `:i <typeclass>` |
| 02:34:42 | <EvanR> | instance definitions have their own syntax |
| 02:34:47 | <EvanR> | not just any type signature works there |
| 02:34:55 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:35:12 | <ski> | `instance Int where ...' does not work |
| 02:35:18 | <chiselfuse> | is it a subset of type signatures or something completely different? |
| 02:35:28 | <chiselfuse> | yea i just found `instance Eq Integer -- Defined in ‘GHC.Num.Integer’`. how do i read it? |
| 02:35:29 | <monochrom> | Completely different. |
| 02:37:34 | <EvanR> | as in "and now for something" |
| 02:38:08 | <chiselfuse> | i don't understand |
| 02:38:18 | <chiselfuse> | oh i get the joke |
| 02:38:58 | × | notdabs quits (~Owner@2600:1700:69cf:9000:20c6:7b0d:8034:a6ce) (Read error: Connection reset by peer) |
| 02:40:04 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 02:41:16 | <chiselfuse> | how do i read what comes after `instance`? i don't trust chatgpt i think it's telling me nonsense |
| 02:42:46 | <monochrom> | All good textbooks and tutorials explain classes and instances and their syntax. |
| 02:43:06 | × | chiselfuse quits (~chiselfus@user/chiselfuse) (Remote host closed the connection) |
| 02:43:40 | → | chiselfuse joins (~chiselfus@user/chiselfuse) |
| 02:46:32 | <EvanR> | that may be true |
| 02:46:53 | <EvanR> | disclaimer good textbooks and tutorials aren't guaranteed to exist |
| 02:48:06 | <jackdk> | If you want to read left-to-right, "there is an instance of Eq for Integer"; if you want something that sounds a bit more natural, "Integer has an Eq instance" |
| 02:50:38 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 02:51:18 | <emojelly> | This is driving me crazy... |
| 02:52:54 | <monochrom> | It is a full-time job to understand performance issues. |
| 02:53:00 | <emojelly> | combineTestSignals 35.2 37.0 35.3 37.1 6745 19387990040 |
| 02:53:02 | <emojelly> | resume 0.0 0.0 0.0 0.0 0 0 |
| 02:53:04 | <emojelly> | combineTestSignals' 0.0 0.0 0.0 0.1 0 2640 |
| 02:53:19 | <emojelly> | combineTestSignals is literally just: combineTestSignals = combineTestSignals' (,) |
| 02:53:29 | <emojelly> | how can this eat up all the cycles, but combineTestCycles' doesn't |
| 02:54:08 | <EvanR> | and in instance Eq a => Eq [a] where ... it says "[a] has an Eq instance" (the context doesn't matter when looking for instances! xD) |
| 02:54:26 | × | gorignak quits (~gorignak@user/gorignak) (Quit: quit) |
| 02:54:46 | → | gorignak joins (~gorignak@user/gorignak) |
| 02:54:51 | <EvanR> | similar to the truth table for modus ponens when the hypothesis is false |
| 02:55:07 | <EvanR> | s/modus ponens/material implication/ |
| 02:55:19 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 02:55:48 | <geekosaur> | emojelly, don't forget `(,)`, which may be causing boxing/unboxing depending on how things are being optimized |
| 02:56:16 | <emojelly> | hmm... I said -O0 so it doesn't get in the way |
| 02:56:21 | <monochrom> | That is an interesting way to look at it. Continue wording it as "if then" but framing "if then" as material implication... |
| 02:57:07 | <emojelly> | geekosaur: but (,) is just passed to combineTestSignals'... I have a hard time wrapping my head around how that would cause combineTestSignals (without ') to be so expensive? |
| 02:58:12 | <geekosaur> | combineTestSignals' produces a thunk, combineTestSignals (or whatever consumes its result) forces it |
| 02:58:52 | <emojelly> | ah, that makes sense. |
| 02:59:02 | <emojelly> | So how do I know what's expensive? |
| 02:59:54 | <geekosaur> | and (,) is a constructor so I don't know if it's profiled (actually I suspect it just isn't, you get a thunk possibly containing two more thunks) |
| 03:00:31 | <geekosaur> | this is part of why understanding performance issues is a full time job |
| 03:01:01 | <geekosaur> | boxing and unboxing is another thing that costs cycles and won't be profiled, because it's too primitive for profiling |
| 03:03:25 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 03:03:28 | <emojelly> | Hmm. So how do I proceed? |
| 03:03:59 | × | gorignak quits (~gorignak@user/gorignak) (Ping timeout: 260 seconds) |
| 03:04:35 | <emojelly> | Make my own strict (,)? |
| 03:04:36 | → | j1n37- joins (~j1n37@user/j1n37) |
| 03:05:35 | × | j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 252 seconds) |
| 03:05:42 | <geekosaur> | I'm not sure tbh |
| 03:06:02 | <emojelly> | let f !a !b = (a,b) in combineTestSignals' f |
| 03:06:09 | <emojelly> | let's see if that helps me get more information |
| 03:06:24 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:07:01 | <EvanR> | eh |
| 03:07:09 | × | forell quits (~forell@user/forell) (Ping timeout: 268 seconds) |
| 03:07:32 | <emojelly> | sadly, no difference |
| 03:08:02 | <EvanR> | a strict tuple is actually a handy thing to have sometimes |
| 03:08:32 | <EvanR> | but it's not strictly (lol) necessary, since you can accomplish the same thing by only construct a tuple from things that you have evaluated |
| 03:10:12 | <ski> | a tuple that didn't force until a component got actually forced, would potentially be nice (in order to have a categorical product) |
| 03:10:13 | <emojelly> | it didn't help, all time is still spent in combineTestSignals, which is now literally just "let f !a !b = (a,b) in combineTestSignals' f" |
| 03:10:19 | <emojelly> | no time is spent in combineTestSignals' |
| 03:10:57 | <EvanR> | just sounds like a bad report, or bad reading of the available data |
| 03:11:05 | <emojelly> | I just don't know where to go from here... how do I figure out which part of my program is expensive? |
| 03:11:34 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 03:11:44 | <EvanR> | that code has a good chance of doing nothing special with the bangs, since it depends on what combineTestSignals' does and who uses the result |
| 03:11:48 | <EvanR> | and how |
| 03:12:07 | <emojelly> | EvanR: do I read this wrong? https://paste.tomsmeding.com/DWrhtBvL |
| 03:12:09 | <EvanR> | if it would matter then combineTestSignals could've done it |
| 03:12:18 | <EvanR> | prime* |
| 03:13:33 | <emojelly> | I also still don't quite understand why the cost centers with the large individual counts have a small value in the entries column, while usually the cost center immediately under it has a large "entries" value, but a tiny/0 non-inherited %time |
| 03:13:36 | <Axman6> | I feel like you need to use a different profiling mode, maybe the one that automatically adds cost centres |
| 03:13:47 | <EvanR> | and you use -O0 so whatever you eventually learn becomes irrelevant when you put the optimization back |
| 03:13:47 | <emojelly> | Axman6: I used -fprof-auto |
| 03:13:55 | <Axman6> | Hmm, ok |
| 03:14:07 | <emojelly> | profiling: true |
| 03:14:09 | <emojelly> | optimization: 0 |
| 03:14:11 | <emojelly> | flags: -rtsopts -O0 -fprof-auto |
| 03:14:15 | <emojelly> | cabal run --enable-profiling --profiling-detail=all-functions --ghc-options="-rtsopts -O0 -fprof-auto" test-library -- -p "/sendBytes'/" +RTS -pa |
| 03:14:44 | <EvanR> | it could be that constructing that tuple is really most of the work and memory? |
| 03:14:54 | <EvanR> | in which case I'd say turn optimizations back on |
| 03:15:28 | <Axman6> | yeah I'm not sure that turning off optimisations tells you all that much. it does seem like a strange profile - care you share any of the code? |
| 03:16:20 | <emojelly> | EvanR: but shouldn't the expensive cost center then be where (,) actually gets *used*? It's passed down deeply into the bowels of combineTestSignals |
| 03:16:28 | <emojelly> | of combineTestSignals' I mean |
| 03:17:31 | <emojelly> | Axman6: yeah I don't mind sharing all of it. Not sure sharing all is super enlightening, maybe I can find a subset? |
| 03:17:41 | <emojelly> | But as it is I don't even know which part of it is the slow one... |
| 03:18:13 | <EvanR> | emojelly, building a tuple and taking it apart are ridiculously cheap either way, if they aren't optimized out |
| 03:18:58 | × | hughjfchen quits (~hughjfche@vmi2417424.contaboserver.net) (Quit: WeeChat 4.4.3) |
| 03:19:08 | <emojelly> | EvanR: yeah, I'd be surprised... |
| 03:19:34 | <emojelly> | Okay it's never that, but is it per-chance possible that the profiling code *does* have a bug? |
| 03:19:44 | <EvanR> | and that's the only things a tuple can do |
| 03:20:03 | <emojelly> | And as said, I still don't quite understand why "entries" and "time%" don't correlate |
| 03:20:12 | → | hughjfchen joins (~hughjfche@vmi2417424.contaboserver.net) |
| 03:20:14 | <Axman6> | We'd need to see the code, we're speculating about (,) because there's nothing else to go off |
| 03:20:16 | <emojelly> | it's always the cost center *under* the %time-heavy one that has a lot of "entries" |
| 03:21:13 | <emojelly> | https://paste.tomsmeding.com/hq7JjRY1 |
| 03:21:40 | <emojelly> | but it's absolutely not a given that that is the slow code, it's intertwined with Clash and my own test library |
| 03:22:12 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:22:15 | <Axman6> | Yeah I wondered if this was clash stuff |
| 03:22:28 | <EvanR> | stupid question does the program actually do anything |
| 03:23:23 | <emojelly> | yeah, it's my own coroutine based test library that allows you to imperatively test clash simulations... it's awesome, it's just very, very slow |
| 03:23:37 | <emojelly> | let me paste the example I'm testing here |
| 03:24:07 | <emojelly> | https://paste.tomsmeding.com/PEspnrWh |
| 03:24:40 | → | gorignak joins (~gorignak@user/gorignak) |
| 03:24:59 | <emojelly> | combineTestSignals "splits off" the test into two parts that basically run in parallel, the input signals that they produce get pasted back together (that's what the (,)) is for to be fed into the circuit as input |
| 03:25:17 | <emojelly> | the whole thing is based on Coroutines, and it works, does exactly what it should |
| 03:25:57 | <emojelly> | but my test circuit runs for ~5000 cycles under the test ends, so 5000 (small) input tuples produced by the test code I pasted, and the same number of (small) output tuples produced by the circuit |
| 03:26:00 | <Axman6> | I would try splitting those long lines using let if possible, then it's a bit clearer what the SCC's are attached to (and might make it clearer to us what the code is actually doing, there's a lot going on there |
| 03:26:01 | <emojelly> | and it takes like... 10 seconds |
| 03:26:42 | <emojelly> | Axman6: but how does that help, when profiling already tells me all the time is spent in combineTestSignals, which is just "combineTestSignals' ()" and nothing more? |
| 03:26:43 | <EvanR> | there might also be space leaks going on, which slows things down |
| 03:26:55 | <EvanR> | which a different kind of profile might reveal |
| 03:27:05 | <emojelly> | That's the "individual" %time, the one that does *not* also include time for the cost centers hierarchically below |
| 03:27:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 03:27:27 | <emojelly> | EvanR: heap grows to about ~40M and then garbage collection cleans it up |
| 03:27:43 | <emojelly> | it's weird, yeah, but weird enough for being that slow? |
| 03:27:49 | <EvanR> | 40M is nothing |
| 03:27:53 | <emojelly> | exactly |
| 03:27:55 | <emojelly> | also, again |
| 03:28:22 | <Axman6> | what sort of productivity does it say you're getting? how much time is spent in GC? |
| 03:29:06 | <emojelly> | combineTestSignals 0 38.0 34.4 38.0 34.4 7688 19398555176 |
| 03:29:08 | <emojelly> | resume 24035 0.0 0.0 0.0 0.0 0 0 |
| 03:29:15 | <emojelly> | look at this, isn't this nonsensical by itself? |
| 03:29:27 | <emojelly> | 38% of time spent in combineTestSignals, but 0 entries? |
| 03:29:35 | <emojelly> | and resume has 24035 entries but 0% time? |
| 03:29:47 | <Axman6> | use a paste site please |
| 03:30:08 | <emojelly> | https://paste.tomsmeding.com/DWrhtBvL |
| 03:30:16 | <emojelly> | not the same run, but very similar, exhibiting the same weirdness |
| 03:30:18 | <EvanR> | zero time could just be a failure to measure it properly |
| 03:30:38 | <emojelly> | how does the report go from 0 entries to 38% individual (i.e. non-inherited) time? |
| 03:31:08 | <EvanR> | I don't see 0 entries |
| 03:31:12 | <emojelly> | "The number of times this particular point in the call tree was entered." |
| 03:31:18 | <emojelly> | you don't? |
| 03:32:00 | <Axman6> | jesus, I didn't realise the code goes all the way off the screen... |
| 03:32:38 | <emojelly> | ah, I guess if it's how often it's "entered", not how often the profiler saw it... |
| 03:32:49 | <emojelly> | then it isn't nonsensical per se |
| 03:33:19 | <emojelly> | well, the 0 is... unless the 0 means the profiler never caught in "entering"? |
| 03:33:23 | <emojelly> | still weird |
| 03:33:30 | <EvanR> | clearly this data is not helping |
| 03:33:36 | <emojelly> | it clearly isn't |
| 03:36:49 | <emojelly> | let's see what happens if I downgrade ghc two minor versions. |
| 03:37:53 | <emojelly> | I wonder if clash is hiding some unsafePerformIO somewhere... maybe I should also trace system calls. |
| 03:37:59 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:39:35 | <Axman6> | man, I cannot follow that code. It's crying out for some do-notation or something. |
| 03:40:22 | <emojelly> | Axman6: hard do add do notation. Most of this code is just wrapping and unwrapping monads and monad transformers. That's just how this kind of thing goes... |
| 03:41:04 | <emojelly> | but the many {-# SCC ... #-} I added thinking they would help profiling don't help for readability. (That's why it scrolls of the screen.) |
| 03:41:37 | <emojelly> | It's also Coroutine-code, directly manipulating the Coroutines. That kind of code can seem convoluted to begin with. |
| 03:42:43 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 03:45:41 | → | Noir joins (~Noir@2607:ac80:411:a:dc3c:8e7b:ab32:5495) |
| 03:46:42 | × | Noir quits (~Noir@2607:ac80:411:a:dc3c:8e7b:ab32:5495) (Remote host closed the connection) |
| 03:49:30 | → | halloy2596 joins (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) |
| 03:50:04 | <emojelly> | flame graph: https://eniac.digital/fkdlvmiy/pbimage.uBoiIi.s.png |
| 03:50:26 | <emojelly> | I know laziness and all, but it really makes it look like combineTestSignals is spending a whole lot of time not doing anything. |
| 03:53:03 | <halloy2596> | Hi guys, I'm looking for more information regarding Google Summer of Code. I'm new to IRC, and so not very familiar with how to navigate haha |
| 03:53:48 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 03:56:07 | <EvanR> | it's getting late here, you might have shown up in a dead time |
| 03:56:26 | <jackdk> | The Aussies have the night watch |
| 03:56:50 | <jackdk> | I assume you mean Haskell projects for GSoC and not the scheme as a whole? I would expect an organisation like the Haskell Foundation to maintain pages with proposed projects, but I've never been involved |
| 03:57:48 | <ski> | halloy2596 : most important advice : stick around, preferably at least for a couple of hours, to allow people to respond |
| 03:58:03 | × | Fijxu quits (~Fijxu@user/fijxu) (Quit: XD!!) |
| 03:58:29 | <jackdk> | halloy2596: I'd recommend some web searches; a few minutes on DDG turned up https://summer.haskell.org/ideas.html |
| 03:59:31 | <jackdk> | (prefixing a message with a name and a colon is like addressing it to that user; most clients will alert you if they see a message addressed to you. This convention predates @-ing people) |
| 03:59:36 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 264 seconds) |
| 03:59:58 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 04:01:09 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 04:04:08 | <halloy2596> | jackdk: Yep, I meant the Haskell projects for GSoC. I'd already looked at the project ideas, and specifically wanted to learn more about Liquid Haskell project. |
| 04:04:39 | × | amadaluzia_ quits (~amadaluzi@2a00:23c7:ed8b:6701:e287:4eed:50df:f686) (Ping timeout: 260 seconds) |
| 04:04:42 | <halloy2596> | ski: understood |
| 04:06:48 | halloy2596 | is now known as Noir |
| 04:07:32 | <ski> | (that's the most common mistake IRC newbies seem to make : assume that if noone responds within five minutes (at best), then the channel must be dead) |
| 04:08:15 | <EvanR> | and leave usually 2.7 minutes before I'm about to respond |
| 04:08:22 | <EvanR> | ime |
| 04:08:24 | <ski> | indeed |
| 04:08:30 | <jackdk> | I've spoken to Facundo a couple of times, but I don't think he's on IRC. He's definitely keen to get more people using Liquid Haskell though. I'd see if you can turn up his email or DM him on discourse.haskell.org or something. General advice: put your specific questions into your opening email, because that shows you've done some homework and saves an email round-trip before getting stuck into the nitty-gritty. |
| 04:08:53 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 04:09:35 | → | JuanDaugherty joins (~juan@user/JuanDaugherty) |
| 04:11:38 | <ski> | hm, wasn't there a liquid-haskell channel or something ? |
| 04:11:51 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:12:21 | <jackdk> | Oh possibly, but I never heard about it |
| 04:13:22 | <ski> | perhaps it was only on Freenode |
| 04:13:32 | <JuanDaugherty> | cause quickcheck an stuff just isn enuf |
| 04:14:26 | <Noir> | ski: I can't afford to leave lol. Applications close April 8 18:00 UTC, and since I forgot to put the GSoC's timeline in my calendar, I only got reminded an hour ago :( |
| 04:14:26 | <ski> | ah, yes, #liquidhaskell used to exist ! |
| 04:14:28 | <JuanDaugherty> | why liquid haskell ftw |
| 04:15:34 | <ski> | Noir : here's a few things which might be useful to be aware of : "Don't Ask to Ask" <https://solhsa.com/dontask.html> (also <https://dontasktoask.com/>),"No Hello" in 2013-01-16 at <https://www.nohello.com/>,"How To Ask Questions The Smart Way" by Eric S. Raymond in 2001 - 2014 at <http://www.catb.org/esr/faqs/smart-questions.html> |
| 04:15:44 | <Noir> | jackdk: Alright, I'll look into getting in contact with Facundo. Appreciate the tip! |
| 04:16:21 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 04:16:21 | <ski> | (btw, not all people on IRC agree with all the points in those .. but some do, so it's good to know about, still) |
| 04:17:01 | <Noir> | ski: I'd seen "Don't Ask to Ask", but not the other two. Thanks |
| 04:17:31 | <ski> | (different channels can have a bit different atmosphere, culture, be more or less strict about off-topic chatter, and other things. it's a good idea to lay a bit low, when joining a new channel) |
| 04:17:50 | <Noir> | I see |
| 04:18:01 | <jackdk> | I strongly agree with most of the _content_ of those links (though nohello is more for DM/IM, IMHO) but wish the _framing_ was nicer |
| 04:18:01 | <ski> | (i know of at least one channel here, where you can get kicked, if you insist on greeting, without stating any question or opening a conversation topic) |
| 04:18:25 | <EvanR> | lol |
| 04:18:39 | <EvanR> | you can easily circumvent it though |
| 04:18:45 | <EvanR> | nohello evasion |
| 04:18:50 | → | tavare joins (~tavare@user/tavare) |
| 04:19:18 | → | michalz joins (~michalz@185.246.207.205) |
| 04:21:27 | <ski> | 2017-01-17 <wonder91:#liquidhaskell> ski: because it appears that, when the first Int is in { } brackets, i.e. {pIn : Int | x <= 255}, I couldn't use it later in the constraint {pOut : Int | pIn <= pOut ... } |
| 04:21:58 | <EvanR> | 2017, libera didn't exist |
| 04:22:05 | <ski> | indeed |
| 04:27:14 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:28:23 | <ski> | @quote answer.to.answer |
| 04:28:23 | <lambdabot> | monochrom says: ... in other words: Don't answer to answer, just don't answer. >:) |
| 04:30:03 | <monochrom> | I'm great at duality >:) |
| 04:30:31 | <monochrom> | Another one: Cocartes says: Coproduct ergo sum. |
| 04:30:35 | <ski> | apparently i said "my answer to that is : don't deduce, denote!" in response to something .. no idea what, though |
| 04:30:51 | <monochrom> | (Cocartes was the evil twin of Descartes!) |
| 04:31:06 | <ski> | not Cocortez, then ? |
| 04:31:22 | <monochrom> | No. |
| 04:31:24 | <ski> | or maybe that's just Rtez |
| 04:32:18 | <ski> | @quote ergo.sum |
| 04:32:18 | <lambdabot> | No quotes match. Are you on drugs? |
| 04:32:21 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 04:32:34 | <monochrom> | We're OK with hello though. Empirically no chain reaction has occurred, despite the theory. |
| 04:32:36 | <EvanR> | rude |
| 04:32:44 | <ski> | @remember monochrom Cocartes says: Coproduct ergo sum. |
| 04:32:44 | <lambdabot> | I will never forget. |
| 04:33:24 | <ski> | i'm not on drugs yet .. haven't made morning tea |
| 04:34:29 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 248 seconds) |
| 04:35:18 | <monochrom> | There is one more layer of pun there. Infinite coproduct becomes the existential quantifer --- ergo sum! |
| 04:36:51 | <ski> | why infinite ? |
| 04:37:12 | <monochrom> | OK doesn't have to be always infinite. |
| 04:37:44 | <monochrom> | Alternatively, the infinite case includes the finite case too! |
| 04:38:21 | <ski> | reminds me of lexicographic well-ordering |
| 04:38:45 | <ski> | hm .. and maybe wreath product on groups, or something ? |
| 04:43:01 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:44:50 | <Noir> | I reached out to Facundo (who's also the officially listed mentor for the Liquid Haskell project), but I got an automatic reply saying he'll be available from April 21st. |
| 04:45:14 | <Noir> | Who should I try reaching out to next? |
| 04:47:54 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 04:49:05 | <kqr> | EvanR, I did also have the idea of indexing in stages and running a query in between, but for this use case the complexity seems a tad too large |
| 04:50:54 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 04:50:55 | <kqr> | [exa], I already had -O2. I tried adding -fspecialise-aggressively and -fexpose-all-unfoldings but they did not make any difference in this case. |
| 04:55:44 | <kqr> | EvanR, [exa]: Thanks for your engagement though. The sum of all the changes I've made since I started on this let me build an index for the full dataset in something like 10 minutes, using 20 GB of process memory (9 GB of active heap). That is good enough for my purposes and I will move on from this particular optimisation quest! |
| 04:55:52 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 05:06:10 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:06:56 | × | Noir quits (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) (Read error: Connection reset by peer) |
| 05:11:00 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 05:13:17 | × | JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: praxis.meansofproduction.biz (juan@acm.org)) |
| 05:18:49 | → | halloy2596 joins (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) |
| 05:21:57 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:25:22 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 05:26:45 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 05:37:44 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:44:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds) |
| 05:45:59 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 244 seconds) |
| 05:55:48 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 05:57:35 | <Axman6> | emojelly: I'm curious what happens if you add specialisable to those functions, it feels like at the very least there's a lot of type class stuff going on that isn't visible |
| 06:00:42 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 06:04:56 | <emojelly> | 7,994,380,248 bytes copied during GC |
| 06:04:58 | <emojelly> | Alloc rate 5,171,993,593 bytes per MUT second |
| 06:05:05 | <emojelly> | you think that could be my problem? |
| 06:05:18 | <emojelly> | that's a lot of copying bytes around for not a lot of work... |
| 06:06:59 | × | halloy2596 quits (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) (Read error: Connection reset by peer) |
| 06:11:25 | × | jmcantrell quits (~weechat@user/jmcantrell) (Quit: WeeChat 4.6.0) |
| 06:11:25 | jmcantrell_ | is now known as jmcantrell |
| 06:11:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:12:56 | <Axman6> | yeah, that's why I asked about productivity earlier. what productivity % do you get? |
| 06:14:15 | → | thuna` joins (~thuna`@user/thuna/x-1480069) |
| 06:14:21 | <Axman6> | emojelly: Also, if you're not there already, the #clash channel on the functional programming slack (I can link you if needed) has most of the clash devs, and they're super helpful. |
| 06:14:52 | <Axman6> | Do you have the cod ein a github repo somewhere? I'm curious |
| 06:16:28 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 06:17:42 | <emojelly> | Axman6: I still do get >70% productivity and not *that* much gc time. If I turn the GC "off" (-I0 -A100G), it spends no time in gc, but it's still at over 3 bytes per MUT second |
| 06:17:56 | <emojelly> | I don't think gc is so much the issue, as more that I'm somehow generating/moving *a lot* of data |
| 06:18:00 | <emojelly> | and that data does not get retained |
| 06:18:34 | <emojelly> | I can't figure out anything with heap profiling so far, because the heap stays relatively small (~40MB) despite, apparently, generating GBs of data per second... |
| 06:18:59 | <emojelly> | don't have the code in a repo right now, will eventually put it |
| 06:19:21 | <Axman6> | lmk when you do and I'll take a look |
| 06:19:49 | <emojelly> | what's weird is that it says "78,163,981,824 bytes allocated in the heap", but heap profiling maxes out at around 40MB |
| 06:20:23 | <emojelly> | What does that mean? That there is a lot of really shortlived data? |
| 06:20:47 | <Axman6> | seems likely |
| 06:21:51 | <emojelly> | I wish I could figure out what and why... |
| 06:22:28 | <Axman6> | There's some new flag that tags each allocation with its location IIRC. not sure exactly how helpful that'd be for short lived stuff |
| 06:23:39 | <emojelly> | Ah, do you happen to know which one? |
| 06:25:02 | → | fp1 joins (~Thunderbi@wireless-86-50-140-125.open.aalto.fi) |
| 06:27:23 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:30:39 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 06:32:23 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 06:34:18 | → | CiaoSen joins (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) |
| 06:38:28 | → | halloy2596 joins (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) |
| 06:38:57 | × | halloy2596 quits (~halloy259@2607:ac80:411:a:dc3c:8e7b:ab32:5495) (Client Quit) |
| 06:41:12 | <Axman6> | um, it might be https://downloads.haskell.org/ghc/latest/docs/users_guide/profiling.html#rts-flag-hm or -hi used with https://downloads.haskell.org/ghc/latest/docs/users_guide/debug-info.html#ghc-flag-finfo-table-map |
| 06:41:33 | × | ft quits (~ft@p508db463.dip0.t-ipconnect.de) (Quit: leaving) |
| 06:41:47 | <Axman6> | part of me really wants to replace so much of that code with coerce |
| 06:41:58 | <Axman6> | (your coroutine code)_ |
| 06:42:45 | <Axman6> | I have a feeling that rewrapCo f = Coroutine $ ReaderT (\c -> ExceptT (Identity (f c))) can become rewrapCo f = coerce f |
| 06:43:11 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 06:43:40 | <Axman6> | where might be benefits to doing that too, as the explicit lambda might actually get allocated - reminds me of an accidentally quadratic bug in cabal years ago |
| 06:44:43 | <Axman6> | See https://accidentallyquadratic.tumblr.com/tagged/haskell for some examples |
| 06:44:51 | → | tromp joins (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) |
| 06:45:34 | × | tromp quits (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) (Client Quit) |
| 06:48:10 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds) |
| 06:49:58 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 06:51:52 | → | tromp joins (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) |
| 06:54:06 | × | foul_owl quits (~kerry@94.156.149.96) (Read error: Connection reset by peer) |
| 06:58:58 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 07:00:01 | × | caconym quits (~caconym@user/caconym) (Quit: bye) |
| 07:01:03 | → | caconym joins (~caconym@user/caconym) |
| 07:03:11 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 07:03:56 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 07:10:51 | → | foul_owl joins (~kerry@94.156.149.99) |
| 07:16:07 | × | tavare quits (~tavare@user/tavare) (Remote host closed the connection) |
| 07:17:29 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 07:17:29 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 252 seconds) |
| 07:18:52 | Lord_of_Life_ | is now known as Lord_of_Life |
| 07:23:57 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 07:24:56 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 07:33:33 | × | fp1 quits (~Thunderbi@wireless-86-50-140-125.open.aalto.fi) (Ping timeout: 268 seconds) |
| 07:35:31 | <jackdk> | Axman6: if you had your way, everything would either be `coerce` or `id` |
| 07:35:59 | <Axman6> | absolutely |
| 07:36:25 | → | acidjnk_new3 joins (~acidjnk@p200300d6e71c4f636055d0f69fb4dc8c.dip0.t-ipconnect.de) |
| 07:40:24 | → | lxsameer joins (~lxsameer@Serene/lxsameer) |
| 07:43:08 | × | emmanuelux quits (~emmanuelu@user/emmanuelux) (Read error: Connection reset by peer) |
| 07:53:20 | → | merijn joins (~merijn@77.242.116.146) |
| 07:53:50 | → | polyphem joins (~rod@p4fc2cb32.dip0.t-ipconnect.de) |
| 07:54:53 | → | machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net) |
| 07:58:24 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 07:58:43 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 08:04:15 | → | dhil joins (~dhil@2a0c:b381:52e:3600:103b:c63d:9624:f51b) |
| 08:17:31 | → | chele joins (~chele@user/chele) |
| 08:18:41 | × | user363627 quits (~user@user/user363627) (Remote host closed the connection) |
| 08:26:58 | × | tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz) |
| 08:41:19 | <ski> | sounds fun. getting that kind of eta-contraction is kinda what tail-calls are about |
| 08:55:03 | → | Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
| 09:04:00 | → | sprotte24 joins (~sprotte24@p200300d16f06b600a14bd9dc58a29dc6.dip0.t-ipconnect.de) |
| 09:04:26 | × | gorignak quits (~gorignak@user/gorignak) (Read error: Connection reset by peer) |
| 09:04:32 | → | whez joins (uid470288@id-470288.lymington.irccloud.com) |
| 09:04:55 | → | gorignak joins (~gorignak@user/gorignak) |
| 09:07:54 | → | ubert joins (~Thunderbi@2a02:8109:ab8a:5a00:27cc:9672:1463:dd93) |
| 09:25:08 | → | jco joins (~jco@78-70-217-44-no600.tbcn.telia.com) |
| 09:25:22 | → | fkv24 joins (~fkv24@176.110.103.7) |
| 09:26:13 | × | duckworld quits (~duckworld@user/duckworld) (Remote host closed the connection) |
| 09:26:26 | × | fkv24 quits (~fkv24@176.110.103.7) (Client Quit) |
| 09:26:47 | → | duckworld joins (~duckworld@user/duckworld) |
| 09:28:39 | × | duckworld quits (~duckworld@user/duckworld) (Remote host closed the connection) |
| 09:28:57 | → | duckworld joins (~duckworld@user/duckworld) |
| 09:47:07 | × | tromp quits (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 09:48:06 | → | tromp joins (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) |
| 09:50:06 | → | bitdex_ joins (~bitdex@gateway/tor-sasl/bitdex) |
| 09:51:48 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 264 seconds) |
| 09:54:10 | → | j1n37 joins (~j1n37@user/j1n37) |
| 09:55:14 | × | j1n37- quits (~j1n37@user/j1n37) (Ping timeout: 260 seconds) |
| 09:59:12 | → | forell joins (~forell@user/forell) |
| 10:02:53 | × | hc quits (~hc@mail.hce.li) (Remote host closed the connection) |
| 10:13:59 | × | glguy quits (glguy@libera/staff/glguy) (Read error: Connection reset by peer) |
| 10:14:20 | → | glguy joins (glguy@libera/staff/glguy) |
| 10:17:24 | → | Smiles joins (uid551636@id-551636.lymington.irccloud.com) |
| 10:19:33 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 248 seconds) |
| 10:19:42 | × | xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 246 seconds) |
| 10:20:24 | → | tabaqui joins (~tabaqui@167.71.80.236) |
| 10:28:05 | × | CiaoSen quits (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) (Ping timeout: 265 seconds) |
| 10:28:21 | → | poxel joins (~lennart@user/poxel) |
| 10:30:32 | × | poxel quits (~lennart@user/poxel) (Client Quit) |
| 10:31:13 | → | poxel joins (~lennart@user/poxel) |
| 10:33:25 | × | poxel quits (~lennart@user/poxel) (Client Quit) |
| 10:33:54 | → | __monty__ joins (~toonn@user/toonn) |
| 10:35:20 | → | poxel joins (~lennart@user/poxel) |
| 10:38:00 | <[exa]> | tomsmeding: btw after a few attempts trying to force massiv to do the histogram op sanely, I'm now with accelerate :D |
| 10:40:51 | → | CiaoSen joins (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) |
| 10:46:14 | → | Guest87 joins (~Guest87@139.167.143.182) |
| 10:46:58 | <[exa]> | btw just curious, can the scatter work there in parallel somehow? (the typical implementation is to split the source array, make a few thread-private copies of the target array, and then quickly merge them on the end) |
| 10:48:04 | × | Guest87 quits (~Guest87@139.167.143.182) (Client Quit) |
| 10:48:58 | → | Guest56 joins (~Guest38@2601:408:c181:12c0:fc6a:ec80:dcee:cbd5) |
| 10:51:10 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 10:51:57 | <[exa]> | otoh any way to get accelerate working with ghc>9.2 ? |
| 10:52:20 | <[exa]> | oh I mean, >=9 |
| 10:55:54 | <srk> | looks like git one has support https://github.com/AccelerateHS/accelerate/pulls?q=is%3Apr+is%3Aclosed |
| 11:00:05 | × | caconym quits (~caconym@user/caconym) (Quit: bye) |
| 11:02:09 | → | caconym joins (~caconym@user/caconym) |
| 11:02:25 | → | jespada joins (~jespada@r190-133-49-11.dialup.adsl.anteldata.net.uy) |
| 11:02:54 | × | thuna` quits (~thuna`@user/thuna/x-1480069) (Ping timeout: 260 seconds) |
| 11:07:13 | <[exa]> | oh great |
| 11:07:15 | <[exa]> | srk: thx |
| 11:16:23 | → | xff0x joins (~xff0x@2405:6580:b080:900:c071:5032:6468:f840) |
| 11:31:22 | → | Guest33 joins (~Guest33@2409:40c0:37:8c86:24db:abaa:17dd:df2b) |
| 11:33:11 | × | jespada quits (~jespada@r190-133-49-11.dialup.adsl.anteldata.net.uy) (Ping timeout: 244 seconds) |
| 11:33:37 | → | Guest48 joins (~Guest33@2409:40c0:37:8c86:24db:abaa:17dd:df2b) |
| 11:35:02 | → | puke joins (~puke@user/puke) |
| 11:35:33 | × | Guest48 quits (~Guest33@2409:40c0:37:8c86:24db:abaa:17dd:df2b) (Client Quit) |
| 11:35:33 | → | jespada joins (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) |
| 11:36:12 | <[exa]> | hm are there any accelerate helpers for reading matrices from TSVs? |
| 11:37:56 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 11:38:16 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 11:38:22 | × | TheCoffeMaker_ quits (~TheCoffeM@186.136.173.70) (Ping timeout: 268 seconds) |
| 11:44:51 | × | tromp quits (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 11:45:33 | × | Guest33 quits (~Guest33@2409:40c0:37:8c86:24db:abaa:17dd:df2b) (Quit: Client closed) |
| 11:48:14 | × | acidjnk_new3 quits (~acidjnk@p200300d6e71c4f636055d0f69fb4dc8c.dip0.t-ipconnect.de) (Ping timeout: 268 seconds) |
| 11:57:06 | → | weary-traveler joins (~user@user/user363627) |
| 12:01:21 | → | acidjnk_new3 joins (~acidjnk@p200300d6e71c4f63a07ba30a5b7d27a5.dip0.t-ipconnect.de) |
| 12:08:14 | <haskellbridge> | <Liamzee> hey EvanR |
| 12:09:55 | <haskellbridge> | <Liamzee> Yup, here. Wechat Haskell is sort of wild, there's this Wally-esque guy going on about his Haskell "sh* mountain" repo, and worrying about the probability that his code will break within a year and he'll be unable to fix it, and other people are complimenting him on having obtained job security. |
| 12:11:02 | <haskellbridge> | <Liamzee> Oh, hi Hellwolf. |
| 12:11:37 | <hellwolf> | hmm, hi? |
| 12:12:09 | <haskellbridge> | <Liamzee> I'm just saying it's great, you're probably on chat. |
| 12:14:41 | <haskellbridge> | <Liamzee> Gossip-wise, I'd rather focus on just having discovered Mercury's Haskell-oriented AI assistant than's based on Senko from Senko the Helpful Fox. |
| 12:15:54 | <haskellbridge> | <Liamzee> https://github.com/MercuryTechnologies/ada |
| 12:20:54 | × | j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 260 seconds) |
| 12:21:55 | → | j1n37 joins (~j1n37@user/j1n37) |
| 12:22:27 | <haskellbridge> | <Liamzee> "Make more Haskell sh* mountains and create more jobs for Haskell" |
| 12:24:57 | <hellwolf> | jobs4all? |
| 12:27:03 | × | CiaoSen quits (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) (Ping timeout: 245 seconds) |
| 12:28:35 | × | bionade24 quits (~quassel@server2.oscloud.info) (Quit: Apocalypse Incoming!) |
| 12:30:50 | <haskellbridge> | <Liamzee> And honestly that's why I care about Chinese Haskell so much, the Chinese Haskell community, what's left of it, is pragmatic to the point of cynicism, and that speaks to my heart. Monads are nice because they're useful, and over-abstracting your codebase leads to job security. |
| 12:36:25 | × | Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 12:37:17 | [exa] | confused |
| 12:39:07 | × | Guest56 quits (~Guest38@2601:408:c181:12c0:fc6a:ec80:dcee:cbd5) (Quit: Client closed) |
| 12:42:52 | <haskellbridge> | <Liamzee> [exa]: why are you confused? |
| 12:43:33 | × | acidjnk_new3 quits (~acidjnk@p200300d6e71c4f63a07ba30a5b7d27a5.dip0.t-ipconnect.de) (Ping timeout: 246 seconds) |
| 12:45:07 | <[exa]> | how does one use the FullShape from accelerate? I'm permanently getting errors that something wants e.g. `Couldn't match type: A.FullShape ((Z :. head0) :. head1) with with: `(Z :. Int) :. Int` |
| 12:45:47 | → | acidjnk_new3 joins (~acidjnk@p200300d6e71c4f631cbaa9c9535aaf6d.dip0.t-ipconnect.de) |
| 12:47:15 | <[exa]> | uuuuuuuuh, got solved by annotating the indices with ::Int |
| 12:47:50 | <[exa]> | so probably a type family inference issue I guess, yet still interesting (from the error message it seems to very well know that there's Int) |
| 12:47:53 | → | TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker) |
| 12:49:37 | → | tromp joins (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) |
| 12:52:00 | <Leary> | The compiler needs to know that `head0, head1 ~ Int` to select the right instance and resolve the type family, only then will it see that the types match. It can't work backwards from the RHS of a type family without injectivity annotations. |
| 12:53:43 | × | TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 252 seconds) |
| 12:54:07 | → | TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker) |
| 12:54:54 | × | bitdex_ quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 12:55:10 | <[exa]> | ahhh OIC, I messed up the error message reading |
| 12:56:10 | <[exa]> | I was reading one on the array, which was expecting the FullShape with type variables, and got one with Ints. The one on the actual indices is complaining about CoSliceShape |
| 12:56:12 | <[exa]> | all good |
| 12:56:14 | <[exa]> | Leary: thanks :) |
| 12:58:38 | → | bionade24 joins (~quassel@2a03:4000:33:45b::1) |
| 13:21:14 | × | TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 252 seconds) |
| 13:22:57 | → | TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker) |
| 13:29:29 | × | ubert quits (~Thunderbi@2a02:8109:ab8a:5a00:27cc:9672:1463:dd93) (Quit: ubert) |
| 13:32:22 | → | Chai-T-Rex joins (~ChaiTRex@user/chaitrex) |
| 13:33:48 | <haskellbridge> | <Liamzee> oh, btw, mercury is like, Haskell's #2 unicorn, right? |
| 13:35:36 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 264 seconds) |
| 13:38:55 | <haskellbridge> | <Liamzee> well, no one's interested, but Mercury is now valued at 3.6 billion, and if Hasura is still growing, Mercury is likely in the same range. Revenue is half that of Anduril's (latter is estimated at over 1 billion, Mercury is around half a billion, but likely good profit margins due to their category) |
| 13:38:59 | <haskellbridge> | <Liamzee> dropped |
| 13:42:09 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 13:42:12 | × | loonycyborg quits (loonycybor@wesnoth/developer/loonycyborg) (Ping timeout: 272 seconds) |
| 13:43:08 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 13:43:28 | → | loonycyborg joins (loonycybor@wesnoth/developer/loonycyborg) |
| 13:47:13 | × | TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 244 seconds) |
| 13:51:53 | <__monty__> | Another weapons manufacturer? What a sad world. |
| 14:02:55 | <haskellbridge> | <Liamzee> ??? |
| 14:03:00 | <haskellbridge> | <Liamzee> Mercury's a fintech company, a virtual bank |
| 14:04:26 | × | bezik quits (~bezik@wikipedia/bezik) (Quit: bye/) |
| 14:05:08 | <haskellbridge> | <Liamzee> they specialize in providing banking services to startups |
| 14:07:26 | × | polyphem quits (~rod@p4fc2cb32.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 14:09:27 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 14:09:47 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 14:10:14 | × | vulpine quits (xfnw@user/meow/xfnw) (Quit: Connection reset by purr) |
| 14:10:48 | → | vulpine joins (xfnw@user/meow/xfnw) |
| 14:10:54 | <__monty__> | Ah, that's slightly less overtly harmful. |
| 14:11:13 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.5.2) |
| 14:13:59 | <haskellbridge> | <Liamzee> i don't see how that's harmful at all |
| 14:17:48 | × | alinab quits (sid468903@id-468903.helmsley.irccloud.com) (Ping timeout: 276 seconds) |
| 14:17:48 | × | gmc quits (sid58314@id-58314.ilkley.irccloud.com) (Ping timeout: 276 seconds) |
| 14:18:02 | × | tapas quits (sid467876@id-467876.ilkley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:05 | × | cbarrett quits (sid192934@id-192934.helmsley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:05 | × | alanz quits (sid110616@id-110616.uxbridge.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:05 | × | sa quits (sid1055@id-1055.tinside.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:06 | × | rubin55 quits (sid666180@id-666180.ilkley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:07 | × | unlucy quits (sid572875@user/unlucy) (Read error: Connection reset by peer) |
| 14:18:11 | → | alinab joins (sid468903@id-468903.helmsley.irccloud.com) |
| 14:18:13 | → | gmc joins (sid58314@id-58314.ilkley.irccloud.com) |
| 14:18:14 | → | tapas joins (sid467876@id-467876.ilkley.irccloud.com) |
| 14:18:15 | → | alanz joins (sid110616@id-110616.uxbridge.irccloud.com) |
| 14:18:16 | → | cbarrett joins (sid192934@id-192934.helmsley.irccloud.com) |
| 14:18:21 | × | Pent quits (sid313808@id-313808.lymington.irccloud.com) (Ping timeout: 252 seconds) |
| 14:18:22 | × | Kamuela quits (sid111576@id-111576.tinside.irccloud.com) (Ping timeout: 252 seconds) |
| 14:18:22 | → | rubin55 joins (sid666180@id-666180.ilkley.irccloud.com) |
| 14:18:27 | × | gaze__ quits (sid387101@id-387101.helmsley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:27 | × | shawwwn quits (sid6132@id-6132.helmsley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:31 | → | sa joins (sid1055@id-1055.tinside.irccloud.com) |
| 14:18:36 | × | mustafa quits (sid502723@rockylinux/releng/mustafa) (Read error: Connection reset by peer) |
| 14:18:37 | → | unlucy joins (sid572875@user/unlucy) |
| 14:18:39 | → | gaze__ joins (sid387101@id-387101.helmsley.irccloud.com) |
| 14:18:39 | → | shawwwn joins (sid6132@id-6132.helmsley.irccloud.com) |
| 14:18:42 | × | meinside quits (uid24933@id-24933.helmsley.irccloud.com) (Read error: Connection reset by peer) |
| 14:18:42 | × | integral quits (sid296274@user/integral) (Read error: Connection reset by peer) |
| 14:18:47 | → | mustafa joins (sid502723@rockylinux/releng/mustafa) |
| 14:18:54 | → | meinside joins (uid24933@id-24933.helmsley.irccloud.com) |
| 14:18:56 | → | integral joins (sid296274@user/integral) |
| 14:20:01 | × | taktoa[c] quits (sid282096@id-282096.tinside.irccloud.com) (Ping timeout: 248 seconds) |
| 14:20:02 | × | Boarders_____ quits (sid425905@id-425905.lymington.irccloud.com) (Ping timeout: 248 seconds) |
| 14:20:02 | × | caasih quits (sid13241@id-13241.ilkley.irccloud.com) (Ping timeout: 248 seconds) |
| 14:20:05 | × | edm quits (sid147314@id-147314.hampstead.irccloud.com) (Ping timeout: 265 seconds) |
| 14:20:11 | → | Boarders_____ joins (sid425905@id-425905.lymington.irccloud.com) |
| 14:20:34 | → | taktoa[c] joins (sid282096@id-282096.tinside.irccloud.com) |
| 14:22:25 | → | caasih joins (sid13241@id-13241.ilkley.irccloud.com) |
| 14:22:34 | → | Kamuela joins (sid111576@id-111576.tinside.irccloud.com) |
| 14:22:48 | → | Pent joins (sid313808@id-313808.lymington.irccloud.com) |
| 14:23:35 | → | edm joins (sid147314@id-147314.hampstead.irccloud.com) |
| 14:29:46 | <EvanR> | Liamzee, about how monads = job security (as opposed to just being useful for coding), I was really surprised at my code yesterday. I needed a "fresh variable" at places in the algorithm, so instead of shoe horning a stateful generator into the recursion, I made a quick (non-free) monad for it |
| 14:30:04 | <EvanR> | and it actually cleaned up the code since I could put the other thing in there, failing early |
| 14:30:55 | <EvanR> | I feel like it took less code than pulling in a "monad stack" for this purpose |
| 14:34:30 | <EvanR> | maybe monads get unfairly disrespected! |
| 14:37:58 | × | poxel quits (~lennart@user/poxel) (Ping timeout: 265 seconds) |
| 14:39:33 | → | amadaluzia joins (~amadaluzi@2a00:23c7:ed8b:6701:c483:4ce8:4c61:1453) |
| 14:41:12 | <ski> | @unmtl StateT s Maybe a |
| 14:41:12 | <lambdabot> | s -> Maybe (a, s) |
| 14:42:28 | <EvanR> | it might be even less code to write the whole thing using s -> Maybe (a, s) but the code would be much noisier |
| 14:44:03 | → | Smiles joins (uid551636@id-551636.lymington.irccloud.com) |
| 14:45:18 | → | poxel joins (~lennart@user/poxel) |
| 14:47:02 | <ski> | mm |
| 14:49:11 | <EvanR> | apparently in elixir they are living with threading the next state variables carefully through the computation after pattern matching on the return value. Which is why they proposed a dedicated state monad syntax, but without monads :( |
| 14:50:57 | × | jespada quits (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) (Quit: My Mac has gone to sleep. ZZZzzz…) |
| 14:51:41 | <haskellbridge> | <Liamzee> well i didn't say they were for job security, i was just saying using excessive non-useful abstraction was good for job security, and i was half making fun of the cynicism in chinese haskell community |
| 14:52:18 | <EvanR> | abstraction if done right is addictive! |
| 14:52:21 | <haskellbridge> | <Liamzee> EvanR: dedicated syntax isn't a bad thing insofar as it'll be handled by the compiler instead of through lambda calculus with implied costs of bind |
| 14:52:24 | <EvanR> | not everyone has seen the light |
| 14:53:05 | <EvanR> | I disagree here because they could have reused the syntax for other things, e.g. early return, or whatever effects |
| 14:53:12 | <haskellbridge> | <Liamzee> abstraction is only useful if other people understand the abstraction |
| 14:53:16 | <EvanR> | they just would be guilty of using monads |
| 14:53:27 | <EvanR> | I disagree with that |
| 14:53:29 | → | sprotte24_ joins (~sprotte24@p200300d16f06b600a14bd9dc58a29dc6.dip0.t-ipconnect.de) |
| 14:53:35 | <EvanR> | as literally stated |
| 14:53:58 | <haskellbridge> | <Liamzee> the same guy complaining was admitting to abusing C++ templates to make it hard for his end users to modify his code |
| 14:53:58 | <EvanR> | since it diminishes the value of your individual understanding |
| 14:54:50 | <EvanR> | then that's not abstraction but obfuscation |
| 14:55:30 | → | ouilemur joins (~jgmerritt@user/ouilemur) |
| 14:55:43 | <ouilemur> | #haskell-beginners |
| 14:56:27 | <hellwolf> | it's like dress code, but for code style, so that you exclude some people culturally? |
| 15:00:44 | <haskellbridge> | <Liamzee> But it's just standard use of C++ templates, it just ended up being that his customers were unlikely to have knowledge of C++ metaprogramming |
| 15:01:14 | × | gorignak quits (~gorignak@user/gorignak) (Quit: quit) |
| 15:01:31 | → | gorignak joins (~gorignak@user/gorignak) |
| 15:02:53 | × | gorignak quits (~gorignak@user/gorignak) (Client Quit) |
| 15:03:44 | <EvanR> | ski, and a new variable generator kind of doesn't need full state, since the counter could only increase. So a supply monad |
| 15:05:56 | <haskellbridge> | <Liamzee> supply monad? |
| 15:06:39 | <haskellbridge> | <Liamzee> https://hackage.haskell.org/package/transformers-supply-0.1.0/docs/Control-Monad-Supply.html |
| 15:06:47 | <EvanR> | that is that |
| 15:08:02 | <haskellbridge> | <Liamzee> i think it's like a cultural thing with us, we like going "ooh, a new monad", but for someone unfamiliar with it, since it's rarer than standard RWS, it means 15-30 minutes grokking it when they might have other things to do |
| 15:09:25 | → | hiecaq joins (~hiecaq@user/hiecaq) |
| 15:10:03 | <EvanR> | sometimes you hear this argument that you shouldn't use something because someone might not have heard of it |
| 15:10:18 | <EvanR> | which if serious would drastically curtail the number of things you can use |
| 15:10:50 | <EvanR> | a lot of people have not heard of C++. Better avoid |
| 15:12:36 | <haskellbridge> | <Liamzee> i mean you were asking about the complaints about Haskell and the Lisps producing eDSL disease; this is a component of eDSL disease, abstractions which are useful but require onboarding time |
| 15:13:01 | <EvanR> | "eDSL disease" sounds like a non-starter already |
| 15:14:09 | <EvanR> | lets talk about the pros and cons of C++ disease. I think I'd be laughed out of the room |
| 15:16:40 | <haskellbridge> | <Liamzee> wait, are you working in C++ again? |
| 15:17:51 | <EvanR> | that was a hypothetical to demonstrate the absurdity of "eDSL disease" as a token |
| 15:18:04 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 15:18:16 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 15:19:08 | <hellwolf> | what is an eDSL disease? |
| 15:19:12 | → | jespada joins (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) |
| 15:19:45 | <EvanR> | using an eDSL |
| 15:20:13 | <haskellbridge> | <Liamzee> i'm just characterizing it as a criticism of Haskell and the Lisps, i.e, the ability to create codebases that are hard to onboard because they're effectively obfuscated by overuse of macros or creation of a complex eDSL for the codebase |
| 15:20:52 | <EvanR> | well bring someone in who feels that way and may we can show them the light |
| 15:21:30 | <haskellbridge> | <Liamzee> so i guess your new position is "simple haskell is stupid"? |
| 15:22:10 | → | __jmcantrell__ joins (~weechat@user/jmcantrell) |
| 15:22:28 | jmcantrell | is now known as Guest9294 |
| 15:22:28 | × | Guest9294 quits (644f1bed9a@user/jmcantrell) (Killed (molybdenum.libera.chat (Nickname regained by services))) |
| 15:22:28 | __jmcantrell__ | is now known as jmcantrell |
| 15:22:36 | <haskellbridge> | <Liamzee> my position isn't that abstraction is intrinsically bad either, it's that abstraction has tradeoffs |
| 15:22:37 | → | jmcantrell_ joins (644f1bed9a@user/jmcantrell) |
| 15:23:03 | <EvanR> | you use abstractions at many levels and it's taken for granted |
| 15:23:25 | <EvanR> | virtual memory is an abstraction, arithmetic is an abstraction, dynamically typed programming is a giant abstraction |
| 15:23:50 | <haskellbridge> | <Liamzee> would you agree that abstraction increases onboarding time? |
| 15:23:51 | <EvanR> | whatever the trade off is, people are taking it |
| 15:24:18 | <EvanR> | being unfamiliar with something increases onboarding time |
| 15:24:20 | <EvanR> | generally |
| 15:24:39 | <hellwolf> | let's just use the actual turing machine with belt and boxes. |
| 15:24:40 | <EvanR> | and there's a lot of examples of that besides an eDSL |
| 15:24:53 | <hellwolf> | abstractions be damned. |
| 15:25:06 | <EvanR> | hellwolf, turing machine is an abstraction. And would be unfamiliar to many, increasing onboarding time |
| 15:25:54 | Gadot | is now known as gadot |
| 15:26:14 | <hellwolf> | alright. shan't we all just use prompt engineering now. what you prompt is maybe what you get. |
| 15:26:38 | <EvanR> | agreed that that would be highly non abstract |
| 15:27:06 | <haskellbridge> | <Liamzee> hellwolf, did i offend you somehow? |
| 15:27:08 | <EvanR> | but would be vaguely defined an unexplainable |
| 15:27:09 | × | vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 260 seconds) |
| 15:27:59 | <hellwolf> | no no, you haven't. I am just piling onto IRC water cooling conversations. Sorry, I go back to coding. |
| 15:28:08 | <haskellbridge> | <Liamzee> love you man |
| 15:28:11 | <haskellbridge> | <Liamzee> same to evanr |
| 15:28:42 | <haskellbridge> | <Liamzee> EvanR: That's sort of m y problem with Haskell library ecosystem; there are tons of unfamiliar abstractions, takes a while to get used to them. |
| 15:28:55 | → | vanishingideal joins (~vanishing@user/vanishingideal) |
| 15:29:05 | <EvanR> | have you ever used a C library |
| 15:29:23 | <hellwolf> | The actual Haskell problem: "we build abstractions, so that you don't have to" -> "I left the project, so that you are stuck" |
| 15:29:52 | <EvanR> | one that you weren't already familiar with |
| 15:30:27 | <EvanR> | there's a lot of onboarding before you can use an arbitrary C library |
| 15:30:51 | <EvanR> | since it can do anything and you need to play by their rules |
| 15:30:58 | <haskellbridge> | <Liamzee> i see, i went through parts of gmp recentnly |
| 15:31:17 | <haskellbridge> | <Liamzee> and i was also enjoying people discussing how tinyfiledialogs had "main.py energy" |
| 15:32:07 | <EvanR> | meanwhile if you load the diagrams haskell library, you can get started drawing diagrams pretty fast, because it's "domain specific" and the scope is way less |
| 15:32:38 | <EvanR> | you might be able to get away with the name of the operator and the type signature |
| 15:32:56 | <EvanR> | and get new diagrams from old |
| 15:33:34 | <haskellbridge> | <Liamzee> well, thanks for the suggestion, seems fun |
| 15:34:15 | <EvanR> | that diagrams uses abstraction is a good thing |
| 15:34:41 | <EvanR> | that not everyone has already become familiar with it shouldn't count against it because that's absurd |
| 15:35:30 | <haskellbridge> | <Liamzee> tbh to some extent this feels like a rehash of "type signatures are all the documentation you need" |
| 15:37:39 | <EvanR> | it's not |
| 15:38:20 | <hellwolf> | vectorOf :: Int -> Gen a -> Gen [a] |
| 15:38:23 | <hellwolf> | do you trust this signature |
| 15:38:45 | <haskellbridge> | <Liamzee> i mean, am i characterizing your position as "abstractions are always good" correctly? |
| 15:39:16 | <ski> | <EvanR> sometimes you hear this argument that you shouldn't use something because someone might not have heard of it |
| 15:39:21 | ski | . o O ( "Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?" -- "The Elements of Programming Style" by Brian W. Kernighan,P. J. Plauger in 1978 ; "Kernighan's lever" by Linus Åkesson in 2012-12-111 at <https://www.linusakesson.net/programming/kernighans-lever/index.php> ) |
| 15:40:02 | <hellwolf> | https://en.wikipedia.org/wiki/Not_invented_here <-- a variant of this. "not what I am used to" |
| 15:40:57 | <EvanR> | your characterization has problems taken out of context, or even in this context, since I don't even know if we think of "abstractions" as the same concept. What is "good", etc |
| 15:41:07 | hellwolf | duck, to get something done. |
| 15:41:47 | <EvanR> | your version involves haskell libraries you don't yet know, while I use examples like virtual memory, or dynamic types (very popular) |
| 15:41:58 | ski | also invokes monochrom on "intuitive", failing to find an appropriate quote |
| 15:43:15 | <haskellbridge> | <Liamzee> i'll state my purport: abstractions are double-edged, they take time to learn and might take so much time as to make them impractical for working with others. On the other hand, they make code easier to write, often to read, and often to understand once you know the abstraction. This is a trade-off. |
| 15:43:19 | <haskellbridge> | <Liamzee> It implies that the correct level of abstraction depends on the context. |
| 15:43:54 | <EvanR> | you're making a distinction between abstract and non-abstract code, which I find dubious |
| 15:44:07 | <EvanR> | it's really the distinction between code someone understands and code someone doesn't yet understand |
| 15:44:35 | <EvanR> | which makes sense but blaming it on "abstraction" doesn't sound right |
| 15:44:52 | <ski> | these abstractions vs. those abstractions ? |
| 15:45:25 | <haskellbridge> | <Liamzee> abstractions most people know, abstractions most people should know, and abstractions that are idiosyncratic |
| 15:45:34 | <haskellbridge> | <Liamzee> how about dividing things into those three categories? |
| 15:46:03 | <haskellbridge> | <Liamzee> /s/people know/people already know |
| 15:46:06 | <EvanR> | it will take me some time to find a charitable interpretation of "abstractions most people know" |
| 15:46:39 | <EvanR> | quantifying over a given job market etc |
| 15:46:49 | <EvanR> | might be too limiting |
| 15:46:59 | <EvanR> | haskell would be mostly irrelevant |
| 15:47:02 | <haskellbridge> | <Liamzee> yeah and people is an imprecise statement, should be more clearly specified as "people who are likely to work on your project and whose understanding of your project matetrs" |
| 15:47:06 | <EvanR> | most people don't know any haskell whatever |
| 15:47:20 | <haskellbridge> | <Liamzee> most people don't know any programming whatsoever |
| 15:47:58 | <EvanR> | so the scope of this discussion is incredibly shrinking xD |
| 15:48:26 | <haskellbridge> | <Liamzee> insert monochrom commenting that most arguments are a dispute over definitions or implicit assumptions, or something to that effect |
| 15:48:53 | <EvanR> | logical argument begins with assumptions |
| 15:49:01 | <EvanR> | rhetoric maybe not |
| 15:49:48 | <haskellbridge> | <Liamzee> and i suppose i could lampoon my own logic by stating that most people should try to clarify their assumptions and priors, but do not have a habit of doing so |
| 15:50:20 | <EvanR> | if somebody is working at an actual job with haskell, they're already somebody who learns things way outside the required things |
| 15:50:48 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 15:50:49 | <EvanR> | I see no reason to go easy on this person working at an actual job |
| 15:50:57 | <EvanR> | esp if there are costs associated with the ease |
| 15:51:11 | × | jespada quits (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) (Quit: My Mac has gone to sleep. ZZZzzz…) |
| 15:52:24 | <EvanR> | for individual projects we can judge for ourselves how good the abstractions are and discriminate much easier |
| 15:52:31 | <haskellbridge> | <Liamzee> Standard Chartered supposedly trained all their traders in Mu |
| 15:57:11 | <EvanR> | is Mu related to ermine |
| 15:57:54 | × | amadaluzia quits (~amadaluzi@2a00:23c7:ed8b:6701:c483:4ce8:4c61:1453) (Changing host) |
| 15:57:54 | → | amadaluzia joins (~amadaluzi@user/amadaluzia) |
| 15:58:03 | <haskellbridge> | <Liamzee> Mu's a strict dialect of Haskell, so sort of |
| 16:01:22 | <EvanR> | to complete your categories for what they're worth add: abstractions nobody knows |
| 16:01:27 | → | jespada joins (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) |
| 16:01:41 | ski | idly ponders unknown knowns |
| 16:02:54 | <haskellbridge> | <Liamzee> that's actually the best abstraction, tbh |
| 16:03:22 | <haskellbridge> | <Liamzee> but only because ifinished reading ski's document, because there's an obvious implied contradiction in that essay |
| 16:03:33 | <haskellbridge> | <Liamzee> programming at maximum known abstraction is good for developers because it pushes their ability |
| 16:03:48 | <haskellbridge> | <Liamzee> however it's not necessarily good for the project, which is a contradiction |
| 16:03:58 | × | euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.) |
| 16:04:45 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 16:04:48 | <ski> | a trade-off |
| 16:05:28 | <haskellbridge> | <Liamzee> it's not, it's actually a contradiction between management (which wants the project done on time, and at cost), and individual developers, who if they're any good, are focused more toward improving their own skills |
| 16:06:58 | <EvanR> | if they're any good, they are also getting the project done on time and at cost |
| 16:07:08 | <EvanR> | kind of a tautology |
| 16:08:15 | <haskellbridge> | <Liamzee> not necessarily on budget / at the cheapest possible cost |
| 16:09:00 | <EvanR> | because your salary is too high? reduce it? xD |
| 16:09:17 | <ski> | cheapest possible, for a single project, or amortized ? |
| 16:09:39 | <haskellbridge> | <Liamzee> yeah i guess amortized matters too :) |
| 16:09:50 | → | euphores joins (~SASL_euph@user/euphores) |
| 16:09:56 | <haskellbridge> | <Liamzee> tbh why do i feel like you've had this argument before? |
| 16:09:59 | <EvanR> | something about short term technical debt (valuable) and long term (broken forever and unfixable) |
| 16:10:06 | ski | hasn't |
| 16:10:35 | <haskellbridge> | <Liamzee> like someone's told you to cut the abstraction because of onboarding costs, and you had to defend your position to avoid a refactor or rewrite |
| 16:10:49 | <EvanR> | shit short term code tricks leading to long term pain and costs |
| 16:12:17 | <haskellbridge> | <Liamzee> once again, depends on cost of labor, particular context, etc |
| 16:12:40 | <EvanR> | it defending this or that code you could also devise objective metrics for how complex code is |
| 16:13:02 | <EvanR> | instead of gut feeling it |
| 16:13:27 | ski | ponders the difference between `not (A tensor B)' (aka `not A par not B') and `A par B' |
| 16:14:33 | <ski> | (`A' and `B' being the two things felt to be in tension, like contradiction, or trade-off) |
| 16:14:52 | × | hiecaq quits (~hiecaq@user/hiecaq) (Quit: ERC 5.6.0.30.1 (IRC client for GNU Emacs 30.0.92)) |
| 16:15:13 | <EvanR> | is that linear logic |
| 16:15:15 | <ski> | yes |
| 16:16:44 | × | machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 272 seconds) |
| 16:19:29 | × | merijn quits (~merijn@77.242.116.146) (Ping timeout: 248 seconds) |
| 16:28:55 | × | jakesyl_____ quits (sid56879@id-56879.hampstead.irccloud.com) (Read error: Connection reset by peer) |
| 16:29:21 | × | sa1 quits (sid7690@id-7690.ilkley.irccloud.com) (Read error: Connection reset by peer) |
| 16:29:38 | × | sclv quits (sid39734@haskell/developer/sclv) (Read error: Connection reset by peer) |
| 16:30:06 | × | jonrh quits (sid5185@id-5185.ilkley.irccloud.com) (Read error: Connection reset by peer) |
| 16:30:08 | × | SanchayanMaity quits (sid478177@id-478177.hampstead.irccloud.com) (Read error: Connection reset by peer) |
| 16:30:10 | × | bjs quits (sid190364@user/bjs) (Ping timeout: 248 seconds) |
| 16:30:10 | × | bw quits (sid2730@user/betawaffle) (Ping timeout: 248 seconds) |
| 16:30:13 | × | bradparker quits (sid262931@id-262931.uxbridge.irccloud.com) (Read error: Connection reset by peer) |
| 16:30:13 | × | JSharp quits (sid4580@user/JSharp) (Read error: Connection reset by peer) |
| 16:30:16 | × | SrPx quits (sid108780@id-108780.uxbridge.irccloud.com) (Read error: Connection reset by peer) |
| 16:30:17 | × | NiKaN quits (sid385034@id-385034.helmsley.irccloud.com) (Read error: Connection reset by peer) |
| 16:30:17 | → | jonrh joins (sid5185@id-5185.ilkley.irccloud.com) |
| 16:30:19 | → | SanchayanMaity joins (sid478177@id-478177.hampstead.irccloud.com) |
| 16:30:19 | × | Techcable quits (sid534393@user/Techcable) (Read error: Connection reset by peer) |
| 16:30:34 | → | tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net) |
| 16:30:34 | → | JSharp joins (sid4580@user/JSharp) |
| 16:30:34 | → | bjs joins (sid190364@user/bjs) |
| 16:30:37 | → | jakesyl_____ joins (sid56879@hampstead.irccloud.com) |
| 16:30:51 | → | Techcable joins (sid534393@user/Techcable) |
| 16:30:53 | → | sa1 joins (sid7690@ilkley.irccloud.com) |
| 16:31:10 | → | sclv joins (sid39734@haskell/developer/sclv) |
| 16:31:40 | → | NiKaN joins (sid385034@id-385034.helmsley.irccloud.com) |
| 16:31:42 | → | SrPx joins (sid108780@id-108780.uxbridge.irccloud.com) |
| 16:31:47 | → | bradparker joins (sid262931@uxbridge.irccloud.com) |
| 16:31:58 | → | bw joins (sid2730@user/betawaffle) |
| 16:34:59 | × | lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 268 seconds) |
| 16:35:16 | → | TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker) |
| 16:39:56 | × | tromp quits (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 16:46:29 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 16:53:09 | × | Smiles quits (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 16:55:51 | → | tromp joins (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) |
| 16:59:30 | × | TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Ping timeout: 252 seconds) |
| 16:59:33 | → | TheCoffeMaker_ joins (~TheCoffeM@186.136.173.186) |
| 17:07:19 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 265 seconds) |
| 17:17:17 | × | vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 244 seconds) |
| 17:22:33 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 17:24:29 | → | vanishingideal joins (~vanishing@user/vanishingideal) |
| 17:28:14 | → | notdabs joins (~Owner@2600:1700:69cf:9000:1d8b:380b:ab0b:1fbd) |
| 17:32:35 | → | lxsameer joins (~lxsameer@Serene/lxsameer) |
| 17:38:41 | → | ft joins (~ft@p508db463.dip0.t-ipconnect.de) |
| 17:42:20 | <EvanR> | I wrote an unparser here which puts parentheses in such a way that it could be parsed... or did I https://paste.tomsmeding.com/4gCKDAAP |
| 17:42:57 | <EvanR> | in a "sequence" of Plus, it doesn't put parentheses because "it's associative" |
| 17:43:07 | <EvanR> | now I'm confused |
| 17:46:25 | × | dhil quits (~dhil@2a0c:b381:52e:3600:103b:c63d:9624:f51b) (Ping timeout: 248 seconds) |
| 17:55:26 | <tuxillo> | hi again, i'm coming back to the problem I saw last night: https://termbin.com/ybc7 |
| 18:09:15 | × | rvalue quits (~rvalue@user/rvalue) (Read error: Connection reset by peer) |
| 18:09:48 | → | rvalue joins (~rvalue@user/rvalue) |
| 18:10:02 | <monochrom> | Of the few professions I have had some impression (e.g., law, accounting, health care, construction, engineering, ...), my impression is that their people go like "here is a more correct and/or cheaper way to do things, let's do it; oh it's more difficult to learn? then we'll just ramp up training". Programming is the only occupation where people go the opposite direction, "OMG it's so hard to explain, let's just go back to the dark age". For this |
| 18:10:02 | <monochrom> | reason, I don't count programming as even a profession (so nevermind engineering). |
| 18:10:32 | <monochrom> | Right? Surgeons don't go like "OMG blood is so gory and scary let's never do surgery". |
| 18:13:33 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 18:18:18 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds) |
| 18:22:15 | <EvanR> | you want people to be better at their job? what an elitist |
| 18:22:49 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 18:24:07 | <EvanR> | worse is better :tm: |
| 18:25:06 | ljdarj1 | is now known as ljdarj |
| 18:25:10 | <mauke> | programming is a profession because I get paid for it |
| 18:25:41 | <monochrom> | Is scamming a profession? Tons of people get paid for it, too. |
| 18:26:07 | <monochrom> | And next time I can talk about why I even view programming as a scam. |
| 18:29:21 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 18:30:44 | → | target_i joins (~target_i@user/target-i/x-6023099) |
| 18:34:07 | <EvanR> | is product type associative? A * B * C * D is a type... but A * (B * C) * D seems to be a "different type" ? at least in ML? |
| 18:34:19 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds) |
| 18:34:21 | × | sprotte24_ quits (~sprotte24@p200300d16f06b600a14bd9dc58a29dc6.dip0.t-ipconnect.de) (Quit: Leaving) |
| 18:35:06 | <monochrom> | Nominal typing says they're different. (So in the Haskell community, we just say "isomorphic" and gross over it.) Structural typing is the one that says "isomorphic therefore equal". |
| 18:35:16 | <dolio> | It is associative in the sense that they are isomorphic types. |
| 18:35:28 | <tuxillo> | is it possible to enable IF_DEBUG() from a compiled program? |
| 18:35:34 | <dolio> | Which is the correct notion for caring about equivalence of types. |
| 18:35:40 | <dolio> | (Until you start doing HoTT.) |
| 18:35:42 | <tuxillo> | so i can see the debug messages |
| 18:35:46 | <mauke> | tuxillo: I don't know what that is, but it's all uppercase, so probably not |
| 18:36:50 | <EvanR> | isomorphic things is one thing, but which thing is A * B * C * D ? A * (B * (C * D)) ? |
| 18:37:18 | <EvanR> | seems like an inefficient way to implement that |
| 18:37:21 | <haskellbridge> | <Liamzee> monochrom: BYD got their start by figuring out how to replace expensive machines for battery manufacturing with people. Of course, Hasura tried the same thing with Haskell, and now they use Rust. :) |
| 18:37:28 | <mauke> | from what I recall from ocaml, A*B*C is weird and not a nested thing at all |
| 18:37:59 | <EvanR> | A*B*C is not nested but if you put parentheses it is? |
| 18:38:17 | <monochrom> | Oh likewise in Haskell, we just change the syntax to (A,B,C). |
| 18:38:39 | <EvanR> | in haskell the syntax makes it clear "no, not associative" |
| 18:39:02 | <EvanR> | maybe that was a good idea |
| 18:39:04 | <mauke> | syntax schmyntax |
| 18:39:13 | <mauke> | in perl, it is associative |
| 18:39:28 | × | tromp quits (~textual@2001:1c00:3487:1b00:1419:ab0:498a:2d0c) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 18:39:49 | <mauke> | (that is, in perl (A,(B,C)) == ((A,B),C) == (A,B,C)) |
| 18:40:10 | <EvanR> | what the heck |
| 18:40:30 | <EvanR> | is it auto flattening |
| 18:40:36 | <haskellbridge> | <Liamzee> hmmm, that's an interesting question |
| 18:40:40 | <mauke> | it's not nesting in the first place |
| 18:40:46 | <monochrom> | A*B*C in ML also enjoys recordness, i.e., A*B*C is an anonymous record type with 3 fields names: 1, 2, 3. |
| 18:41:02 | <monochrom> | E.g., (x,y,z)#1 = x |
| 18:41:06 | <haskellbridge> | <Liamzee> actually, it wouldn't make sense in a Haskell context |
| 18:41:10 | <mauke> | EvanR: is (1+(2+3)) autoflattening? |
| 18:41:22 | <EvanR> | and A * (B * C) is a different type? |
| 18:41:46 | <monochrom> | Yes A*(B*C) is a different type IIRC. |
| 18:41:49 | <EvanR> | mauke, is that a type in perl or a data structure |
| 18:42:03 | <mauke> | expression, really |
| 18:42:09 | <mauke> | we don't do "types" over there |
| 18:42:24 | × | lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 272 seconds) |
| 18:42:33 | <dolio> | Even if it were technically `A * (B * (C * D))`, ML compilers are probably smart enough to optimize it. |
| 18:42:37 | <monochrom> | Category theory is so much easier than Perl. |
| 18:42:41 | <haskellbridge> | <Liamzee> tuples aren't really arity polymorphic in haskell, they're a family of types with a common syntax |
| 18:43:02 | <EvanR> | the thing with A * (B * (C * D)) is that the fst and snd functions would act differently |
| 18:43:13 | <EvanR> | does snd get you B or (B * (C * D)) |
| 18:44:05 | <mauke> | I expect B * (C * D) in the nested case |
| 18:44:30 | <haskellbridge> | <Liamzee> so it's nonsensical to want (a,n) to be the type of both (a,b,c,d) and (a,b,c) |
| 18:44:32 | <EvanR> | car and cdr |
| 18:45:06 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 252 seconds) |
| 18:45:06 | <mauke> | not so much a polymorphic type as a small collection of types flying in close formation |
| 18:45:08 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 18:46:33 | <EvanR> | what happens in perl, for morbid curiosity's sake |
| 18:46:43 | <mauke> | , is list concatenation |
| 18:46:47 | <mauke> | the rest is smoke and mirrors |
| 18:46:57 | <EvanR> | if you ask for the 2nd component |
| 18:47:28 | <mauke> | (a ++ (b ++ c)) !! 1 |
| 18:47:54 | <EvanR> | > "a" ++ ("b" ++ "c") !! 1 |
| 18:47:55 | <lambdabot> | error: |
| 18:47:55 | <lambdabot> | • Couldn't match expected type ‘[Char]’ with actual type ‘Char’ |
| 18:47:55 | <lambdabot> | • In the second argument of ‘(++)’, namely ‘("b" ++ "c") !! 1’ |
| 18:48:02 | <EvanR> | > ("a" ++ ("b" ++ "c")) !! 1 |
| 18:48:04 | <lambdabot> | 'b' |
| 18:48:10 | <EvanR> | it's auto flattening! |
| 18:48:13 | <EvanR> | smh |
| 18:49:57 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 18:51:34 | <haskellbridge> | <Liamzee> mauke: what does it mean that Perl's dynamic anyways? |
| 18:51:39 | <haskellbridge> | <Liamzee> Or more specifically, how is Perl dynamic? |
| 18:53:20 | <mauke> | uh ... it depends on who's speaking? |
| 18:53:28 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 18:53:53 | <mauke> | mainly, I think it means it's not C |
| 18:53:57 | <haskellbridge> | <Liamzee> sorry, was just wondering if there was anything interesting about the specific way Perl is a dynamically-typed language |
| 18:54:32 | <dolio> | Maybe it's dynamic like dynamic programming. |
| 18:54:42 | <mauke> | you don't have a separate compilation step (unlike C) |
| 18:54:48 | <mauke> | there is no static type system (unlike C) |
| 18:55:06 | <mauke> | data structures don't have a fixed size and grow/shrink as needed (unlike C) |
| 18:56:02 | <mauke> | on the other hand, I find it hard to articulate what exactly a "type" even is in the context of perl, since you could argue it has a form of syntactic typing |
| 18:56:23 | <mauke> | $foo is a scalar, but @foo is an array |
| 18:56:48 | <dolio> | Are those the same variable? I forget. |
| 18:57:43 | <mauke> | no, completely independent* |
| 18:57:53 | <mauke> | * not actually completely independent |
| 18:57:57 | <haskellbridge> | <Liamzee> yeah i guess that was what i was really asking about, it seemed as though you suggested it wasn't as simple as to say "perl is dynamically typed" |
| 18:58:02 | <EvanR> | well then I'm convinced I need to put more parentheses for this to have a chance at getting parsed back in |
| 18:58:03 | <haskellbridge> | <Bowuigi> No, some dialects of BASIC have sigils too |
| 18:58:35 | <haskellbridge> | <Bowuigi> Sigils are hungarian notation but required and more noise |
| 18:59:24 | <mauke> | apps hungarian or systems hungarian? |
| 19:00:03 | × | caconym quits (~caconym@user/caconym) (Quit: bye) |
| 19:00:25 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 19:00:45 | → | caconym joins (~caconym@user/caconym) |
| 19:00:56 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:01:25 | <haskellbridge> | <Bowuigi> https://en.m.wikipedia.org/wiki/Hungarian_notation systems hungarian according to this |
| 19:02:03 | <haskellbridge> | <Bowuigi> Apps hungarian is basically implicit newtypes but worse |
| 19:02:09 | <mauke> | yes :-) |
| 19:02:47 | <mauke> | I remember when I first read the description of apps hungarian, I thought it was just constructing a type system in the mind of the programmer |
| 19:03:01 | <mauke> | and those "logical types" should really just be actual types |
| 19:03:19 | <EvanR> | smh they shoulda just used an IDE |
| 19:03:28 | → | prolic_ joins (~sasa@181.122.135.9) |
| 19:04:33 | <mauke> | but sigils are not just names |
| 19:04:55 | <haskellbridge> | <Liamzee> visual basic apparently was the first commercially successful IDE |
| 19:04:56 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:05:16 | <[exa]> | Any good way to make a `snd` function that can be used in Accelerate.map? I basically need `Expr (Float,Int) -> Exp Int` but I don't see how to combine that with the stuff at hand... I thought `lift snd` would be The Way but turns out not really :D |
| 19:05:18 | <mauke> | for example, $x[0] is a single element of @x, but @x[0, 3, 42] is a list of elements (an array slice) |
| 19:05:33 | <prolic_> | hello friends. I forked https://hub.darcs.net/komadori/HsQML at https://github.com/prolic/HsQML and made some changes, so it runs with newer GHC/cabal as well as adding some small features. I would publish it on hackage, but the author/maintainer doesn't respond to emails. Apparently he's not intersted in mainating it anymore. What do I do now? Release under a different name (lib-hsqml) ? |
| 19:05:48 | → | machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net) |
| 19:05:56 | <[exa]> | (ah wait `snd` is actually in accelerate on itself, but let's think more generalized) |
| 19:06:22 | <mauke> | https://wiki.haskell.org/Taking_over_a_package |
| 19:06:28 | <haskellbridge> | <Liamzee> which maintainer are you talking about, prolic_ |
| 19:07:15 | <prolic_> | the author of the hsqml lib, I already tried to reach out via email |
| 19:07:45 | monochrom | doesn't like Perl sigils or Lisp sigils. |
| 19:07:51 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 19:08:03 | <EvanR> | how hungarian is this type name I saw yesterday: struct CoreStruct |
| 19:08:17 | <haskellbridge> | <Liamzee> wait, i don't understand |
| 19:08:26 | <haskellbridge> | <Liamzee> oh, whoops, misunderstood |
| 19:08:28 | <EvanR> | now you know the type is a struct... very much so |
| 19:08:39 | <prolic_> | ok, so make an account on haskell discourse, post there, wait a month, then contact hackage admins? |
| 19:08:42 | <monochrom> | It's postfix hungarian, no? hungarian would be StructCore. :) |
| 19:08:59 | <monochrom> | Reverse Polish Hungarian = RPH \∩/ |
| 19:09:25 | <mauke> | reverse polish hungarian = s <-> sz |
| 19:09:29 | <EvanR> | then to declare an object... struct CoreStruct structCoreStructMyCoreStruct; |
| 19:09:53 | <mauke> | I have been struct to my core |
| 19:10:18 | <tuxillo> | should I open an issue in github to discuss low level stuff like this mmap problem or is there an IRC channel for this? |
| 19:10:24 | → | gmg joins (~user@user/gehmehgeh) |
| 19:10:34 | <EvanR> | I should make it an instance of class CoreClass |
| 19:11:03 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 19:11:08 | <mauke> | tuxillo: there is a #ghc channel |
| 19:11:59 | <mauke> | but I feel opening a ghc issue wouldn't be wrong, either. it's what the message tells you to do, after all |
| 19:12:34 | <monochrom> | Actually I think hugarian applies to variable names only, not type names.. |
| 19:12:45 | <EvanR> | ya I also think so |
| 19:13:05 | <EvanR> | so class CoreClass and struct CoreStruct needs another moniker |
| 19:13:35 | <monochrom> | I'm OK with "type-level hungarian" :) |
| 19:14:15 | <EvanR> | data CoreDataSum = LeftConstructor A | RightConstructor B |
| 19:14:35 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:14:55 | <monochrom> | How would you feel about hungarian for type names where you annotate the kind? E.g., data Star2StarMaybe a = ... |
| 19:15:00 | <haskellbridge> | <Liamzee> prolic_, still here? |
| 19:15:17 | <prolic_> | haskellbridge yes sir |
| 19:15:33 | <haskellbridge> | <Liamzee> https://www.gekkou.co.uk/cvitae/ |
| 19:15:40 | <haskellbridge> | <Liamzee> his linked in is still active |
| 19:15:45 | <EvanR> | OctothorpInt# |
| 19:15:54 | × | jco quits (~jco@78-70-217-44-no600.tbcn.telia.com) (Ping timeout: 246 seconds) |
| 19:15:58 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 19:16:02 | <EvanR> | or DoubleOctothorp |
| 19:16:18 | <haskellbridge> | <Liamzee> would it be rude to try contacting him there? |
| 19:16:20 | <prolic_> | I wrote him emails twice already and explained I intend to take over the package or at help him maintain, no response |
| 19:16:30 | <haskellbridge> | <Liamzee> you wrote him e-mails at which address? |
| 19:16:57 | × | jespada quits (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) (Quit: My Mac has gone to sleep. ZZZzzz…) |
| 19:18:00 | <prolic_> | to that exact email address |
| 19:18:20 | <mauke> | https://www.gekkou.co.uk/cvitae/ is not an email address |
| 19:18:25 | <haskellbridge> | <Liamzee> the gekkou site is no longer being maintained |
| 19:18:40 | <prolic_> | Robin KAY <komadori@gekkou.co.uk> |
| 19:19:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 19:19:28 | <haskellbridge> | <Liamzee> i mean it'd be rude if he were deliberately ignoring your e-mails, but it's possible he simply disconnected himself from the gekkou website, since he's swapped sites |
| 19:21:20 | <tuxillo> | mauke: i'll try luck there, thanks! |
| 19:21:38 | × | j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 245 seconds) |
| 19:22:00 | × | vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 276 seconds) |
| 19:22:29 | <mauke> | linkedin says he's at https://www.msci.com/ now, but that's not very helpful |
| 19:23:48 | <EvanR> | the examples of systems hungarian on that page are so bad like, arru8NumberList and fnFunction, it's like... zero additional information beyond the type xD |
| 19:24:13 | <EvanR> | if they would work it's like why even have named variables |
| 19:24:35 | <EvanR> | de bruijn indices ftw |
| 19:24:39 | <haskellbridge> | <Liamzee> prolic_: I'm probably wrong, but I'd suggest you try reaching him on linkedin and his github, give it a week or so, then post to discourse |
| 19:25:22 | <mauke> | EvanR: the windows api is full of that nonsense |
| 19:25:37 | <prolic_> | haskellbridge: I wrote him to Mr Kay on 01.07.2024 first time, second time on 27.07.2024, just telling him I am working on reviving his library. I got a response on 29.07.2024, where he wishes me best luck. on 30.07.2024 (next day) I wrote him again and ask about pushing changes to hackage. Again on 18.11.2024, both times no response at all. I have the emails. |
| 19:25:48 | <mauke> | my favorite is probably lpFoo to indicate a "long pointer", which isn't even a thing in C++ |
| 19:26:03 | <haskellbridge> | <Liamzee> oh okay, so he's not responding yet, i guess, just go straight to discourse |
| 19:27:25 | <prolic_> | who is Liamzee though? |
| 19:27:36 | <haskellbridge> | <Liamzee> i'm just some random person |
| 19:28:25 | → | j1n37 joins (~j1n37@user/j1n37) |
| 19:28:26 | <prolic_> | announcements category on discourse? |
| 19:29:12 | <haskellbridge> | <Liamzee> actually, forget what i said, i forget the procedure for package takeovers (afaik, hackage won't even delete packages, and i think in the case where someone handling a core crypto library lost interest and walked off, the package was ultimately forked instead of being taken over) |
| 19:29:28 | <EvanR> | the procedure was linked earlier |
| 19:29:44 | <EvanR> | no need to remember |
| 19:30:17 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 19:31:29 | <geekosaur> | it's also linked from the front page of the hackage website iirc |
| 19:31:50 | <[exa]> | prolic_: there was a similar takeover recently for mustache, handled very well, you can copy from there |
| 19:32:01 | <prolic_> | exa - what do I do? |
| 19:33:02 | <[exa]> | https://discourse.haskell.org/t/taking-over-mustache/11752 (+ the linked github issue) |
| 19:33:13 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:35:01 | <prolic_> | thank you |
| 19:35:14 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 19:37:33 | → | jespada joins (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) |
| 19:42:05 | <[exa]> | prolic_: the main exercise there is to politely&transparently test that maintainer responds to issues (which is the expected property of maintainers), and if not, make that implicitly visible publicly. I guess you can as well ask in #hackage for guidance. |
| 19:42:33 | <prolic_> | well, not that easy, since https://hub.darcs.net/komadori/HsQML has no public issues. |
| 19:42:43 | <prolic_> | I could only do on my own github |
| 19:43:14 | <[exa]> | you need something that provably pings the maintainer |
| 19:43:34 | <[exa]> | I guess sending a mail to maintainer+mailinglist would be another way, but please check with hackage folks |
| 19:46:19 | <prolic_> | ok |
| 19:46:28 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 19:48:27 | × | tabemann quits (~tabemann@2600:1700:7990:24e0:abb4:3ad0:1d9:d299) (Ping timeout: 246 seconds) |
| 19:48:40 | → | pavonia joins (~user@user/siracusa) |
| 19:52:06 | → | tabemann joins (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) |
| 19:55:34 | → | tabemann_ joins (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) |
| 19:57:09 | × | tabemann quits (~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Ping timeout: 252 seconds) |
| 20:01:53 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:05:19 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:06:45 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 20:12:03 | × | poxel quits (~lennart@user/poxel) (Ping timeout: 276 seconds) |
| 20:12:37 | → | poxel joins (~lennart@user/poxel) |
| 20:14:45 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 20:15:03 | <emojelly> | Do we use mtl or transformers nowadays? Or both? |
| 20:15:51 | <haskellbridge> | <magic_rb> Me personally effectful if i can help it |
| 20:15:51 | <EvanR> | transformers is a dependency of mtl |
| 20:15:57 | <haskellbridge> | <magic_rb> It composes better imo |
| 20:17:03 | <EvanR> | mtl has generic classes while transformers has the basic implementations (it seems) |
| 20:17:18 | <monochrom> | Yeah. |
| 20:18:38 | <[exa]> | +1 for transformers unless monad stacking can be avoided |
| 20:18:52 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
| 20:25:56 | × | michalz quits (~michalz@185.246.207.205) (Remote host closed the connection) |
| 20:31:21 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:35:04 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:38:24 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 20:38:40 | × | j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 252 seconds) |
| 20:38:59 | → | j1n37 joins (~j1n37@user/j1n37) |
| 20:39:05 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 20:40:22 | → | lxsameer joins (~lxsameer@Serene/lxsameer) |
| 20:40:59 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 20:42:19 | → | gmg joins (~user@user/gehmehgeh) |
| 20:42:53 | <EvanR> | bespoke non-free monads prepped to order |
| 20:45:20 | <haskellbridge> | <Liamzee> at O(n) bind cost where n is size of stack |
| 20:49:24 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 20:49:45 | <EvanR> | (I don't know if O(n) is always an accurate estimate of the cost of "bind" in a "stack"... it would seem to depend on the details of the "stack") |
| 20:50:17 | <EvanR> | (and how its associated run algorithm works) |
| 20:53:45 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
| 20:54:13 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 20:55:20 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:56:23 | <haskellbridge> | <Liamzee> EvanR: why use Supply over CPSWriter? |
| 20:56:39 | <EvanR> | I guess you misunderstood, I wasn't using that library |
| 20:58:23 | <EvanR> | I threw this together instead https://paste.tomsmeding.com/DI7hAOeQ |
| 20:59:05 | <EvanR> | (could have derived the functor to save more space...) |
| 20:59:41 | <EvanR> | CPSWriter seems to be the opposite of Supply? |
| 21:00:24 | <haskellbridge> | <Liamzee> thanks for being polite to me, a bit sleep deprived lately |
| 21:00:56 | × | weary-traveler quits (~user@user/user363627) (Remote host closed the connection) |
| 21:03:53 | <haskellbridge> | <Liamzee> but yeah that is cool |
| 21:04:48 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 21:05:08 | <haskellbridge> | <Liamzee> EvanR: does the bind implementation actually work? |
| 21:05:11 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:05:23 | <EvanR> | it seems to |
| 21:05:43 | <haskellbridge> | <Liamzee> the recursion looks broken |
| 21:06:03 | <haskellbridge> | <Liamzee> actually, no, it's not |
| 21:06:58 | <EvanR> | no warranty |
| 21:08:03 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 21:10:12 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 21:12:49 | <haskellbridge> | <Liamzee> cool, so the recursion keeps on going until the condition returns a done or error message; on fail, the failure propagates, on f x, you run to the next step |
| 21:14:21 | <EvanR> | on fail, the "and then" function is discarded |
| 21:14:57 | <EvanR> | since it won't be needed, in fact, you can't use it without a proper 'a' |
| 21:15:04 | <EvanR> | which is not available |
| 21:16:33 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:16:54 | × | lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 252 seconds) |
| 21:17:59 | <haskellbridge> | <Liamzee> depending on the check function, you can still diverge, though |
| 21:18:54 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds) |
| 21:21:18 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 21:21:25 | <monochrom> | But that is a free monad! |
| 21:22:07 | <monochrom> | OK OK I don't really mean to argue and nitpick. It's nice code. :) |
| 21:23:16 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 21:23:56 | <monochrom> | Ah perhaps you meant you didn't use the free package. |
| 21:29:37 | astra | is now known as amish |
| 21:30:19 | → | Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) |
| 21:32:21 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:34:24 | <haskellbridge> | <Liamzee> and what functor would that be? sort of looks like either |
| 21:35:05 | → | tromp joins (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) |
| 21:37:50 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 272 seconds) |
| 21:40:05 | <haskellbridge> | <Liamzee> yeah, it's just either, whoops |
| 21:42:44 | <haskellbridge> | <Liamzee> no, Free (ExceptT String (Reader Int) )? |
| 21:45:09 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 21:48:09 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 21:48:52 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 21:51:21 | <haskellbridge> | <Liamzee> has to be state, i guess, since reader can't mutate, but the counter behavior is pretty specific, bleh |
| 21:52:49 | × | manwithluck quits (~manwithlu@2a09:bac5:5085:2dc::49:221) (Remote host closed the connection) |
| 21:53:11 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 21:55:15 | × | j1n37 quits (~j1n37@user/j1n37) (Ping timeout: 244 seconds) |
| 21:56:17 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 21:57:11 | → | j1n37 joins (~j1n37@user/j1n37) |
| 21:57:12 | → | manwithluck joins (~manwithlu@2a09:bac5:5085:2dc::49:221) |
| 22:00:04 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 22:00:13 | → | Googulator joins (~Googulato@2a01-036d-0106-211a-f46d-c0c9-579b-1a24.pool6.digikabel.hu) |
| 22:00:42 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds) |
| 22:00:42 | ljdarj1 | is now known as ljdarj |
| 22:00:46 | → | gmg joins (~user@user/gehmehgeh) |
| 22:02:02 | × | target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving) |
| 22:02:45 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937) |
| 22:03:57 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:06:00 | → | thuna` joins (~thuna`@user/thuna/x-1480069) |
| 22:06:06 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 244 seconds) |
| 22:08:55 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds) |
| 22:12:32 | → | emmanuelux joins (~emmanuelu@user/emmanuelux) |
| 22:15:27 | × | c_wraith quits (~c_wraith@adjoint.us) (Ping timeout: 252 seconds) |
| 22:17:06 | × | Hecate quits (~mariposa@user/hecate) (Ping timeout: 272 seconds) |
| 22:17:38 | → | Hecate joins (~mariposa@user/hecate) |
| 22:18:59 | × | tabaqui quits (~tabaqui@167.71.80.236) (Ping timeout: 260 seconds) |
| 22:19:43 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:20:14 | → | c_wraith joins (~c_wraith@adjoint.us) |
| 22:22:23 | × | tromp quits (~textual@2001:1c00:3487:1b00:e513:bc03:349e:ac26) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:27:06 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 268 seconds) |
| 22:31:02 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 22:31:21 | → | califax joins (~califax@user/califx) |
| 22:37:46 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:42:14 | → | Feuermagier joins (~Feuermagi@user/feuermagier) |
| 22:42:29 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 22:42:29 | × | Feuermagier quits (~Feuermagi@user/feuermagier) (Remote host closed the connection) |
| 22:43:07 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 22:46:42 | <EvanR> | monochrom, if this were a free monad, then uh for all other monads there would be a unique monad morphism something or other from Check to it? |
| 22:46:53 | <EvanR> | such that |
| 22:46:59 | <EvanR> | some diagram xD |
| 22:49:34 | × | thuna` quits (~thuna`@user/thuna/x-1480069) (Ping timeout: 252 seconds) |
| 22:51:27 | × | sprout quits (~sprout@84-80-106-227.fixed.kpn.net) (Ping timeout: 265 seconds) |
| 22:53:30 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 22:53:33 | <EvanR> | I lied, every other monad for this functor, which would be like ... |
| 22:54:03 | × | sprotte24 quits (~sprotte24@p200300d16f06b600a14bd9dc58a29dc6.dip0.t-ipconnect.de) (Quit: Leaving) |
| 22:58:33 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 268 seconds) |
| 23:00:17 | <EvanR> | I lied that was the beginning of a universal property not a free thing |
| 23:02:21 | <monochrom> | Your monad is Free C, where C is defined by "data C r = G (Int -> r) | F String". |
| 23:03:03 | × | prolic_ quits (~sasa@181.122.135.9) (Ping timeout: 246 seconds) |
| 23:04:28 | <monochrom> | There is a definition of free monad in terms of "left adjoint of the forgetful functor for monads" but I haven't really studied that. |
| 23:04:46 | → | weary-traveler joins (~user@user/user363627) |
| 23:05:24 | <monochrom> | More precisely, Check is Free C. This is ignoring the special thing done by runCheck. |
| 23:05:42 | <monochrom> | (to the Int part) |
| 23:07:29 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 23:07:34 | <EvanR> | turns out there is a connection between the free forgetful adjoint functors on one hand and initial algebras, which satisfy a universal property I think. If you just throw adjoint and universal at the wall you get a categorical theorem right |
| 23:07:53 | <monochrom> | But here is the universal property you're looking for. Suppose a certain monad M supports two additional operations: gennum :: M Int, fail :: String -> M a. Then there is a unique monad morphism from Check to M. |
| 23:08:08 | <EvanR> | such that |
| 23:08:14 | <EvanR> | something factors through |
| 23:09:18 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:11:41 | <monochrom> | Yeah it's an initial object in the category of monads like M. |
| 23:12:26 | <monochrom> | I think you can go further for initial algebra if you're also into algebraic effects. |
| 23:13:57 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds) |
| 23:16:33 | <EvanR> | ok but, the runCheck function which interprets the Check program in a certain way |
| 23:17:50 | <EvanR> | is that specializing anything or orthogonal to the narrative |
| 23:18:07 | <monochrom> | It is specializing. |
| 23:18:15 | <EvanR> | would you not need it if you define the monad instance some other way |
| 23:18:48 | <monochrom> | You are factoring a supply monad into a free monad plus an interpreter that kills the freeness. |
| 23:19:55 | <monochrom> | Most useful monads are not free, but it is also useful to factor them into free monads and interpreters. |
| 23:20:03 | × | j1n37 quits (~j1n37@user/j1n37) (Read error: Connection reset by peer) |
| 23:20:14 | × | _xor quits (~xor@ip-66-42-132-175.dynamic.fuse.net) (Read error: Connection reset by peer) |
| 23:20:33 | <EvanR> | trying to see how you would unfree it just by changing the monad instance |
| 23:21:34 | <haskellbridge> | <Bowuigi> EvanR the factoring thing is "such that this unique morphism respects the Monad + M laws" IIRC |
| 23:21:50 | <monochrom> | Or equivalently, in algebraic effects, factor into a free algebra and a handler. |
| 23:22:49 | → | _xor joins (~xor@ip-66-42-132-175.dynamic.fuse.net) |
| 23:22:58 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 23:24:15 | → | j1n37 joins (~j1n37@user/j1n37) |
| 23:25:04 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:25:17 | <EvanR> | a monad morphism automatically respects monad laws... but... |
| 23:25:39 | <haskellbridge> | <Bowuigi> A nice corollary is that you can integrate any monad into an effect system that uses free monads and interpreters (which are a lot) |
| 23:25:41 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 268 seconds) |
| 23:25:41 | ljdarj1 | is now known as ljdarj |
| 23:26:10 | <monochrom> | You can change to the Int->Either String (a,Int) monad and don't give users direct access, give them only "genNum = \s -> Right (s, s+1)" and "fail msg = \s -> Left msg". |
| 23:27:17 | <monochrom> | That would be very unfree, and even more specialized than Int->Either String (a,Int). |
| 23:27:28 | <haskellbridge> | <Bowuigi> EvanR yeah that's why I said morphism instead of monad morphism, to emphasize that it respects both the monad laws AND the M/Check/whatever laws |
| 23:29:55 | <emojelly> | I wonder if I can (and should) rewrite my Coroutine-using framework with Pipes. |
| 23:30:09 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds) |
| 23:31:07 | × | tremon quits (~tremon@83.80.159.219) (Quit: getting boxed in) |
| 23:31:15 | <emojelly> | The pattern I have (and I wonder whether there's a name for it): I have a monad which both yields and awaits a value (types between input and output can differ), which feed into and feed back from another component, in my specific case a circuit. |
| 23:32:42 | <haskellbridge> | <Bowuigi> You are describing Arrow and ArrowLoop, see if those abstractions make your program clearer first |
| 23:32:55 | <emojelly> | So each monadic action gives (yields) input to the circuit, and returns (awaits) the output of the circuit. |
| 23:33:18 | <emojelly> | I've used Arrows before, for CPU emulation, but that was an entirely different use case... wonder if Arrows can help here. |
| 23:33:39 | <emojelly> | Monads seem to work fine? |
| 23:33:53 | <haskellbridge> | <Bowuigi> If it is a monad it likely also supports ArrowApply too |
| 23:34:19 | <emojelly> | My use case for CPU emulation was that I could do different things for "running" emulated instructions vs. "analyzing" them. |
| 23:34:36 | <haskellbridge> | <Bowuigi> Why do you want to rewrite it if it works fine? Learning? Speed? Clarity? |
| 23:34:42 | <emojelly> | It would be speed |
| 23:35:18 | <emojelly> | I don't know if you followed the drama (technical drama, not human drama) yesterday, but my Coroutine-implementation is insanely slow for some reason, and profiling is not helping at all unfortunately. |
| 23:35:59 | <emojelly> | It's pathologically slow. It looks like some accidental O(n^2) thing maybe, or something else... but I wasn't able to suss out what's taking so long in *any* way |
| 23:36:54 | <emojelly> | only that for some reason a simple test is churning through 70GB/s of allocations for a relatively simple test, but it's not leaking it, so heap profiling didn't help either. |
| 23:37:18 | <haskellbridge> | <Bowuigi> According to their own benchmarks, streamly is way faster than pipes, maybe try that? |
| 23:37:34 | <emojelly> | I really like the Coroutines approach, but if pipes or something else helps... |
| 23:37:45 | <emojelly> | I've looked at streamly, but I'm not sure it's better suited than pipes? |
| 23:40:53 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:41:14 | <emojelly> | Pipes seems centered around yield/await that I need here, while streamly, ironically, looks more like unix pipes |
| 23:41:22 | <emojelly> | but that's only after a very, very cursory look, so I might be wrong |
| 23:42:35 | <haskellbridge> | <Bowuigi> I see |
| 23:43:03 | <haskellbridge> | <Bowuigi> Do you have a repo link? |
| 23:43:09 | <emojelly> | Not yet, no |
| 23:43:17 | <emojelly> | I will! |
| 23:43:52 | × | jespada quits (~jespada@r167-61-127-49.dialup.adsl.anteldata.net.uy) (Ping timeout: 272 seconds) |
| 23:45:13 | <haskellbridge> | <Bowuigi> Just to make sure, did you check for space leaks and other laziness pitfalls? You probably did but just to make sure |
| 23:45:39 | × | merijn quits (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds) |
| 23:45:42 | <haskellbridge> | <Bowuigi> For concurrency you have that actions may not run on the thread you wanted |
| 23:46:21 | <emojelly> | I did. The heap is growing to an "okay" 40MB before gc brings it back down. Meanwhile, the *total* allocations are upwards of 70GB, with the program churning through 5-8GB/s for... nothing. But apparently those allocations are very short lived, because they don't really show up in the heap profile other than in those total statistics. |
| 23:46:23 | → | jespada joins (~jespada@r179-25-248-190.dialup.adsl.anteldata.net.uy) |
| 23:46:31 | <emojelly> | There is no concurrency! |
| 23:47:24 | <geekosaur> | most allocations are in the nursery (very fast) and most of those will disappear when it's GCd (anything still referenced moves to gen1, then the pointer is reset to the base of the nursery) |
| 23:48:37 | <emojelly> | and the time profiling is (as far as I can tell myself) completely useless. The majority of the time is spent "in" this function, that's the full thing: "combineTestSignals = combineTestSignals (,)". Not in any of its children, this is not "inherited" time. No, profiling tells me *this* is where all CPU time goes. |
| 23:48:56 | <emojelly> | sorry, it's "combineTestSignals = combineTestSignals' ()", missed the ' there |
| 23:49:00 | <emojelly> | sigh |
| 23:49:08 | <emojelly> | combineTestSignals = combineTestSignals' (,) |
| 23:49:10 | <emojelly> | now it's right |
| 23:49:34 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 272 seconds) |
| 23:49:46 | <emojelly> | geekosaur: I wish there was a way to tell me what allocations were in the nursery, i.e. what type, who produced them... maybe that would give me one hint of what's wrong... |
| 23:50:49 | <geekosaur> | I think there's a heap visualizer somewhere, but I'm not sure if it also handles the nursery or if it's only gen1+ |
| 23:51:12 | <emojelly> | Do you mean the heap visualizer that is processing the event log through HTML? That's what I used, yeah |
| 23:51:16 | <geekosaur> | https://hackage.haskell.org/package/ghc-heap-view |
| 23:51:19 | <emojelly> | ah |
| 23:51:32 | <emojelly> | this seems different |
| 23:52:32 | <emojelly> | But it might still not help. If I stop the program at any point, there's probably not a lot of allocations live. It seems the program does not *retain* an extreme amount of allocations for long, it just *churns* through them |
| 23:52:44 | <geekosaur> | weirdly, it claims to only support ghc 8.8, but it was last updated at the beginning of this year |
| 23:52:59 | <emojelly> | This results in total statistics of "74GB total allocations" while the heap profile looks fine, otherwise. |
| 23:53:37 | × | potatoespotatoes quits (~quassel@user/potatoespotatoes) () |
| 23:54:34 | <emojelly> | All in all, I don't think I have a space leak (or maybe just a "very local one"), it's just that the allocations *might* help me understand why "combineTestSignals = combineTestSignals' (,)" takes an extreme amount of time entirely *by itself*. I.e. all its children in the profiling tree spend much less, it doesn't sum up. |
| 23:54:49 | → | potatoespotatoes joins (~quassel@130.44.147.204) |
| 23:54:49 | × | potatoespotatoes quits (~quassel@130.44.147.204) (Changing host) |
| 23:54:49 | → | potatoespotatoes joins (~quassel@user/potatoespotatoes) |
| 23:55:06 | <emojelly> | one thing I've done is actually using the OS to sample the process |
| 23:55:19 | <emojelly> | which gave me weird symbols, which I can look up in the GHC Core file that is generated |
| 23:55:56 | <emojelly> | so far however I find the Core code very hard to understand, and knowing which executable symbol the system spends most time in did not really help me much in knowing why. |
| 23:56:41 | → | merijn joins (~merijn@host-vr.cgnat-g.v4.dfn.nl) |
| 23:56:44 | <emojelly> | But in theory, it's better than "all the time in nonsensically spent in this function which literally just applies another function, and nothing else" |
| 23:57:22 | <emojelly> | by the way, if I remove that function and directly type "combineTestSignals' (,) ..." in the caller, the "lost" time predictably just wanders to the caller. |
| 23:57:46 | <emojelly> | I thought I understood laziness and thunks, but this expression does nothing. It does not force any evaluation or anything. |
| 23:58:14 | <geekosaur> | that really sounds to me like something is getting forced in `combineTestSignals` or whatever else consumes the result of `combineTestSignals'` |
| 23:58:25 | <geekosaur> | but yeh, I don't see why |
| 23:58:43 | <emojelly> | Yeah. And, sure, something will eventually force it. But the point of profiling is to tell me where the actual work is happening, no? |
| 23:59:13 | × | Tuplanolla quits (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.) |
| 23:59:22 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 23:59:54 | × | acidjnk_new3 quits (~acidjnk@p200300d6e71c4f631cbaa9c9535aaf6d.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
All times are in UTC on 2025-04-08.