Home liberachat/#haskell: Logs Calendar

Logs on 2022-10-17 (liberachat/#haskell)

00:00:01 alismanickt joins (~talismani@2601:200:c100:c9e0::1b0b)
00:01:35 × califax quits (~califax@user/califx) (Remote host closed the connection)
00:01:52 <alismanickt> Why might GHC be hanging at link time? The code I've written is fairly conservative: the only extension I used is OverloadedStrings
00:02:52 <alismanickt> That's with `cabal run`; if I ^C and `cabal build`, it says "Up to date"
00:03:05 <geekosaur> "hanging at link time" usually means it's the system linker that's hanging
00:03:41 <geekosaur> if it's ld.bfd then it'll be extremely slow and memory hungry
00:03:43 <Axman6> We'd need quite a bit more information to begin to help though
00:03:47 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 248 seconds)
00:04:09 califax joins (~califax@user/califx)
00:04:46 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
00:05:30 <zzz> ok so i created a cabal.project file with `packages: ./*.cabal , ./vendor/*/*.cabal`
00:05:58 <alismanickt> I don't see anything linker-related in ~/.cabal/logs/build.log
00:06:05 <zzz> how do i import modules from ./vendor/ packages now?
00:06:38 <Axman6> zzz: you need to add the packages as dependencies in the .cabal file for your package
00:06:48 <Axman6> then they'll be visible within that package
00:07:02 <geekosaur> you declare dependencies on the packages as usual (they'll be satisfied locally since they're declared as vendored in cabal.project) and then you can import
00:07:14 geekosaur is slow
00:07:14 <Axman6> (afaiui anyway, I haven't done much with cabal.project files)
00:07:29 <zzz> Axman6: oh, so cabal looks for local packages and prefers them to remote ones?
00:07:35 <zzz> how does this work with versions?
00:07:35 <geekosaur> yes
00:07:58 <geekosaur> same way it would normally, so you need to declare a dependency on the vendored package's version
00:08:20 <zzz> ok nice!
00:08:23 <geekosaur> I do this with vendored (from git) xmonad and xmonad-contrib
00:09:42 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 264 seconds)
00:10:16 <zzz> just to make sure, i need to add them to `build-depends:` on my .cabal file, right?
00:10:42 <geekosaur> yes, just like any other package
00:11:56 × _xor quits (~xor@74.215.182.83) (Quit: WeeChat 3.6)
00:12:18 <Axman6> .cabal specifies what packages you depend on, cabal.project specifies where to get them from if they're not from hackage
00:14:38 × alismanickt quits (~talismani@2601:200:c100:c9e0::1b0b) (Remote host closed the connection)
00:14:38 × talismanick quits (~talismani@2601:200:c100:c9e0::1b0b) (Remote host closed the connection)
00:15:04 geekosaur wonders if they thought we'd forgotten about them
00:16:12 causal joins (~user@50.35.83.177)
00:16:44 × causal quits (~user@50.35.83.177) (Client Quit)
00:18:53 jero98772 joins (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c)
00:19:32 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Remote host closed the connection)
00:19:46 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
00:19:50 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
00:20:28 <zzz> ok i was messing up. i had an alias for ghcid that was the culprit for ignoring cabal.package
00:20:30 talismanick joins (~talismani@2601:200:c100:c9e0::1b0b)
00:21:11 causal joins (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d)
00:23:08 <zzz> i was doing `ghcid [options] app/Main.hs` and not just `ghcid [options]`
00:24:09 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
00:27:26 × Topsi quits (~Topsi@dyndsl-095-033-095-014.ewe-ip-backbone.de) (Read error: Connection reset by peer)
00:28:18 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 264 seconds)
00:28:47 freeside joins (~mengwong@103.252.202.193)
00:31:21 <talismanick> I passed "ld-options: -fuse-ld=gold" and "ghc-options: -optl-fuse-ld=gold" in the .cabal file, deleted dist-newstyle, and tried `cabal run`
00:31:25 <talismanick> segfault
00:31:30 rockystone joins (~rocky@user/rockymarine)
00:32:46 <geekosaur> I think that's the wrong way to do it, because it's being passed to ld itself which is too late for it to take effect
00:33:07 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 252 seconds)
00:33:09 <Axman6> yeah -optl is for passing arguments to the linker
00:34:14 <talismanick> so... how do I tell it to use another linker?
00:34:19 × causal quits (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d) (Quit: WeeChat 3.6)
00:34:23 × zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection)
00:34:56 <geekosaur> ghc-options: -pgml=ld.gold
00:35:08 <geekosaur> sorry, no = in there
00:35:14 <geekosaur> -pgml ld.gold
00:37:26 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
00:37:35 <geekosaur> althoughm hm, that -optl should have worked (ld-options is not normally used for final link, but for generating shared objects and such)
00:37:51 justsomeguy joins (~justsomeg@user/justsomeguy)
00:37:56 <talismanick> https://0x0.st/owZ-.txt
00:38:14 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c) (Quit: leaving)
00:38:14 causal joins (~user@50.35.83.177)
00:38:33 <geekosaur> right, it really wants cc as the link command
00:38:57 <geekosaur> problem there being I'm not sure how to do that via command line options, I've always edited the settings file directly
00:39:16 <geekosaur> $(ghc --print-libdir)/settings
00:39:16 <talismanick> settings file?
00:39:57 rockystone joins (~rocky@user/rockymarine)
00:40:24 <talismanick> from there: ,("ld command", "ld.lld")
00:40:41 <talismanick> so, that should be even faster than gold, let alone ld.bfd
00:40:55 <geekosaur> lld doesn't work as final link
00:41:33 <geekosaur> you really want "C compiler link flags" because final link needs to include libc / C runtime stuff only cc knows how to do properly
00:41:39 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
00:41:56 <geekosaur> on my system that's ,("C compiler link flags", "-fuse-ld=gold")
00:42:12 <talismanick> Yeah, I search-and-replaced lld with gold
00:42:33 <talismanick> oh, segfault now!
00:43:05 × Tuplanolla quits (~Tuplanoll@91-159-69-34.elisa-laajakaista.fi) (Ping timeout: 250 seconds)
00:43:22 <geekosaur> sigh
00:43:29 <EvanR> segfaults in haskell, smh
00:43:45 <geekosaur> lld is known not to work, but I'd have expected gold to work properly
00:44:30 <talismanick> I did just update my system... let me see if another project still builds fine after I edit it
00:44:39 <talismanick> nope! segfaults too
00:44:45 <geekosaur> 😞
00:44:55 × causal quits (~user@50.35.83.177) (Read error: Connection reset by peer)
00:45:13 <geekosaur> hope you at least saved a copy of the settings file
00:45:52 causal joins (~user@50.35.83.177)
00:46:02 <talismanick> if there's an issue tracker somewhere: you can record that building with Cabal 3.8.0.0 and GHC 9.2.4 (via ghcup) fails on Void Linux as of Oct. 16, 2022
00:46:17 <talismanick> geekosaur: oh, I'll just change gold back to lld
00:46:28 freeside joins (~mengwong@103.252.202.193)
00:46:41 <geekosaur> .oO { optimist }
00:46:55 <talismanick> I mean, it was already broken after this most recent update
00:47:03 <talismanick> and, I've evidently been using lld (somehow)
00:47:11 <talismanick> (that's what it was before I changed anything)
00:48:01 zaquest joins (~notzaques@5.130.79.72)
00:48:25 <geekosaur> hm. I don't actually know about lld on linux being working or not. it's mostly on M1 Macs that lld has been being detected a system linker and breaking, and the fix is to switch to the proper system linker
00:48:32 <geekosaur> (ld64 on those machines)
00:50:03 <geekosaur> *as system
00:50:11 × Kaipei quits (~Kaiepi@142.68.249.28) (Ping timeout: 248 seconds)
00:50:27 × causal quits (~user@50.35.83.177) (Ping timeout: 250 seconds)
00:50:37 <talismanick> oh, it works if I switch it to ld.bfd
00:50:44 <geekosaur> odd
00:51:01 <geekosaur> wonder if the hangs are lld's fault then
00:51:26 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds)
00:52:59 fmgornick joins (~fmgornick@2607:ea00:107:1c07:81d6:d0ad:8522:af6e)
00:53:18 <fmgornick> ?src scanr
00:53:18 <lambdabot> scanr _ q0 [] = [q0]
00:53:19 <lambdabot> scanr f q0 (x:xs) = f x q : qs
00:53:19 <lambdabot> where qs@(q:_) = scanr f q0 xs
00:53:56 × fmgornick quits (~fmgornick@2607:ea00:107:1c07:81d6:d0ad:8522:af6e) (Client Quit)
00:56:07 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 246 seconds)
00:56:36 × finsternis quits (~X@23.226.237.192) (Read error: Connection reset by peer)
00:57:23 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
00:57:58 nate1 joins (~nate@98.45.169.16)
01:05:12 causal joins (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d)
01:10:14 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
01:13:51 justsomeguy parts (~justsomeg@user/justsomeguy) (WeeChat 3.6)
01:14:05 justsomeguy joins (~justsomeg@user/justsomeguy)
01:16:22 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
01:18:24 × xff0x quits (~xff0x@2405:6580:b080:900:b67d:8bf9:8e64:c723) (Ping timeout: 264 seconds)
01:21:03 freeside joins (~mengwong@103.252.202.193)
01:25:51 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds)
01:40:00 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 264 seconds)
01:41:20 wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com)
01:41:20 × wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
01:41:20 wroathe joins (~wroathe@user/wroathe)
01:44:31 Lumia joins (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net)
01:45:45 freeside joins (~mengwong@103.252.202.193)
01:46:16 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
01:50:27 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 248 seconds)
01:50:38 L29Ah parts (~L29Ah@wikipedia/L29Ah) ()
01:52:51 × beteigeuze quits (~Thunderbi@2001:8a0:61b5:6101:f0c:e4e3:bfdc:91df) (Ping timeout: 250 seconds)
01:53:26 × [spookyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
01:54:53 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
01:57:54 rockystone joins (~rocky@user/rockymarine)
01:58:05 <EvanR> I was like how to fold over this type, then it became clear. That I may have gone insane https://paste.tomsmeding.com/Javeh97i
01:58:28 L29Ah joins (~L29Ah@wikipedia/L29Ah)
02:00:07 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
02:01:38 <byorgey> very nice
02:01:57 <Axman6> there are libraries that can autogenerate that right?>
02:02:06 <EvanR> what would the type of something like foldMap for this type be?
02:02:35 freeside joins (~mengwong@103.252.202.193)
02:03:03 <Axman6> also feels quite Data.Data-y
02:04:32 <EvanR> I found catamorphism package, which does this one thing
02:04:52 <EvanR> another package for another thing, I guess xD
02:04:56 × ddellacosta quits (~ddellacos@143.244.47.82) (Ping timeout: 260 seconds)
02:04:56 <[Leary]> That's why you write `type E = Fix EF; data EF a = ...; cataE :: (EF a -> a) -> ...`.
02:05:11 <Axman6> yeah
02:05:12 <EvanR> I just deleted the Fix version
02:05:22 <Axman6> well ReFix it :P
02:05:29 <EvanR> over it, moving on xD
02:06:40 ddellacosta joins (~ddellacos@143.244.47.100)
02:07:36 <EvanR> here is cataE in action, screaming for some sort of foldMap somehow https://paste.tomsmeding.com/ViIfOUKa
02:08:48 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 264 seconds)
02:09:25 × califax quits (~califax@user/califx) (Ping timeout: 258 seconds)
02:10:11 × justsomeguy quits (~justsomeg@user/justsomeguy) (Quit: WeeChat 3.6)
02:10:20 califax joins (~califax@user/califx)
02:10:21 <Axman6> @hoogle everywhere
02:10:21 <lambdabot> Data.Generics.Schemes everywhere :: (forall a . Data a => a -> a) -> forall a . Data a => a -> a
02:10:21 <lambdabot> Data.Generics.SYB everywhere :: Biplate b a => (a -> a) -> b -> b
02:10:21 <lambdabot> Numeric.Integration.TanhSinh everywhere :: ((Double -> Double) -> Double -> Double -> r) -> (Double -> Double) -> r
02:10:51 <Axman6> :t partsOf template
02:10:52 <lambdabot> (Functor f, Data t, Typeable a) => LensLike f t t [a] [a]
02:12:41 <EvanR> I knew SYB was going to come up
02:13:01 <Axman6> > ("Hello", Left "World :: Either String Bool, (Just "some", "String")) ^.. partsOf template :: [String]
02:13:03 <lambdabot> <hint>:1:103: error:
02:13:03 <lambdabot> lexical error in string/character literal at end of input
02:13:14 <Axman6> > ("Hello", Left "World" :: Either String Bool, (Just "some", "String")) ^.. partsOf template :: [String]
02:13:16 <lambdabot> ["HelloWorldsomeString"]
02:13:25 <Axman6> > ("Hello", Left "World" :: Either String Bool, (Just "some", "String")) ^.. partsOf template :: [[String]]
02:13:27 <lambdabot> [["Hello","World","some","String"]]
02:14:37 <talismanick> What's the difference between [y | (x,y)<-tupList, x==a, ...] and [y | (a,y)<-tupList ...] ?
02:14:47 <talismanick> because, they both compile, but the latter gives the wrong answer
02:15:04 <Axman6> the former only returns y's where x is equal to a
02:15:20 <talismanick> and the latter not?
02:15:22 <Axman6> the later just names x a
02:15:33 <Axman6> you can't pattern match on arbitrary values
02:15:34 <talismanick> assuming a is already named outside
02:15:46 <talismanick> because, then it shouldn't compile...
02:15:47 <Axman6> that's not how pattern matching works, you're just shadowing a
02:15:51 <talismanick> ah
02:16:12 <EvanR> something like that works in elixir... and it's weird
02:16:28 <EvanR> instead of shadowing it acts like an extra equality check
02:16:52 <talismanick> that'd be Erlang's Prolog heritage rearing its face, I imagine
02:16:55 razetime joins (~quassel@117.193.4.27)
02:17:07 <talismanick> (Prolog -> Concurrent Prolog -> Erlang -> Elixir)
02:17:37 <talismanick> idk if Elixir has logic variables, but Erlang does (a restricted form thereof, at any rate)
02:18:34 <EvanR> I guess rearing its face is better than facing its rear
02:19:13 <talismanick> hey, predicates run both ways for a reason
02:19:24 zxx7529 joins (~Thunderbi@user/zxx7529)
02:19:36 <EvanR> no this feature of elixir is in the pattern matching
02:19:55 <talismanick> pattern matching is a weakened form of unification
02:20:47 <Axman6> yeah I remember really liking being able to do foo x x = ... in erlang to require both arguments to be the same
02:21:18 <talismanick> trying to write that has bit me multiple times in Haskell :(
02:21:24 <EvanR> Refl : a = a
02:21:40 × td_ quits (~td@83.135.9.59) (Ping timeout: 268 seconds)
02:21:40 <EvanR> brainexplode
02:23:18 td_ joins (~td@83.135.9.13)
02:26:01 elbear joins (~lucian@188.24.138.239)
02:26:12 × ddellacosta quits (~ddellacos@143.244.47.100) (Ping timeout: 264 seconds)
02:29:26 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 260 seconds)
02:30:27 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
02:35:12 <ski> EvanR : next try folding a non-regular `data' type, or even a GADT
02:35:57 <EvanR> non-regular?
02:35:57 <ski> talismanick : Erlang does not have logic variables, it's just plain (immutable) variables, as in Haskell,SML,OCaml,Clean,F#,..
02:38:03 freeside joins (~mengwong@103.252.202.193)
02:42:41 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 250 seconds)
02:42:53 × terrorjack quits (~terrorjac@2a01:4f8:1c1e:509a::1) (Quit: The Lounge - https://thelounge.chat)
02:43:59 <EvanR> data NRData a b = MkNRData a (NRData b a)
02:44:15 terrorjack joins (~terrorjac@2a01:4f8:1c1e:509a::1)
02:44:59 <ski> EvanR : ones requiring polymorphic recursion to recur on. ones which don't pass the same parameters recursively. like `data SwapList a b = Nil | Cons a (SwapList b a)', `data PerfectlyBalancedTree a = Elems a | Double (PerfectlyBalancedTree (a,a))', `data Nest a = Leaf a | Node a (Nest [a])', `data IterList f a = Nil | Cons a (IterList f (f a))', `data HyperFunction f a b = HF (a -> b) (HyperFunction f (f a)
02:45:05 <ski> (f b))', `data Trist (ar :: k -> k -> *) :: k -> k -> * where Nil :: Trist ar a a; Cons :: ar a b -> Trist ar b c -> Trist ar a b'
02:46:15 <ski> (well, you could express the last one as `data Trist ar b c = (b ~ c) => Nil | forall a. Cons (ar a b) (Trist a c)', without using `GADTs')
02:47:49 <ski> Erlang does allow matching on an already bound(/instantiated) variable, though. it also allows binding a variable in each branch of a conditional or `case' (or `receive', for matching on messages in the inbox/mailbox of the process), and then use it afterwards
02:48:13 <ski> (sometimes i wish for this latter in Haskell. both of these things comes from its Prolog inheritance, yes)
02:49:40 × califax quits (~califax@user/califx) (Ping timeout: 258 seconds)
02:50:26 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
02:50:56 califax joins (~califax@user/califx)
02:51:21 <EvanR> cataNRData :: (a -> r -> r) -> (b -> r -> r) -> NRData a b -> r
02:51:28 <EvanR> cataNRData f g (MkNRData x more) = f x (cataNRData g f more)
02:53:55 × berberman quits (~berberman@user/berberman) (Ping timeout: 248 seconds)
02:54:21 × Axman6 quits (~Axman6@user/axman6) (Ping timeout: 252 seconds)
02:56:44 freeside joins (~mengwong@103.252.202.193)
02:57:53 rockystone joins (~rocky@user/rockymarine)
03:02:54 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
03:03:51 × AkechiShiro quits (~licht@user/akechishiro) (Ping timeout: 260 seconds)
03:04:06 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Ping timeout: 268 seconds)
03:04:26 × Luj3 quits (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb) (Ping timeout: 260 seconds)
03:05:36 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds)
03:10:28 AkechiShiro joins (~licht@user/akechishiro)
03:12:26 Luj3 joins (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb)
03:12:56 × Lumia quits (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net) (Remote host closed the connection)
03:13:00 rockystone joins (~rocky@user/rockymarine)
03:13:20 Lumia joins (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net)
03:13:22 <ski> yup, that's an easy one
03:17:15 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
03:19:08 <ski> (`FunList' is another one. <https://twanvl.nl/blog/haskell/non-regular1>,<https://bartoszmilewski.com/2018/10/12/trading-funlists-at-a-bazaar-with-yoneda/>,<https://stackoverflow.com/questions/64935210/what-subclasses-of-profunctor-does-funlist-support>)
03:20:59 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Max SendQ exceeded)
03:23:07 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 246 seconds)
03:23:56 × causal quits (~user@2001:470:ea0f:3:329c:23ff:fe3f:1e0d) (Quit: WeeChat 3.6)
03:24:17 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 250 seconds)
03:28:04 freeside joins (~mengwong@103.252.202.193)
03:31:19 causal joins (~user@50.35.83.177)
03:35:35 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 268 seconds)
03:37:47 rumraisin joins (~tardis@user/phileasfogg)
03:38:15 × rumraisin quits (~tardis@user/phileasfogg) (Client Quit)
03:38:38 rockystone joins (~rocky@user/rockymarine)
03:38:54 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
03:39:49 nate1 joins (~nate@98.45.169.16)
03:42:36 × Raito_Bezarius quits (~Raito@wireguard/tunneler/raito-bezarius) (Max SendQ exceeded)
03:43:31 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 248 seconds)
03:44:39 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 250 seconds)
03:44:48 × Lumia quits (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net) (Ping timeout: 264 seconds)
03:45:27 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
03:46:43 Lumia joins (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net)
03:46:55 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
03:47:35 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
03:50:37 rockystone joins (~rocky@user/rockymarine)
03:52:10 berberman joins (~berberman@user/berberman)
03:54:49 <EvanR> still working on HyperFunction
03:55:32 × loras quits (~loras@c-73-139-125-125.hsd1.fl.comcast.net) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
03:56:41 loras joins (~loras@c-73-139-125-125.hsd1.fl.comcast.net)
03:59:45 Raito_Bezarius joins (~Raito@wireguard/tunneler/raito-bezarius)
04:00:15 × razetime quits (~quassel@117.193.4.27) (Ping timeout: 250 seconds)
04:06:15 × spaced quits (uid572193@user/spaced) (Quit: Connection closed for inactivity)
04:07:52 nate1 joins (~nate@98.45.169.16)
04:08:11 spaced joins (uid572193@user/spaced)
04:12:35 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
04:13:29 elbear joins (~lucian@188.24.138.239)
04:20:05 × califax quits (~califax@user/califx) (Remote host closed the connection)
04:20:56 califax joins (~califax@user/califx)
04:21:23 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 248 seconds)
04:28:14 nate1 joins (~nate@98.45.169.16)
04:30:14 vn36__ joins (~vn36@123.63.203.210)
04:35:29 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
04:35:41 razetime joins (~quassel@117.193.4.27)
04:36:06 Kaladin joins (~Kaladin@157-131-169-214.fiber.dynamic.sonic.net)
04:36:58 × zxx7529 quits (~Thunderbi@user/zxx7529) (Ping timeout: 246 seconds)
04:43:32 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
04:44:01 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
04:57:31 tbd joins (~user@2a00:6020:4119:a000:37c5:734f:1b84:a7c2)
04:57:36 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 260 seconds)
05:00:25 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 252 seconds)
05:01:46 × Lumia quits (~Lumia@c-24-34-172-110.hsd1.ma.comcast.net) (Quit: ,-)
05:01:46 <tbd> I'm trying to write bindings to a C library using FFI and hsc2hs in several forieign imports I
05:01:46 <tbd> get the warning "expected ‘const char **’ but argument is of type ‘char **’". I typed the input argument as
05:01:46 <tbd> CString on the Haskell side. Is there anything better?
05:03:34 zxx7529 joins (~Thunderbi@user/zxx7529)
05:03:39 × zxx7529 quits (~Thunderbi@user/zxx7529) (Client Quit)
05:04:13 zxx7529 joins (~Thunderbi@user/zxx7529)
05:05:08 × Kaladin quits (~Kaladin@157-131-169-214.fiber.dynamic.sonic.net) (Quit: Leaving)
05:06:37 Kaladin joins (~Kaladin@157-131-169-214.fiber.dynamic.sonic.net)
05:09:58 elbear joins (~lucian@188.24.138.239)
05:10:06 sagax joins (~sagax_nb@user/sagax)
05:13:03 × sagax quits (~sagax_nb@user/sagax) (*.net *.split)
05:13:03 × spaced quits (uid572193@user/spaced) (*.net *.split)
05:13:03 × AkechiShiro quits (~licht@user/akechishiro) (*.net *.split)
05:13:03 × pavonia quits (~user@user/siracusa) (*.net *.split)
05:13:03 × lbseale quits (~quassel@user/ep1ctetus) (*.net *.split)
05:13:03 × raym quits (~aritra@user/raym) (*.net *.split)
05:13:03 × Vajb quits (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57) (*.net *.split)
05:13:04 × weeezes[m] quits (~weeezesma@2001:470:69fc:105::1:da65) (*.net *.split)
05:13:04 × Neosake[m] quits (~neosakema@2001:470:69fc:105::2:989e) (*.net *.split)
05:13:04 × drsooch[m] quits (~drsoochma@2001:470:69fc:105::1:c8a1) (*.net *.split)
05:13:04 × MangoIV[m] quits (~mangoivma@2001:470:69fc:105::2:8417) (*.net *.split)
05:13:04 × elvishjerricco quits (~elvishjer@2001:470:69fc:105::6172) (*.net *.split)
05:13:04 × polykernel[m] quits (~polykerne@user/polykernel) (*.net *.split)
05:13:04 × JensPetersen[m] quits (~juhp@2001:470:69fc:105::6e9) (*.net *.split)
05:13:04 × kadoban quits (~kadoban@user/kadoban) (*.net *.split)
05:13:04 × SeanKing[m] quits (~seankingm@2001:470:69fc:105::cf9c) (*.net *.split)
05:13:04 × Killy quits (~killy@2001:470:69fc:105::2:6ec1) (*.net *.split)
05:13:04 × nicmollel[m] quits (~nicmollel@2001:470:69fc:105::1:feeb) (*.net *.split)
05:13:04 × fgaz quits (~fgaz@2001:470:69fc:105::842) (*.net *.split)
05:13:04 × ghoulpine quits (xfnw@tilde.team) (*.net *.split)
05:13:04 × remexre quits (~remexre@user/remexre) (*.net *.split)
05:13:04 × dibblego quits (~dibblego@haskell/developer/dibblego) (*.net *.split)
05:13:04 × GoldsteinQ quits (~goldstein@goldstein.rs) (*.net *.split)
05:13:04 × joeyh quits (joeyh@2600:3c03::f03c:91ff:fe73:b0d2) (*.net *.split)
05:13:04 × poscat quits (~poscat@2408:8206:4823:fd6f:98ab:5c38:136c:5932) (*.net *.split)
05:13:04 × xsarnik quits (xsarnik@lounge.fi.muni.cz) (*.net *.split)
05:13:04 × stilgart quits (~Christoph@chezlefab.net) (*.net *.split)
05:13:04 × n1essa quits (3d621153a5@2604:bf00:561:2000::df7) (*.net *.split)
05:13:04 × sa quits (sid1055@id-1055.tinside.irccloud.com) (*.net *.split)
05:13:04 × ralu1 quits (~ralu@static.211.245.203.116.clients.your-server.de) (*.net *.split)
05:13:04 × nibelungen quits (~asturias@2001:19f0:7001:638:5400:3ff:fef3:8725) (*.net *.split)
05:13:04 × sviermsung quits (E3Ya4Aww1k@user/s4msung) (*.net *.split)
05:13:04 × whatsupboy quits (~whatsupbo@user/scobydoo) (*.net *.split)
05:13:04 × bsima quits (~bsima@2604:a880:400:d0::19f1:7001) (*.net *.split)
05:13:04 × agander_m quits (sid407952@id-407952.tinside.irccloud.com) (*.net *.split)
05:13:04 × SrPx quits (sid108780@id-108780.uxbridge.irccloud.com) (*.net *.split)
05:13:04 × wafflepirate quits (sid467876@id-467876.ilkley.irccloud.com) (*.net *.split)
05:13:04 × dispater- quits (~dispater@mail.brprice.uk) (*.net *.split)
05:13:04 × orcus quits (~orcus@user/brprice) (*.net *.split)
05:13:04 × integral quits (sid296274@user/integral) (*.net *.split)
05:13:04 × PotatoGim_ quits (sid99505@id-99505.lymington.irccloud.com) (*.net *.split)
05:13:04 × cln quits (sid336875@id-336875.ilkley.irccloud.com) (*.net *.split)
05:13:04 × ysh____ quits (sid6017@id-6017.ilkley.irccloud.com) (*.net *.split)
05:13:04 × feliix42 quits (~felix@gibbs.uberspace.de) (*.net *.split)
05:13:04 × sooch_ quits (sid533113@id-533113.hampstead.irccloud.com) (*.net *.split)
05:13:04 × christiaanb quits (sid84827@id-84827.lymington.irccloud.com) (*.net *.split)
05:13:04 × edmundnoble quits (sid229620@id-229620.helmsley.irccloud.com) (*.net *.split)
05:13:04 × supersven quits (sid501114@id-501114.ilkley.irccloud.com) (*.net *.split)
05:13:04 × wallymathieu quits (sid533252@id-533252.uxbridge.irccloud.com) (*.net *.split)
05:13:04 × AndreasK quits (sid320732@id-320732.uxbridge.irccloud.com) (*.net *.split)
05:13:04 × sabx quits (~sabbas@user/sabbas) (*.net *.split)
05:13:04 × urdh quits (~urdh@user/urdh) (*.net *.split)
05:13:04 × absence quits (torgeihe@hildring.pvv.ntnu.no) (*.net *.split)
05:13:04 × AWizzArd quits (~code@gehrels.uberspace.de) (*.net *.split)
05:13:04 × emergence quits (emergence@2607:5300:60:5910:dcad:beff:feef:5bc) (*.net *.split)
05:13:04 × rawles quits (~x@user/rawles) (*.net *.split)
05:13:05 × totbwf quits (sid402332@id-402332.uxbridge.irccloud.com) (*.net *.split)
05:13:05 × edwardk quits (sid47016@haskell/developer/edwardk) (*.net *.split)
05:13:05 × dixie quits (~dixie@real.wilbury.sk) (*.net *.split)
05:13:05 × acidsys quits (~crameleon@openSUSE/member/crameleon) (*.net *.split)
05:13:05 × thonkpod_ quits (~thonkpod@user/thonkpod) (*.net *.split)
05:13:05 × hamishmack quits (sid389057@id-389057.hampstead.irccloud.com) (*.net *.split)
05:13:05 × drewr quits (~drew@user/drewr) (*.net *.split)
05:13:05 × yushyin quits (w8oD1vlcZ2@mail.karif.server-speed.net) (*.net *.split)
05:13:09 absence_ joins (torgeihe@hildring.pvv.ntnu.no)
05:13:12 dixie joins (~dixie@real.wilbury.sk)
05:13:12 AWizzArd joins (~code@gehrels.uberspace.de)
05:13:13 totbwf joins (sid402332@id-402332.uxbridge.irccloud.com)
05:13:13 dibblego joins (~dibblego@122-199-1-30.ip4.superloop.com)
05:13:14 Vajb joins (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57)
05:13:15 xsarnik joins (xsarnik@lounge.fi.muni.cz)
05:13:16 joeyh joins (joeyh@2600:3c03::f03c:91ff:fe73:b0d2)
05:13:16 nibelungen joins (~asturias@2001:19f0:7001:638:5400:3ff:fef3:8725)
05:13:16 ralu1 joins (~ralu@static.211.245.203.116.clients.your-server.de)
05:13:17 ysh____ joins (sid6017@id-6017.ilkley.irccloud.com)
05:13:17 sooch_ joins (sid533113@id-533113.hampstead.irccloud.com)
05:13:18 hamishmack joins (sid389057@id-389057.hampstead.irccloud.com)
05:13:20 spaced joins (uid572193@user/spaced)
05:13:26 rawles joins (~x@user/rawles)
05:13:28 cln joins (sid336875@id-336875.ilkley.irccloud.com)
05:13:28 AndreasK joins (sid320732@id-320732.uxbridge.irccloud.com)
05:13:29 × dibblego quits (~dibblego@122-199-1-30.ip4.superloop.com) (Changing host)
05:13:29 dibblego joins (~dibblego@haskell/developer/dibblego)
05:13:29 pavonia joins (~user@ip5f5bd7bd.dynamic.kabel-deutschland.de)
05:13:29 supersven joins (sid501114@id-501114.ilkley.irccloud.com)
05:13:33 n1essa joins (3d621153a5@2604:bf00:561:2000::df7)
05:13:37 yushyin joins (wEE1cEPkfk@mail.karif.server-speed.net)
05:13:39 edmundnoble joins (sid229620@id-229620.helmsley.irccloud.com)
05:13:39 wafflepirate joins (sid467876@id-467876.ilkley.irccloud.com)
05:13:41 thonkpod_ joins (~thonkpod@2001:19f0:ac01:b46:5400:1ff:fec7:d73d)
05:13:41 christiaanb joins (sid84827@id-84827.lymington.irccloud.com)
05:13:42 AkechiShiro joins (~licht@2a01:e0a:5f9:9681:1473:3dff:fe42:56a9)
05:13:46 whatsupboy joins (~whatsupbo@2a01:4f9:c011:4b51::1)
05:13:47 PotatoGim_ joins (sid99505@id-99505.lymington.irccloud.com)
05:13:49 SrPx joins (sid108780@id-108780.uxbridge.irccloud.com)
05:14:02 × pavonia quits (~user@ip5f5bd7bd.dynamic.kabel-deutschland.de) (Changing host)
05:14:02 pavonia joins (~user@user/siracusa)
05:14:07 edwardk joins (sid47016@2a03:5180:f:3::b7a8)
05:14:13 × thonkpod_ quits (~thonkpod@2001:19f0:ac01:b46:5400:1ff:fec7:d73d) (Changing host)
05:14:13 thonkpod_ joins (~thonkpod@user/thonkpod)
05:14:26 sa joins (sid1055@id-1055.tinside.irccloud.com)
05:14:27 × edwardk quits (sid47016@2a03:5180:f:3::b7a8) (Changing host)
05:14:27 edwardk joins (sid47016@haskell/developer/edwardk)
05:14:29 integral joins (sid296274@id-296274.lymington.irccloud.com)
05:14:29 wallymathieu joins (sid533252@id-533252.uxbridge.irccloud.com)
05:14:37 × integral quits (sid296274@id-296274.lymington.irccloud.com) (Changing host)
05:14:37 integral joins (sid296274@user/integral)
05:14:40 agander_m joins (sid407952@2a03:5180:f::6:3990)
05:14:49 remexre joins (~remexre@user/remexre)
05:14:51 dispater joins (~dispater@user/brprice)
05:14:55 asan joins (~asansanwa@150.129.181.196)
05:14:57 feliix42 joins (~felix@gibbs.uberspace.de)
05:15:05 urdh joins (~urdh@user/urdh)
05:15:08 lbseale joins (~quassel@user/ep1ctetus)
05:15:08 poscat joins (~poscat@114.245.106.84)
05:15:13 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 248 seconds)
05:15:37 acidsys joins (~crameleon@openSUSE/member/crameleon)
05:15:38 orcus joins (~orcus@user/brprice)
05:15:43 bsima joins (~bsima@2604:a880:400:d0::19f1:7001)
05:16:29 sviermsung joins (cqQjNIqEOU@user/s4msung)
05:16:30 ghoulpine joins (xfnw@tilde.team)
05:16:32 <jackdk> tbd: can you provide a complete example?
05:16:37 GoldsteinQ joins (~goldstein@goldstein.rs)
05:18:07 fgaz joins (~fgaz@2001:470:69fc:105::842)
05:18:11 stilgart joins (~Christoph@chezlefab.net)
05:18:18 sabx joins (~sabbas@user/sabbas)
05:18:21 raym joins (~aritra@user/raym)
05:18:41 nicmollel[m] joins (~nicmollel@2001:470:69fc:105::1:feeb)
05:18:42 Killy joins (~killy@2001:470:69fc:105::2:6ec1)
05:18:48 SeanKing[m] joins (~seankingm@2001:470:69fc:105::cf9c)
05:19:08 × AkechiShiro quits (~licht@2a01:e0a:5f9:9681:1473:3dff:fe42:56a9) (Quit: WeeChat 3.7)
05:19:42 AkechiShiro joins (~licht@user/akechishiro)
05:19:48 kadoban joins (~kadoban@user/kadoban)
05:19:49 JensPetersen[m] joins (~juhp@2001:470:69fc:105::6e9)
05:20:08 polykernel[m] joins (~polykerne@user/polykernel)
05:20:19 MangoIV[m] joins (~mangoivma@2001:470:69fc:105::2:8417)
05:20:20 elvishjerricco joins (~elvishjer@2001:470:69fc:105::6172)
05:20:54 drsooch[m] joins (~drsoochma@2001:470:69fc:105::1:c8a1)
05:20:55 Neosake[m] joins (~neosakema@2001:470:69fc:105::2:989e)
05:21:44 weeezes[m] joins (~weeezesma@2001:470:69fc:105::1:da65)
05:22:02 <tbd> https://github.com/thomasbach-dev/hs-rrd/blob/rrd-create/src/RRDTool/LowLevel.hsc#L34
05:23:09 <tbd> Here is the function declaration in the headers: https://github.com/oetiker/rrdtool-1.x/blob/master/src/rrd.h#L248
05:24:26 sagax joins (~sagax_nb@user/sagax)
05:26:12 × berberman quits (~berberman@user/berberman) (Ping timeout: 264 seconds)
05:28:35 takuan joins (~takuan@178-116-218-225.access.telenet.be)
05:29:01 elbear joins (~lucian@188.24.138.239)
05:29:06 titibandit joins (~titibandi@xdsl-78-34-208-230.nc.de)
05:29:38 × merijn quits (~merijn@c-001-001-006.client.esciencecenter.eduvpn.nl) (Ping timeout: 268 seconds)
05:30:42 × raym quits (~aritra@user/raym) (Ping timeout: 264 seconds)
05:32:21 raym joins (~aritra@user/raym)
05:33:39 × zxx7529 quits (~Thunderbi@user/zxx7529) (Quit: zxx7529)
05:33:42 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 264 seconds)
05:39:36 <jackdk> I cannot replicate your warning on GHC 9.2.2 (which came from shell.nix, I assume). What GHC are you working on?
05:41:48 × Kaladin quits (~Kaladin@157-131-169-214.fiber.dynamic.sonic.net) (Quit: Leaving)
05:42:35 × raym quits (~aritra@user/raym) (Ping timeout: 252 seconds)
05:42:37 <[Leary]> /exit
05:42:43 × [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
05:42:58 [Leary] joins (~Leary]@user/Leary/x-0910699)
05:43:19 raym joins (~aritra@user/raym)
05:46:18 elbear joins (~lucian@188.24.138.239)
05:51:01 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
05:55:07 lisbeths joins (uid135845@id-135845.lymington.irccloud.com)
05:56:47 kenran joins (~user@user/kenran)
06:05:35 Axman6 joins (~Axman6@user/axman6)
06:06:52 chomwitt joins (~chomwitt@2a02:587:dc1e:5e00:35ee:8105:5f30:c2c7)
06:07:01 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
06:09:23 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 250 seconds)
06:13:48 zeenk joins (~zeenk@2a02:2f04:a311:7000:aa5:d3dd:854f:9922)
06:15:55 yelllloowwww joins (~igloo@76.209.246.53)
06:16:48 vn36__ joins (~vn36@123.63.203.210)
06:18:54 rockystone joins (~rocky@user/rockymarine)
06:19:30 elbear joins (~lucian@188.24.138.239)
06:19:51 × raym quits (~aritra@user/raym) (Ping timeout: 260 seconds)
06:20:26 mbuf joins (~Shakthi@49.205.87.29)
06:21:02 × yelllloowwww quits (~igloo@76.209.246.53) (Quit: Igloo IRC: https://iglooirc.com)
06:21:12 gmg joins (~user@user/gehmehgeh)
06:23:56 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
06:24:31 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 260 seconds)
06:24:38 yelllloowwww joins (~igloo@76.209.246.53)
06:25:11 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
06:27:16 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
06:27:30 × yelllloowwww quits (~igloo@76.209.246.53) (Client Quit)
06:28:53 cfricke joins (~cfricke@user/cfricke)
06:29:40 × jpds quits (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
06:29:40 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
06:29:40 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Write error: Connection reset by peer)
06:30:04 chexum joins (~quassel@gateway/tor-sasl/chexum)
06:30:15 jpds joins (~jpds@gateway/tor-sasl/jpds)
06:31:18 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
06:33:38 <tbd> jackdk: interesting, it is ghc 9.2.2.
06:36:06 <tbd> the warning made perfect sense to me. I guess CString is translated to `char *`, but the
06:36:06 <tbd> function is declared to take a `const char *`.
06:38:38 <jackdk> Your reported error talks about a `const char **` - two stars, so I'd look at how you map the `argv` permission
06:38:43 berberman joins (~berberman@user/berberman)
06:38:43 <jackdk> s/permission/parameter/
06:40:27 <tbd> Here is the output of my compilation btw: https://pastebin.com/HJKPQyz0
06:42:01 elbear joins (~lucian@188.24.138.239)
06:42:02 <tbd> Yeah, correct, I'm using `Ptr CString` which feels right. :)
06:43:06 <tbd> I just do not have a clue at all what to do with the `const`.
06:44:16 rockystone joins (~rocky@user/rockymarine)
06:45:42 <jackdk> I would try a GHC issue, and if you get a good answer make a PR against the users guide
06:46:45 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
06:48:06 hask joins (~robert@ext-1-087.eduroam.chalmers.se)
06:48:14 <hask> hello!
06:48:39 <hask> I have a quick question -- If I need to get something unique to a forkIO'd thread, any suggestions?
06:49:11 <hask> E.g the ThreadID type is stated to be abstract, so it seems unsuitable to deconstruct it and access the identifier inside
06:49:28 <hask> I essentially need to generate a directory whose name is unique to the current thread
06:50:47 <tbd> hask: Can the temporary package what you need?
06:51:11 <hask> Right, from a first look this seems to be exactly what I need
06:51:14 <jackdk> The problem you're describing might be well-solved by `mkdtemp` from `unix`
06:51:15 <hask> Thanks
06:51:41 <jackdk> orrr the `temporary` package tbd mentions, which has a more ergonomic interface
06:52:00 <hask> Temporary seem quite intuitive
06:52:04 <jackdk> Agreed
06:52:16 <hask> Thanks for the help
06:52:47 <hask> Hm, before I proceed, my own current usecase for this is to generate unique directories, but there might be other applications for what I am thinking
06:53:13 <hask> If you disregard my mentioned case above, and consider the original problem, how could I get a unique 'secret' inside a specific thread?
06:54:07 <hask> I see that I got a weird nickname here btw -- for transparency, I am Robert Krook
06:55:48 raym joins (~aritra@user/raym)
06:55:58 <tbd> hask: Not exactly sure what the requirements are here, but I guess the best way is to pass it
06:55:58 <tbd> in from the outside.
06:57:07 michalz joins (~michalz@185.246.207.200)
07:01:34 tbd` joins (~user@2a00:6020:4119:a000:c9f0:5478:d0b7:cde5)
07:03:29 nate1 joins (~nate@98.45.169.16)
07:04:18 <[Leary]> hask: ThreadId is abstract, but that abstract interface includes Show, and show is presumably injective. You can use that String directly or hash it or whatnot.
07:05:26 <[Leary]> Another option is to write a wrapper over `forkIO` that generates and provides a unique symbol, using e.g. Data.Unique.
07:05:56 × tbd quits (~user@2a00:6020:4119:a000:37c5:734f:1b84:a7c2) (Ping timeout: 260 seconds)
07:06:18 lortabac joins (~lortabac@2a01:e0a:541:b8f0:6bf9:1eed:edc8:e002)
07:06:23 <jackdk> Or generate something like a guid?
07:06:25 kenran` joins (~user@user/kenran)
07:06:25 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
07:07:53 × kenran quits (~user@user/kenran) (Ping timeout: 250 seconds)
07:08:01 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
07:09:12 <talismanick> How can I enable brittany support in HLS?
07:13:57 × raym quits (~aritra@user/raym) (Ping timeout: 250 seconds)
07:14:43 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
07:16:26 <tomsmeding> disco-dave[m]: wtf TIL about that issue. Thanks I hate it...
07:18:30 × sagax quits (~sagax_nb@user/sagax) (Remote host closed the connection)
07:18:37 <dminuoso> Im falling in love with flatparse https://gist.github.com/dminuoso/a888cc62b0d5d862f5db157e8519e2dc
07:19:21 <dminuoso> It even brings TH helpers to unroll this loop for literals. :)
07:20:01 raym joins (~aritra@user/raym)
07:20:06 <Axman6> looks like C to me :P
07:20:31 <dminuoso> You should see the rest of my module :P
07:20:37 <Axman6> trying to understand what's actually going on here, since nothing's being returned
07:20:56 <dminuoso> scanXX# is a primitive that will parse and match against a word XX bits wide exactly
07:21:25 <Axman6> oh, this is matching a bytestring literal?
07:21:30 <dminuoso> Yes
07:21:31 <Axman6> "literal", you know what I mean
07:21:35 <Axman6> lovely
07:21:50 <dminuoso> And instead of doing this in Word8 chunks, this will use native word sizse
07:21:58 <tomsmeding> is this faster than comparing lengths and then calling out to memcmp()
07:22:00 <Axman6> I wrote similar code for the last attempt of text-utf8 before theone that finally succeeded
07:22:08 <dminuoso> tomsmeding: Mmmm!
07:22:27 <Axman6> yeah that's the correct solution - but there are probably small lengths where this is faster
07:22:34 <tomsmeding> Axman6: fair
07:22:54 <tomsmeding> but reimplementing memcmp() is always fraught :p
07:22:58 <tomsmeding> performance-wise
07:23:02 <Axman6> yeah
07:23:05 <dminuoso> Well you can just unsafe FFI call into memcmp
07:23:21 <tomsmeding> still has a non-zero overhead, even though small
07:23:32 <tomsmeding> but I expect that to be faster for sufficiently long bytestrings
07:23:49 <dminuoso> Indeed, I mean I just intend to match small bytestring literals like "integer"
07:23:55 <Axman6> I reckon you'd be able to find a small length where just doing the check in Haskell is faster than making the call to memcmp
07:24:33 <dminuoso> I do some benchmarking then
07:24:44 <tomsmeding> at those lengths, given that length "integer" < 8, I wouldn't even be sure whether the 64-bit stage actually helps you -- one more check for potentially little benefit
07:24:58 <Axman6> criterion should be able to tell you where the crossover point (on your system) is
07:25:06 <dminuoso> tomsmeding: I dont think that matters realistically.
07:25:11 <tomsmeding> :p
07:25:12 <dminuoso> quotRem will compile into a single machine instruction
07:25:29 <dminuoso> So the only price is an additional branch that may not be used
07:25:36 <tomsmeding> yeah it's miniscule
07:26:06 <tomsmeding> it was only half-serious, but in microbenchmarks like memcmp() on length 7 (!), all bets are off
07:26:15 × spaced quits (uid572193@user/spaced) (Quit: Connection closed for inactivity)
07:26:48 <dminuoso> You have to be super careful to clear the cache between runs
07:27:01 <tomsmeding> or to not
07:27:10 <dminuoso> Well I guess both and then compare results.
07:27:12 <tomsmeding> depends on whether you want to time the cold or the hot case :p
07:27:31 <dminuoso> So this is an interesting case
07:27:44 <tomsmeding> dependnig on how the input string gets to you, some part of it might already be in cache
07:28:03 <dminuoso> For ultra small chunks you will want to include cache, since its likely that stride detectors will prefetch it ahead of time
07:28:15 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
07:28:22 <dminuoso> but for large chunks, you definitely want to measure this cold
07:28:26 <dminuoso> (given that we are in a parser setting)
07:28:37 <Axman6> also, don't forget the prefetch instructions you can add to this!
07:28:48 <dminuoso> Does GHC have prefetch prims?
07:28:53 <Axman6> yep
07:28:59 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Remote host closed the connection)
07:29:18 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
07:29:32 <Axman6> https://hackage.haskell.org/package/ghc-prim-0.7.0/docs/GHC-Prim.html#g:36
07:29:33 <dminuoso> So I think prefetch prims would make most sense in the TH unrolled version of this.
07:29:44 <dminuoso> Because you *know* how much to prefetch
07:29:47 <Axman6> yeah
07:30:34 <Axman6> and if the streing is short enough you wouldn't bother
07:30:56 <Axman6> string too
07:30:57 <dminuoso> Mmm, with the TH helper you likely rarely have long enough strings for prefetching to be worth it.
07:30:59 acidjnk joins (~acidjnk@p200300d6e7137a21d59bab4b536388a8.dip0.t-ipconnect.de)
07:31:09 <dminuoso> Or well I guess it is useful if you exceed 8 bytes...
07:31:12 <dminuoso> Which might not be so rare
07:31:17 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
07:31:40 <tomsmeding> are the bytestrings you're matching compile-time constants
07:32:04 <dminuoso> tomsmeding: Sure! I just wrote `bytestring` because it was a bit more convenient for the parser. :P
07:32:10 <tomsmeding> if so, decent speedup from computing the straight-line code in advance with TH (not sure that's what you were referring to before)
07:32:36 <tomsmeding> (one copy for each distinct length)
07:32:53 elbear joins (~lucian@188.24.138.239)
07:32:57 <tomsmeding> or hand-tune per-length per-machine lol
07:32:57 <dminuoso> https://hackage.haskell.org/package/flatparse-0.3.5.1/docs/src/FlatParse.Basic.html#scanBytes%23
07:32:59 <dminuoso> This
07:33:30 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
07:33:45 <dminuoso> Oh actually I realize, I can safe myself the length check if I just test the remaining length once at the beginning
07:33:54 × chomwitt quits (~chomwitt@2a02:587:dc1e:5e00:35ee:8105:5f30:c2c7) (Quit: Leaving)
07:34:12 <dminuoso> Oh haha. Actually I dont have any length checks yet. :>
07:34:28 <dminuoso> Memory corruption barely avoided.
07:34:40 <talismanick> I'm not a fan of excessively vertical code. Which formatters try to keep functions to fewer, longer lines like Brittany?
07:35:00 <dminuoso> talismanick: I would try and develop a handwritten style
07:35:07 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Client Quit)
07:35:17 <talismanick> ?
07:35:26 <Axman6> yeah Haskell doesn't lend itself particularly well to machine formatting IMO
07:35:38 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Remote host closed the connection)
07:35:55 <Axman6> imports etc are fine, but actual code often benefits for good hand weitten veritcal alignment
07:35:58 <Axman6> r*
07:35:59 × tbd` quits (~user@2a00:6020:4119:a000:c9f0:5478:d0b7:cde5) (Remote host closed the connection)
07:36:14 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
07:36:34 × whatsupboy quits (~whatsupbo@2a01:4f9:c011:4b51::1) (Quit: brb)
07:37:36 <dminuoso> I would argue that formatters are rarely a good idea (outside of a very limited scope like imports). Programming languages are not just for communicating with the compiler, they are more importantly for communicating with the programmer. A formatter will generally have a hard time understanding what you want to communicate.
07:37:38 <talismanick> Really? If I'm reading someone else's code, I typically navigate blockwise (along the AST) with shm.el while looking at the type signature
07:37:54 <dminuoso> I dont have strict ruels for the most part, I vary formatting locally to express certain facts.
07:38:02 <dminuoso> Sometimes I add redundant parens because it helps readability
07:38:05 <Axman6> me too
07:38:07 <talismanick> I hardly visually parse code... I like to have more on my screen so it's in working memory
07:38:09 <Axman6> we should be friends dminuoso
07:38:30 <talismanick> shm.el and paredit.el (its inspiration) are great
07:40:08 <probie> I'm not a huge fan of vertical alignment, it creates a lot of noise in diffs
07:40:24 <Axman6> only with poor diff tools
07:40:27 <merijn> Axman6: See also: https://twitter.com/comerijn/status/1257804634833420292
07:40:34 <Axman6> code is for me, not diffs
07:40:59 <merijn> probie: That's why whitespace ignoring diffs exist in literally every diff/version control system that matters :)
07:41:12 <dminuoso> merijn's remark in the second comment has the really relevant bit:
07:41:19 <dminuoso> `code is read more often than it's written` (or read in diffs)
07:41:30 <merijn> I look at diffs a lot
07:41:39 <merijn> but I also use whitespace ignoring diff :p
07:41:43 bitdex_ joins (~bitdex@gateway/tor-sasl/bitdex)
07:41:45 <dminuoso> I look at code more, given that I constantly read contextual code while Im writing.
07:41:46 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 258 seconds)
07:41:56 <hask> exit
07:41:59 × hask quits (~robert@ext-1-087.eduroam.chalmers.se) (Quit: Lost terminal)
07:42:09 <tdammers> anyone who has ever reviewed a long-lived PR on a large real-world codebase can tell you that diff ergonomics matter greatly
07:42:33 <dminuoso> tdammers: That's absolutely fair. For starters, everybody should be using diff3 style over diff2!
07:42:57 <dminuoso> (It's beyond me how `git` even defaults to `diff2`...)
07:42:58 <talismanick> I mean, I find it easier to read code when it's a) all on my screen b) structurally navigable (which alleviates the need to space it out vertically for legibility)
07:43:46 <Axman6> GitHub's UI does a pretty great job these days with showing the core of the diff and ignoring the whitespace changes needed to facilitate it
07:43:47 <tdammers> and here's the thing with vertical aligning: even with whitespace-ignorant diffing, the *merge* that inevitably follows is still hampered by it
07:43:48 <talismanick> so, it really annoyed me when my settings for Brittany (which does what I want, mostly) stopped working (no clue why)
07:44:00 <dminuoso> Perhaps the biggest problem of vertical alignment is that we use text to communicate code. If we just expressed the AST, then something like formatting could be controlled via a separate style hinting language, potentially even overwritten by rendering preference
07:44:40 <Axman6> yeah every few years someone reinvents flexible tabs and then no one ever gets them working
07:44:50 <tdammers> if you use newlines + indentation instead of vertical alignment, then the textual representation reflects the AST structure
07:44:55 <Axman6> the world needs more Unison
07:45:10 <talismanick> I was actually just thinking of mentioning Unison lol
07:45:15 <dminuoso> tdammers: Mmm, can you elaborate on that?
07:45:16 <talismanick> (not sure if it's offtopic or not)
07:45:36 <Axman6> Unison is like Haskell#
07:45:38 <talismanick> making the hashed representation the canonical one fixes so much
07:45:54 <dminuoso> |> looks elixirish.
07:46:01 <merijn> Structural editing and structural VC are the way
07:46:12 <merijn> But no one wanted to fund my PhD on those :p
07:46:20 <dminuoso> merijn: Sandy Maguire did work on that.
07:46:27 <dminuoso> It just headed a different way than originally planned...
07:46:32 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Remote host closed the connection)
07:46:32 <talismanick> merijn: thoughts on https://github.com/vcmiraldo/hdiff?
07:46:47 <Axman6> 404
07:46:50 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
07:46:53 <dminuoso> Wingman was supposed to be a structural editing mechanism, arosen from the idea of what it would take to enable programming on a tablet while sitting on a bench in the park
07:46:55 <talismanick> https://github.com/VictorCMiraldo/hdiff
07:47:04 <dminuoso> But wingman has become something...; else..
07:47:07 <talismanick> remembered his handle wrong lol
07:47:16 <tdammers> dminuoso: tricky over IRC, but I'll try. The idea is that every AST node (or actually CST, but let's squint a little here) is either represented as a single line of code, or as one line followed by the sub-nodes, indented one level deeper
07:48:09 <tdammers> this way, you never need to vertically align anything beyond the natural indentation, and that natural indentation already produces the correct alignments - except when you keep a node collapsed on a single line
07:48:20 <dminuoso> Yeah gotcha
07:48:27 <merijn> talismanick: Pretty neat stuff
07:48:29 <talismanick> My impression is that it's to darcs('s patch-based model) as Unison is to Haskell
07:49:03 <talismanick> or, at least, could serve as a basis for such
07:49:07 <merijn> talismanick: Somewhat relatedly, in the category of Haskell superpowers there's a diff library for ADTs that produces diff for arbitrary ADT values
07:49:13 <Axman6> wasn't there an alternative syntax someone made for Haskell that was more more indentation based? sounds like what you're talking about tdammers
07:49:41 <tdammers> Axman6: I don't think you need an alternative syntax for that; plain Haskell gets you 99% there, you just need to follow the conventions consistently
07:49:46 <talismanick> Axman6: are you talking about the Markdown-related one?
07:49:51 <tdammers> (which, I admit, I don't always do either...)
07:50:04 <Axman6> so each function's arguments were on new lines and indented more than the function, and if arguments to that function were other functions, there was no need for brackets, because you'd just indent the arguments more
07:50:16 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 260 seconds)
07:50:16 <tdammers> oh, like that, eww
07:50:37 <tdammers> "layout on crack", a.k.a. "python"
07:51:04 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
07:51:04 <dminuoso> tdammers: But yeah it makes perfect sense. This is like the common tree printing algorithm.
07:51:12 <tdammers> dminuoso: exactly.
07:51:39 <Axman6> https://gist.github.com/axman6-da/586937ed83233823a138c1e247a3bc1d
07:51:49 <talismanick> https://web.archive.org/web/20220905031105/https://chrisdone.com/posts/z/ ?
07:51:57 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
07:52:07 <Axman6> uh, wrong
07:52:17 <tdammers> Axman6: yeah, I get it, but IMO that causes a truckload of other problems (as it does in Python)
07:52:19 <Axman6> fixed
07:52:38 <talismanick> Axman6: ^ ?
07:53:10 <talismanick> idk why, but it 404's on the live page (even though it's linked to as a "Popular Article")
07:53:45 <talismanick> not that Z has been a tasteful name for a language this past year >_>
07:53:56 <Axman6> I meant my code was wrong, and I fixed it
07:54:20 <talismanick> I meant, is the link I sent what you were talking about?
07:54:25 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
07:54:36 <Axman6> yeah that looks about right
08:01:36 × razetime quits (~quassel@117.193.4.27) (Ping timeout: 264 seconds)
08:04:39 × lisbeths quits (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
08:07:32 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
08:11:29 × shriekingnoise quits (~shrieking@186.137.167.202) (Quit: Quit)
08:13:20 <talismanick> merijn: link to that diff library?
08:13:40 <talismanick> phadej's tree-diff?
08:14:11 fserucas joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
08:14:43 <merijn> yeah
08:14:50 <merijn> It's pretty amazing for debugging
08:15:10 talismanick scribbles down ideas for using new toy
08:15:36 <merijn> It's the kinda shit that makes you think all your work in other languages is stone age nonsense
08:17:07 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 248 seconds)
08:17:27 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
08:17:36 <talismanick> oh, gdiff looks nice... been playing around lately with GADTs and free monads in polysemy
08:18:02 <talismanick> too bad it's so old
08:21:33 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
08:22:50 teo joins (~teo@user/teo)
08:22:55 <dminuoso> So?
08:23:08 <dminuoso> This is the type of library that is simply... done.
08:23:15 <dminuoso> It has no non-base dependencies to ever bump.
08:23:26 vn36 joins (~vn36@123.63.203.210)
08:23:35 <dminuoso> And it has a liberal base constraint that, in all likelihood, will work for a long time.
08:24:28 <dminuoso> There's not really any relevant open issues either
08:26:35 stiell_ joins (~stiell@gateway/tor-sasl/stiell)
08:26:38 <tdammers> it's ridiculous how the idea that code "ages" has spread
08:26:38 razetime joins (~quassel@117.193.4.27)
08:28:49 <merijn> tdammers: Seems easy to understand if you only ever do JS/python development :p
08:29:02 <merijn> because there anything that wasn't used the past month probably *is* broken xD
08:29:31 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
08:29:50 × titibandit quits (~titibandi@xdsl-78-34-208-230.nc.de) (Remote host closed the connection)
08:29:59 <dminuoso> Im personally a big fan of *stable* APIs too. If your code works 10 years from now, that's a big plus.
08:30:13 chexum joins (~quassel@gateway/tor-sasl/chexum)
08:30:45 <dminuoso> But that gets into a different kind of discussion, as that's a compromise between initial release speed, good ergonomics and stability.
08:31:03 <dminuoso> One usually must take the backseat
08:31:38 <tdammers> merijn: yeah, but that's the ridiculous bit. the code itself doesn't actually "age", it's still exactly the same code. it's just that people decide every other week that the execution environment must change in incompatible ways, for some reason.
08:32:08 <dminuoso> tdammers: Hah what is amazing, is how many compatibility shims and libraries exist in the JS world.
08:32:32 <dminuoso> The fact that you have entire repositories of compiler plugins designed just for forward or backward compability is just absurd.
08:33:07 <dminuoso> But things like `base-compat-batteries` have started to become more and more popular on hackage too
08:34:33 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
08:34:48 <merijn> Adding forward compat to old base versions is a lot more sound than a lot of the stuff happening in the JS world, though
08:34:59 <merijn> So I don't think you can put those at the same level
08:35:13 <tdammers> I guess it's a natural development for a language whose origins trace back to the browser wars and weaponized incompatibilities
08:35:48 <Hecate> tbh I wouldn't overhype the usage of base-compat-batteries, it's really not used directly that much
08:36:01 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
08:36:07 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
08:36:55 zer0bitz joins (~zer0bitz@2001:2003:f748:2000:3d5a:c60:7a1a:1513)
08:37:02 <merijn> It has a whopping 21 reverse dependencies
08:37:45 <dminuoso> It's in aeson.
08:37:56 <dminuoso> Which means a quarter of hackage has it.
08:38:07 <merijn> yeah, but if aeson dropped it, they wouldn't
08:38:21 <dminuoso> aeson does not simply drop a dependency. they add.
08:38:23 <dminuoso> :)
08:40:11 × talismanick quits (~talismani@2601:200:c100:c9e0::1b0b) (Remote host closed the connection)
08:40:40 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
08:41:01 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Ping timeout: 260 seconds)
08:41:28 <probie> Is there something smaller than base that one can depend on and isn't tied to specific GHC versions?
08:43:00 <dminuoso> Well you can use.. no base?
08:43:00 MajorBiscuit joins (~MajorBisc@145.94.164.10)
08:43:08 <dminuoso> :p
08:43:31 <dminuoso> I suppose `ghc-prim` would work
08:44:12 × loras quits (~loras@c-73-139-125-125.hsd1.fl.comcast.net) (Ping timeout: 264 seconds)
08:46:21 × szkl quits (uid110435@uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
08:46:37 <tomsmeding> is ghc-prim not tied to ghc versions?
08:47:50 rockystone joins (~rocky@user/rockymarine)
08:48:08 kuribas joins (~user@ptr-17d51eoxcqlpawtoc5a.18120a2.ip6.access.telenet.be)
08:48:44 azimut joins (~azimut@gateway/tor-sasl/azimut)
08:49:13 <tomsmeding> should be noted, if you're interested in this space, that GHC always makes a module GHC.Prim available, built-into the compiler; that module is not in the ghc-prim docs
08:50:15 × tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
08:53:00 <merijn> tomsmeding: It is
08:53:22 <tomsmeding> right, so it's not really an answer to probie's question :p
08:53:25 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
08:54:43 <probie> I want to be able to write something that will work "as is" in 5 years time without just closing my eyes and declaring a very optimistic base upper bound
08:54:55 <merijn> probie: You can't
08:55:09 <dminuoso> The expectation is completely unreasonable.
08:55:13 <merijn> probie: But otoh, realistically, breaking changes in base are a Big Deal (TM)
08:55:22 <dminuoso> You expect to work with an unspecified future compiler and magically expect it to be compatible.
08:55:33 <dminuoso> These two things are incompatible
08:55:46 <merijn> probie: If you use a conservative subset of base then the odds of it breaking are pretty damn small
08:55:49 <dminuoso> Unless there was ever a memorando of understanding, that breaking changes are never introoduced
08:55:53 <dminuoso> Like in the linux kernel
08:56:06 <merijn> probie: I have some libraries where the only changes the past years are "bump base version"
08:57:05 <merijn> btw, most underrated Haskell ecosystem feature is packdeps providing an RSS feed notifying you when your upperbounds exclude the most recent version of a dependency
08:57:39 <merijn> I just have RSS feeds for my packages to see if/when I need to revisit bounds and don't think about otherwise
08:57:43 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
08:58:11 <dminuoso> RSS sits right along IRC. Something ancient and "aged".
08:58:25 <dminuoso> People just stopped using it in favour of drastically more complicated and less reliable things
08:58:37 <dminuoso> Twitter and Matrix. :p
08:58:40 elbear joins (~lucian@188.24.138.239)
08:58:50 <merijn> RSS is still amazing
08:58:53 <dminuoso> So is IRC!
08:59:29 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
08:59:48 wonko joins (~wjc@2a0e:1c80:2:0:45:15:19:130)
09:00:09 × TrueBlue[m] quits (~busterblu@2001:470:69fc:105::1:d7e8) (Quit: You have been kicked for being idle)
09:03:37 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 268 seconds)
09:03:42 <merijn> dminuoso: Have you seen the bazqux RSS aggregator?
09:05:19 × razetime quits (~quassel@117.193.4.27) (Ping timeout: 250 seconds)
09:05:41 CiaoSen joins (~Jura@p200300c9570723002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
09:05:49 razetime joins (~quassel@117.193.4.27)
09:11:18 jmorris joins (uid537181@id-537181.uxbridge.irccloud.com)
09:11:35 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
09:14:22 __monty__ joins (~toonn@user/toonn)
09:14:32 rockystone joins (~rocky@user/rockymarine)
09:16:19 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
09:19:51 `2jt joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
09:22:47 nate1 joins (~nate@98.45.169.16)
09:22:57 × vn36 quits (~vn36@123.63.203.210) (Ping timeout: 252 seconds)
09:24:50 vn36_ joins (~vn36@123.63.203.210)
09:27:43 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
09:31:29 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
09:31:56 azimut joins (~azimut@gateway/tor-sasl/azimut)
09:37:31 × ft quits (~ft@p3e9bc57b.dip0.t-ipconnect.de) (Quit: leaving)
09:54:58 jumper149 joins (~jumper149@base.felixspringer.xyz)
09:56:11 <jumper149> Does GHC collect garbage concurrently, when compiled with `-threaded` or do I need anything else? I found `--nonmoving-gc`, but the manual says "Hopefully, you won’t need any of these in normal operation".
09:56:17 elbear joins (~lucian@188.24.138.239)
09:56:27 raehik1 joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
09:57:58 <merijn> jumper149: No, GC is always stop the world. The non-moving GC aims to stop the world for shorter, bounded times, but still stop the world
09:58:15 <merijn> jumper149: Also, why do you think you need concurrent GC?
09:58:24 <geekosaur> there is *parallel* gc but until 9.2.x it didn't work well
09:58:36 <merijn> geekosaur: Even in 9.2 it's not great afaik
09:58:39 <geekosaur> (parallel != cooncurrent)
09:59:11 <merijn> geekosaur: Even Simon Marlow recommended non-parallel GC when (did it already happen?) GHC makes -threaded the default
10:00:20 <geekosaur> if it happened it'd be in 9.4
10:00:37 Kaiepi joins (~Kaiepi@142.68.249.28)
10:00:43 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
10:00:57 <geekosaur> but I think it hasn't happened yet
10:01:02 <geekosaur> maybe 9.6
10:02:09 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
10:02:27 × califax quits (~califax@user/califx) (Ping timeout: 258 seconds)
10:05:55 × razetime quits (~quassel@117.193.4.27) (Ping timeout: 248 seconds)
10:17:39 <dminuoso> Axman6: Mmm, we should take cache line alignment into consideration too!
10:17:48 <jumper149> Is there anything fundamental, that makes parallel gc hard? I expected it to be quite straightforward? The addresses in memory are accessible by any thread, right?
10:18:06 <dminuoso> Blindly just grabbing 64 byte chunks is likely not efficient if you cross cache lines.
10:18:20 <dminuoso> That's actually a problem in the TH unrolled helper too.
10:19:00 × CiaoSen quits (~Jura@p200300c9570723002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
10:19:02 <geekosaur> jumper149, that's actually part of the problem. you need to at some point stop all capabilities to do updates, since otherwise any thread might try to access memory while it's being moved
10:19:25 <dminuoso> I mean for small strings around the size of 8, it will increase thrashing.
10:19:41 <dminuoso> Though.. mmm. I dont think you can get around that here
10:21:54 <merijn> jumper149: Also in many cases the parallelism just doesn't gain you much
10:21:57 <merijn> It's kinda niche
10:22:08 <merijn> parallelism is great if you have a large working set
10:22:27 <merijn> But large working sets are bad anyway and generational GC already helps make that less of an issue
10:23:04 <merijn> Lazy code tends to allocate *tons* and produce *lots* of garbage, so these are things GHC's GC are tuned for. Allocation is dirt cheap and garbage is free
10:23:40 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
10:23:43 afotgkmnzj7asv3r joins (~afotgkmnz@2001:470:69fc:105::c24b)
10:23:45 <merijn> The downside is that concurrent GC is kinda hard with that design. But concurrent GC is mostly relevant for code that can't tolerate a GC pause (i.e. only really real time code)
10:24:06 <juri_> merijn: and security related.
10:24:10 <merijn> But if you don't have real time code, concurrent GC is most likely gonna be lower efficiency than GC pauses
10:24:11 × `2jt quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 250 seconds)
10:24:29 <juri_> (making two code paths take the same time always, in a lazy garbage collected language is hard)
10:25:11 <merijn> juri_: Sure, but anyone asking these questions doesn't know enough to be writing security code to begin with :)
10:25:32 <merijn> because that's the least of your issues with most languages
10:26:03 <jumper149> I can agree, I didn't think about security at all :D
10:26:36 <juri_> fair. :D
10:27:04 razetime joins (~quassel@117.193.4.27)
10:27:30 vglfr joins (~vglfr@145.224.100.100)
10:27:53 califax joins (~califax@user/califx)
10:30:50 <merijn> jumper149: For most code that isn't real time, the thing you care about it "throughput" (or efficiency) i.e. what percentage of CPU time/cycles is spent on "work" vs spent on "GC". If "long" GC pauses get better efficiency, your code will (overall) take shorter to run than code with lower efficiency
10:31:10 <jumper149> Overall I was just thinking, whether real time applications were possible with GHC. But there is really no way to take influence on the gc? Or are there primites to delay gc for some time for example?
10:31:22 <merijn> jumper149: And in general GHC's GC produces pretty good efficiency
10:31:33 <merijn> jumper149: It depends on how tight your deadlines are, etc.
10:31:48 <merijn> But in general GHC's runtime isn't really designed with real time in mind
10:31:49 <jumper149> merijn: I fully understand the efficiency vs latency
10:32:16 <merijn> There's no (theoretical) reason you couldn't produce a more real time focussed runtime that would let you write real time code in Haskell
10:32:25 <jumper149> Ok, I guess imperative languages like rust still have the edge in this case
10:32:26 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 260 seconds)
10:32:28 <merijn> It's just A LOT of work and not many people caring about that
10:32:48 <merijn> The people who are likely to care about real time would probably just use Rust, yeah
10:33:01 × vn36_ quits (~vn36@123.63.203.210) (Ping timeout: 260 seconds)
10:33:05 <jumper149> Yeah, I guess the people, that do care, are more into Rust, C++, Zig, etc
10:33:23 <merijn> jumper149: Note that it's not necessarily because imperative languages are better. It's more that "doing low level and real time stuff" was a core goal of Rust from the start
10:33:29 <merijn> So every system has been designed with that in mind
10:33:39 <tdammers> I think the big elephant in the room with realtime Haskell is memory allocations, yeah. The key thing you want with RT is keep allocations out of the RT-critical parts of the code, and Haskell just doesn't give you much control over that
10:33:45 <juri_> i know some people who real time "in haskell". they use haskell to write C. ;)
10:34:00 <merijn> juri_: Yeah, you might like Ivory (I think it was?)
10:34:02 <merijn> eh
10:34:09 <merijn> s/juri_/jumper149
10:34:09 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
10:34:22 <merijn> It's a Haskell DSL for generating cryptographic code in C
10:34:42 <merijn> I think there's a couple of other too
10:34:44 <dminuoso> For what its worth, tracking ownership is possible in functional languages too. Clean does it attain huge performance boosts, as it can turn pure updates into in-place memory manipulation using its type system.
10:35:23 vn36 joins (~vn36@123.63.203.210)
10:35:26 <merijn> Right, the focus on lazy + application performance has just moved Haskell into a direction where optimising for realtime wasn't a concern for anyone actually working on the language
10:35:46 <jumper149> merijn: That's pretty cool, but I didn't even have any actual TODO in mind ^^
10:36:24 <jumper149> Yeah, I can see how it can go into that direction with the focus on lazyness
10:36:54 <jumper149> Thanks for the help though :)
10:37:00 <merijn> jumper149: And also, have a look at Clash (completely different thing, but still neat!)
10:38:28 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
10:38:31 shapr joins (~user@2a02:8106:31:b200:3858:16dd:1a2:d1d1)
10:40:38 beteigeuze joins (~Thunderbi@2001:8a0:61b5:6101:f0c:e4e3:bfdc:91df)
10:41:43 `2jt joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
10:51:40 × yushyin quits (wEE1cEPkfk@mail.karif.server-speed.net) (Quit: WeeChat 3.4.1)
10:51:50 yushyin joins (U26EzVMO8P@mail.karif.server-speed.net)
10:52:11 <juri_> clash is awesome. one of these days.. :)
10:54:46 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
10:57:20 Guest54 joins (~Guest54@base.felixspringer.xyz)
10:57:55 × Guest54 quits (~Guest54@base.felixspringer.xyz) (Client Quit)
11:05:37 × vn36 quits (~vn36@123.63.203.210) (Ping timeout: 252 seconds)
11:06:45 <dminuoso> merijn: If you find a poor soul wanting to do a PhD, I really would like a P4 variant of it!
11:06:51 <dminuoso> >:)
11:07:24 <dminuoso> Though sadly, I think the P4 user base is incredibly small and limited already.
11:08:32 <shapr> what did I miss?
11:08:38 <shapr> a P4 variant of what?
11:08:42 <dminuoso> Of clash
11:08:45 <shapr> oh
11:08:51 <dminuoso> well "variant" is a bit far stretched
11:08:56 <shapr> I know clash, what's P4?
11:09:11 × vglfr quits (~vglfr@145.224.100.100) (Ping timeout: 260 seconds)
11:09:18 <dminuoso> Its a programming language for controlling forwarding planes in networking gear.
11:09:30 vglfr joins (~vglfr@145.224.100.100)
11:09:31 <dminuoso> For high performance routers and switches
11:10:15 <dminuoso> Fixed function ASICs have largely become a thing of the past for the same reasons general purpose CPUs run on microcode
11:10:27 <shapr> oh interesting
11:10:51 vn36__ joins (~vn36@123.63.203.210)
11:11:13 <shapr> Is P4 sufficiently close to Verilog that clash would do the right thing?
11:11:18 <shapr> or is there some other clash I don't know?
11:11:22 <dminuoso> No. P4 is roughly similar to say megaparsec. :P
11:11:27 <shapr> oh, ok
11:12:03 <dminuoso> Essentially its a way to build stateful parsers but part of a networking pipeline
11:12:04 <geekosaur> if you hated yourself you could probably reimplement megaparsec in verilog 🙂
11:12:11 <dminuoso> That can decode and handle packets in nanosecond time
11:13:00 <dminuoso> shapr: https://github.com/p4lang/tutorials/blob/master/exercises/basic_tunnel/solution/basic_tunnel.p4
11:13:06 <dminuoso> This is an example of a P4 program
11:21:06 × jmorris quits (uid537181@id-537181.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
11:23:02 xff0x joins (~xff0x@2405:6580:b080:900:4d83:b51f:a73e:c986)
11:25:18 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
11:29:11 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 250 seconds)
11:30:46 <merijn> dminuoso: Can do a postdoc ;)
11:30:53 <merijn> dminuoso: P4 is the routing shit, right?
11:31:05 <dminuoso> Or switching, or encapsulation, but yeah.
11:31:20 <merijn> dminuoso: my old group used to a bunch of shit like for SDN stuff
11:31:36 <dminuoso> OpenFlow?
11:31:46 <merijn> My promotor was doing a bunch of that, they wrote some P4 on GPU routing too
11:31:51 <merijn> openflow and a bunch of other stuff
11:31:55 <dminuoso> Neato
11:36:13 elbear joins (~lucian@188.24.138.239)
11:39:38 × shapr quits (~user@2a02:8106:31:b200:3858:16dd:1a2:d1d1) (Ping timeout: 268 seconds)
11:40:27 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 250 seconds)
11:45:26 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Remote host closed the connection)
11:50:47 sshine_ is now known as sshine
11:53:50 Profpatsch joins (~Profpatsc@static.88-198-193-255.clients.your-server.de)
11:54:07 <sshine> does anyone have a link to some write-up discussing why the Def type class isn't popular among Haskellers?
11:55:01 <Profpatsch> sshine: Mostly cause a) it’s not in base so effort to import and an additional dependency b) it’s inflexible compared to the default* pattern
11:55:16 <geekosaur> I don't have a link but I can explain it. defaults are contextual, not per type
11:55:38 <Profpatsch> c) it’s hard for reader because it infers data from context
11:55:42 <Profpatsch> *for the reader
11:56:05 <merijn> Also, "default" doesn't generalise
11:56:12 <merijn> Like, what the hell is "the default Integer"?
11:56:19 <sshine> Profpatsch, what's "the default* pattern"?
11:56:21 <Profpatsch> merijn: 0 according to go :P
11:56:32 <merijn> Almost all values have multiple sensible defaults and Def elevates one fairly randomly
11:56:42 <Profpatsch> sshine: if you have a type like HttpOptions you provide a function defaultHttpOptions
11:56:53 <merijn> The "most useful" case of Def is when you use it transitively to initialise a bunch of fields, but those defaults aren't general
11:56:58 <Profpatsch> meaning you can also have a function defaultHttpOptionsSsl or something
11:57:30 <sshine> I'm recording your answers, all of which align perfectly with what I believe, but I'm asking if anyone knows a write-up that I can refer to, kind of like when you write a Wikipedia article about your own opinion and you can't say "Scientists say..." just because you're a scientist. :-P
11:57:36 <merijn> sshine: What does "instance Def Foo where def = ..." give me that "myDefault :: Foo; myDefault = ..." does not?
11:57:44 <merijn> sshine: Fuck yes I can :p
11:57:57 <merijn> I've been using "the doctor says so" to justify anything I want the past month!
11:57:57 <sshine> merijn, citation needed!
11:58:02 <Profpatsch> sshine: maybe you can write one called “why you shouldn’t use the Default trait/typeclass pattern and alternatives”
11:58:13 <merijn> sshine: "Merijn Verstraaten, personal communication on IRC" :)
11:58:14 <sshine> merijn, an apple a day keeps yourself away? whoops!
11:58:43 <merijn> Science got lame when we stopped citing "personal communication" :p
11:58:51 <geekosaur> but tbh my main reference for Default being bad is https://github.com/xmonad/xmonad/commit/383ffb772e4a
11:59:01 <Profpatsch> the Default pattern is something that sounds cool on first thought, then Rust puts it into its stdlib, then people start thinking about it in depth :PP
12:00:14 <merijn> Some things just aren't written down, because they're too obvious
12:00:32 <Profpatsch> merijn: my rule is that everything is obvious once you’ve internalized it
12:00:39 <sshine> https://i.imgflip.com/6x7dz2.jpg
12:00:39 <Profpatsch> but everything warrants documenting
12:00:51 <merijn> Now I'm thinking about the guy arguing on reddit that dogs don't understand "finger pointing", because there was no research establishing they could >.>
12:01:09 <merijn> Source: "I have interacted with the real world"
12:01:20 <sshine> Profpatsch, I wish "then people start thinking about it" was what happened, but it's more like "then people start implementing Default for EVERY FREAKING THING THEY CAN"
12:01:20 <Profpatsch> merijn: oh there’s a great trolley problem one about this
12:01:43 <Profpatsch> I hope I saved it somewhere
12:01:49 <merijn> sshine: I blame English for conflating doctor and "physician" as if the latter isn't just a trade with pretensions :p
12:04:00 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 264 seconds)
12:05:29 <sshine> merijn, blame Default instances ;)
12:05:32 × cfricke quits (~cfricke@user/cfricke) (Ping timeout: 268 seconds)
12:05:59 <sshine> everyone knows doctors fix humans
12:07:05 × poscat quits (~poscat@114.245.106.84) (Read error: Connection reset by peer)
12:07:15 <sshine> geekosaur, thanks for giving me a concrete example of why Default is bad. :)
12:07:19 poscat joins (~poscat@2408:8206:4823:fd6f:98ab:5c38:136c:5932)
12:08:05 <jackdk> one of these days I'll get around to writing "`Default`? With respect to what? Do you mean `Monoid`?" Until then, I recommend the aesthetically-pleasing instances at https://hackage.haskell.org/package/acme-default
12:08:16 elbear joins (~lucian@188.24.138.239)
12:12:34 <sshine> jackdk, lol! "Current default False chosen by ertes, the answer to the question whether mniip has a favourite Bool."
12:12:43 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
12:13:39 elbear joins (~lucian@188.24.138.239)
12:15:24 <sshine> another language feature that gets abused by my colleagues new to Rust is 'impl From<X> for Y' and then replace all named functions with .into(), because the first transformation of one type to another might just be the canonical. all your function compositions become these .into() chains. let bar: Bar = foo.into(); let baz: Baz = bar.into();
12:16:19 <sshine> I also abuse language features that I discovered recently. I just spend more time exploring language features and apply the abuse in pet projects.
12:17:30 jakalx joins (~jakalx@base.jakalx.net)
12:18:01 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 260 seconds)
12:18:15 <merijn> sshine: I write them in obscure gists to show off :p
12:18:43 <merijn> Still proud of this atrocity: https://gist.github.com/merijn/6130082
12:22:38 <sshine> merijn, hehe
12:27:16 <Profpatsch> jackdk: that package makes the point pretty well :P
12:28:05 <Profpatsch> oh, and RIP ertes
12:28:22 × bitdex_ quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
12:28:23 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
12:28:33 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 250 seconds)
12:30:18 <jumper149> merijn: You asked "what is the default Integer". I raise "What is the Semigroup on Integers?". This is a general problem with typeclasses. Idris solves it by having named implementations (instances), so you can have a Semigroup instance named `Plus` and one named `Mult` for example.
12:31:00 <jumper149> In Haskell you just have to choose. Or you use newtypes I guess
12:31:28 <tdammers> newtypes are kinda like the accepted "solution" for when you want more than one instance
12:31:32 <merijn> jumper149: I'm not 100% convinced naming *solves* the problem :p
12:32:02 <jackdk> If we had a better hierarchy than `Num` that had a `Ring` somewhere, we could make the canonical semigroup for numeric types plus-ish, and then replace `(<>)` with `(+)` everywhere
12:32:57 <jumper149> merijn: Does `Double` have satisfy a ring structure?
12:33:09 <jumper149> s/have//
12:33:20 <tdammers> that's an orthogonal issue
12:34:02 <[Leary]> jackdk: I'd rather we had `(+) :: Semigroup (Sum a) => a -> a -> a`, `(*) :: Semigroup (Product a) => a -> a -> a`.
12:34:26 <jumper149> [Leary]: Honestly a nice idea.
12:34:31 <tdammers> Numerical typeclasses on Double are wrong, but in a practical "but they should" kind of way; the issue with Semigroup Int is that a typeclass is fundamentally the wrong thing for modelling semigroups, it's just that we don't have anything better
12:34:46 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
12:34:59 <tdammers> (or alternatively: naming the Semigroup typeclass after semigroups is wrong, but too tempting not to)
12:35:02 <dminuoso> Are there efficient show numerical routines for bytestring like `Int -> ByteString`?
12:35:08 <dminuoso> Well. Functions!
12:35:11 <sshine> what are some examples of when speaking of defaults makes sense? besides "a configuration file" or "a default file path"
12:35:12 <jumper149> Maybe C++ overloading was the best solution all along x)
12:35:19 <merijn> dminuoso: What does you mean by "show numerical"
12:35:23 <merijn> jumper149: Oh **god** no
12:35:28 elbear joins (~lucian@188.24.138.239)
12:35:35 <lortabac> if you want you can have named instances in Haskell by adding a type parameter to the class
12:35:37 <dminuoso> merijn: what `show 10` would do, but directly on a bytestring buffer.
12:35:43 <tdammers> note that I didn't say typeclasses are wrong in general. they're one honking useful language feature
12:35:48 <merijn> sshine: Default configuration often make sense, but defining one as a value instead of Def makes 0 difference in effort
12:35:58 <dminuoso> merijn: bytestring already comefs with `readInteger` and `readInt`, just want something to roundtrip with that.
12:36:14 <tdammers> and in fact we *can* model semigroups correctly, but it's a bit awkward, because it requires passing the semigroup itself around
12:36:17 <merijn> sshine: The only "value add" of Def is that you can invoke it recursively (instantiating fields with their defaults), but since defaults aren't general, that doesn't work
12:36:40 <sshine> merijn, I agree :) but I'm trying to justify the notion that "a default" makes sense. you have to put a concept on a pedestal to shoot it down.
12:37:07 <sshine> merijn, right, I noted that down in the tl;dr version as "Defaults are useful for transitive derivation, but risk context drift causing errors"
12:37:12 <tdammers> in practice, the most whopping advantage of `def` is that you get to use the same short identifier for all your default values XD
12:38:01 <jackdk> Combine with Applicative for `def <$> def <*> def <*> def <*> def...`
12:38:23 <Profpatsch> instance Def a => Def ((->) e) where
12:38:36 <Profpatsch> forgot the a
12:38:39 <Profpatsch> but you get the idea
12:39:18 <Profpatsch> jackdk: what’s the default applicative functor
12:39:22 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
12:39:50 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
12:40:17 <merijn> sshine: I think the example of http/SSL options make sense as example when "a default" makes sense
12:40:27 <merijn> 90% of programmers want to "just make a connection"
12:40:41 <merijn> And a config that "Just Works (TM)" can save a lot of time and be very convenient
12:41:06 <merijn> And in general any form of "application config" where there is a sensible default that "just works" and gets overridden makes sense
12:41:08 <Profpatsch> merijn: that’s why you usually have a function that wraps makeHttpConnection defaultOptions
12:42:01 × asan quits (~asansanwa@150.129.181.196) (Quit: This computer has gone to sleep)
12:44:10 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Ping timeout: 246 seconds)
12:46:02 asansanwal joins (~asansanwa@150.129.181.196)
12:47:08 × asansanwal quits (~asansanwa@150.129.181.196) (Client Quit)
12:48:48 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
12:50:22 <Profpatsch> Is there a recommended way to deal with sum types in contrafunctors?
12:50:46 <Profpatsch> I have a simple contrafunctor newtype Enc from = Enc (from -> Encoding)
12:51:04 <Profpatsch> And a bunch of combinators for constructing an Enc
12:51:40 <Profpatsch> But sum :: (from -> Encoding) -> Enc from does not feel good to use
12:51:58 <Profpatsch> Mostly because I don’t control Encoding (it’s from aeson)
12:52:35 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
12:53:04 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
12:55:05 loras joins (~loras@c-73-139-125-125.hsd1.fl.comcast.net)
12:59:18 <jumper149> Profpatsch: How about `sum $ \case ...`
13:00:26 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
13:00:29 <jumper149> Which should be the same as `Enc \case` I guess
13:02:02 <Profpatsch> jumper149: yeah, I don’t like the way that you have to jump into the “internals”
13:02:22 <Profpatsch> cause at some point you can just write a function `a -> Encoding` :P
13:02:59 <jumper149> Are you looking for https://hackage.haskell.org/package/base-4.17.0.0/docs/Data-Functor-Contravariant.html#v:contramap ?
13:03:18 littlefinger joins (~littlefin@pool-74-102-98-242.nwrknj.fios.verizon.net)
13:04:29 jonathanx_ joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
13:04:54 × jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 264 seconds)
13:05:28 <Profpatsch> jumper149: yeah that’s the main reason the newtype is there, so that you can use contramap. But maybe a bit weak as a use-case.
13:05:44 <[Leary]> I'm not sure I understand the question, but I know you can write e.g. `Enc a -> Enc b -> Enc (Either a b)`. It's possible you can combine that with some prism magic to make it more general.
13:05:53 <Profpatsch> esp if it doesn’t work very well for Enc Foo data Foo = Foo Int | Bar Char
13:07:04 <Profpatsch> [Leary]: I’m afraid the case match needs to be in there somewhere, otherwise you don’t get exhaustiveness checking.
13:07:15 <jumper149> Not sure, why `Enc Foo` would be a problem here, if they both end up inside `Encoding`.
13:07:38 <Profpatsch> jumper149: yeah but it would be great if you could use the existing Enc combinators
13:08:33 <jumper149> What are they?
13:08:48 <Profpatsch> stuff like map :: (Coercible k Text) => Enc v -> Enc (Map k v)
13:16:26 × paddymahoney quits (~paddymaho@cpe9050ca207f83-cm9050ca207f80.cpe.net.cable.rogers.com) (Read error: Connection reset by peer)
13:16:34 <jumper149> I cannot see the problem, sorry ^^
13:19:27 <Profpatsch> maybe it’s a brain worm
13:20:43 × causal quits (~user@50.35.83.177) (Quit: WeeChat 3.6)
13:21:26 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
13:24:17 nate1 joins (~nate@98.45.169.16)
13:24:43 abrar joins (~abrar@static-108-2-152-54.phlapa.fios.verizon.net)
13:28:59 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds)
13:33:23 × vglfr quits (~vglfr@145.224.100.100) (Ping timeout: 252 seconds)
13:33:49 <[Leary]> Profpatsch: One way to make function newtypes more ergonomic is to give them a nice application operator. With that in hand, there's nothing to stop you from leveraging existing combinators to deal with the sum components, e.g. `Enc \case Foo a -> encInt $~ a; Bar c -> encChar $~ c`.
13:35:32 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
13:36:17 <Profpatsch> [Leary]: oh hell, getting away from weird operators is my main reason why I’m wrapping aeson interfaces :P
13:38:27 thegeekinside joins (~thegeekin@189.180.97.156)
13:40:38 Sgeo joins (~Sgeo@user/sgeo)
13:48:16 shriekingnoise joins (~shrieking@186.137.167.202)
13:52:41 CiaoSen joins (~Jura@p200300c9570723002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
13:58:30 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 268 seconds)
13:58:50 finsternis joins (~X@23.226.237.192)
14:00:09 × MajorBiscuit quits (~MajorBisc@145.94.164.10) (Ping timeout: 252 seconds)
14:01:03 MajorBiscuit joins (~MajorBisc@145.94.164.10)
14:02:56 vglfr joins (~vglfr@145.224.100.100)
14:03:12 × [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
14:04:02 cfricke joins (~cfricke@user/cfricke)
14:05:53 stef204 joins (~stef204@user/stef204)
14:07:08 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 268 seconds)
14:09:07 <probie> How do you define `($~)`? `($~) :: Coercible x (a -> b) => x -> a -> b` is not particularly ergonomic
14:15:28 elbear joins (~lucian@188.24.138.239)
14:20:08 [Leary] joins (~Leary]@user/Leary/x-0910699)
14:22:05 o-90 joins (~o-90@gateway/tor-sasl/o-90)
14:24:06 rockystone joins (~rocky@user/rockymarine)
14:25:50 × o-90 quits (~o-90@gateway/tor-sasl/o-90) (Remote host closed the connection)
14:28:06 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 268 seconds)
14:30:05 <[Leary]> probie: If I don't need to support more than one type at the same time then I wont think too hard; `newtype Foo = Foo{ ($~) :: A -> B }` works just fine.
14:34:31 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
14:35:53 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
14:36:40 <probie> Right, I thought you wanted something for all newtyped functions (or at least several of them). That makes much more sense
14:39:27 jero98772 joins (~jero98772@2800:484:1d80:d8ce:3490:26c5:1782:da8c)
14:40:16 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
14:43:15 × MajorBiscuit quits (~MajorBisc@145.94.164.10) (Quit: WeeChat 3.6)
14:45:48 DavidBinder joins (~DavidBind@134.2.10.18)
14:46:23 MajorBiscuit joins (~MajorBisc@145.94.164.10)
14:48:25 <jonathanx_> So I spend a lot of time fixing up import statements that get caught by --pedantic. Is there a way to automatically remove unwanted imports? I'm on vscode/HLS
14:48:38 <jonathanx_> (idk if I've asked this before, been a hectic week and I can't find it in the logs)
14:52:15 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 258 seconds)
14:52:18 <merijn> Wait, since when is there a --pedantic? :o
14:52:48 <geekosaur> looks to me like there is a "remove all redundant imports" code action
14:53:23 × waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 248 seconds)
14:54:06 ChaiTRex joins (~ChaiTRex@user/chaitrex)
14:54:10 <geekosaur> jonathanx_, ^^
14:54:55 × MajorBiscuit quits (~MajorBisc@145.94.164.10) (Quit: WeeChat 3.6)
14:55:13 MajorBiscuit joins (~MajorBisc@145.94.164.10)
14:55:53 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
14:59:50 rockystone joins (~rocky@user/rockymarine)
15:01:22 × infinity0 quits (~infinity0@pwned.gg) (Remote host closed the connection)
15:03:07 × arahael quits (~arahael@210.185.98.153) (Ping timeout: 246 seconds)
15:03:49 × dibblego quits (~dibblego@haskell/developer/dibblego) (Ping timeout: 246 seconds)
15:04:16 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 260 seconds)
15:08:09 dibblego joins (~dibblego@122-199-1-30.ip4.superloop.com)
15:08:09 × dibblego quits (~dibblego@122-199-1-30.ip4.superloop.com) (Changing host)
15:08:09 dibblego joins (~dibblego@haskell/developer/dibblego)
15:08:19 LukeHoersten joins (~LukeHoers@user/lukehoersten)
15:09:29 infinity0 joins (~infinity0@pwned.gg)
15:11:34 elbear joins (~lucian@188.24.138.239)
15:12:38 gurkenglas joins (~gurkengla@p548ac72e.dip0.t-ipconnect.de)
15:16:05 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 268 seconds)
15:17:37 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:6bf9:1eed:edc8:e002) (Quit: WeeChat 2.8)
15:17:39 arahael joins (~arahael@59-102-114-6.tpgi.com.au)
15:18:21 × kenran` quits (~user@user/kenran) (Remote host closed the connection)
15:19:05 telser joins (~quassel@user/telser)
15:19:05 × telser quits (~quassel@user/telser) (Client Quit)
15:19:39 rockystone joins (~rocky@user/rockymarine)
15:21:33 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
15:24:13 Midjak joins (~Midjak@82.66.147.146)
15:25:15 × LukeHoersten quits (~LukeHoers@user/lukehoersten) (Quit: My MacBook has gone to sleep. ZZZzzz…)
15:29:11 mgd joins (~mgd@85.210.228.38)
15:29:51 LukeHoersten joins (~LukeHoers@user/lukehoersten)
15:32:50 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
15:36:10 <Profpatsch> yes there is a code action
15:43:59 × LukeHoersten quits (~LukeHoers@user/lukehoersten) (Quit: My MacBook has gone to sleep. ZZZzzz…)
15:44:01 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
15:45:26 nate1 joins (~nate@98.45.169.16)
15:45:37 asansanwal joins (~asansanwa@150.129.181.196)
15:45:45 × asansanwal quits (~asansanwa@150.129.181.196) (Client Quit)
15:47:38 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
15:48:45 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
15:55:53 jakalx joins (~jakalx@base.jakalx.net)
15:57:36 × stef204 quits (~stef204@user/stef204) (Quit: WeeChat 3.7)
16:00:35 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Remote host closed the connection)
16:00:53 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
16:03:34 asansanwal joins (~asansanwa@150.129.181.196)
16:03:35 stef204 joins (~stef204@user/stef204)
16:05:13 × asansanwal quits (~asansanwa@150.129.181.196) (Client Quit)
16:05:45 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:09:01 × CiaoSen quits (~Jura@p200300c9570723002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
16:11:32 titibandit joins (~titibandi@xdsl-78-34-208-230.nc.de)
16:15:21 × MajorBiscuit quits (~MajorBisc@145.94.164.10) (Quit: WeeChat 3.6)
16:19:35 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
16:19:59 × littlefinger quits (~littlefin@pool-74-102-98-242.nwrknj.fios.verizon.net) (Ping timeout: 244 seconds)
16:21:28 × stef204 quits (~stef204@user/stef204) (Quit: WeeChat 3.7)
16:23:36 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:24:48 × zmt00 quits (~zmt00@user/zmt00) (Read error: Connection reset by peer)
16:25:19 vn36__ joins (~vn36@123.63.203.210)
16:28:14 zmt00 joins (~zmt00@user/zmt00)
16:30:17 tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
16:30:32 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
16:31:39 × teo quits (~teo@user/teo) (Ping timeout: 250 seconds)
16:33:10 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:35:59 stef204 joins (~stef204@user/stef204)
16:42:32 × `2jt quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 268 seconds)
16:46:57 <dminuoso> What I would like, is a minimal-depends. :S
16:47:17 <dminuoso> Perhaps even as a default warning in cabal.
16:47:23 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:48:14 <dminuoso> I think interface files already expose imported modules (since they are needed for tracking which typeclass instances are in scope), so the basic machinery is already there.
16:49:19 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
16:53:15 VanceIsM7[m] joins (~vanceism7@2001:470:69fc:105::3ad)
16:53:35 × vglfr quits (~vglfr@145.224.100.100) (Ping timeout: 252 seconds)
16:55:20 <EvanR> merijn, Ivory is for generating whatever C code. While I can't seem to find the one specifically for crypto, the one that would generate timing uniform primitives in asm...
16:55:48 <EvanR> (or something, I don't know if that makes sense)
16:57:03 × kuribas quits (~user@ptr-17d51eoxcqlpawtoc5a.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 27.1))
16:58:13 asansanwal joins (~asansanwa@150.129.181.196)
16:58:15 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
17:00:50 econo joins (uid147250@user/econo)
17:01:47 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Remote host closed the connection)
17:02:04 hashn3rd joins (~hashn3rd@ip72-221-42-80.ks.ks.cox.net)
17:03:27 × mgd quits (~mgd@85.210.228.38) (Quit: Client closed)
17:07:11 × raehik1 quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
17:07:12 Tuplanolla joins (~Tuplanoll@91-159-69-174.elisa-laajakaista.fi)
17:08:41 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.7)
17:11:08 × hashn3rd quits (~hashn3rd@ip72-221-42-80.ks.ks.cox.net) (Ping timeout: 244 seconds)
17:11:21 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
17:16:41 vglfr joins (~vglfr@145.224.100.100)
17:18:56 <Guillaum[m]> Is there a way to attach arbitrary data to an object info table. A bit similar to the data attached in info table and which can be queried by https://hackage.haskell.org/package/base-4.17.0.0/docs/GHC-Stack-CCS.html#v:whereFrom, but I would like to attach arbitrary data.
17:19:34 <Guillaum[m]> Use case: I'd like to add debuging informations about the creation context of an object, but I don't want to be intrusive in my AST.
17:19:36 × zmt00 quits (~zmt00@user/zmt00) (Ping timeout: 260 seconds)
17:21:41 zmt00 joins (~zmt00@user/zmt00)
17:25:26 × juri_ quits (~juri@84-19-175-179.pool.ovpn.com) (Ping timeout: 260 seconds)
17:25:56 `2jt joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
17:30:41 × beteigeuze quits (~Thunderbi@2001:8a0:61b5:6101:f0c:e4e3:bfdc:91df) (Ping timeout: 260 seconds)
17:34:49 <geekosaur> https://downloads.haskell.org/ghc/9.4.2/docs/users_guide/extending_ghc.html#source-annotations ?
17:35:20 <geekosaur> otherwise I think not; the info table's format is fixed by how GC uses it
17:35:46 EsoAlgo joins (~EsoAlgo@129.146.136.145)
17:36:47 <geekosaur> (I pointed to 9.4 but I think they go back to 7.0 and are certainly in 8.x)
17:37:35 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
17:37:44 <geekosaur> if you really need to alter the info table you'll need to ask in #ghc
17:38:18 spaced joins (uid572193@user/spaced)
17:38:29 gmg joins (~user@user/gehmehgeh)
17:39:00 natechan joins (~nate@98.45.169.16)
17:42:14 <jumper149> dminuoso: There is `-Wunused-packages` for GHC.
17:44:05 × asansanwal quits (~asansanwa@150.129.181.196) (Quit: This computer has gone to sleep)
17:44:09 <Guillaum[m]> geekosaur: thank you.
17:46:30 × mbuf quits (~Shakthi@49.205.87.29) (Quit: Leaving)
17:48:35 × DavidBinder quits (~DavidBind@134.2.10.18) (Quit: Leaving)
17:52:01 <EvanR> > text "ab\tcd"
17:52:02 <lambdabot> ab cd
17:52:14 juri_ joins (~juri@79.140.121.220)
17:52:33 <EvanR> which god decides how many spaces a tab is here
17:56:03 littlefinger joins (~littlefin@pool-74-102-98-242.nwrknj.fios.verizon.net)
17:57:01 × juri_ quits (~juri@79.140.121.220) (Ping timeout: 252 seconds)
17:57:55 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 248 seconds)
17:58:04 juri_ joins (~juri@84-19-175-179.pool.ovpn.com)
17:58:32 <EvanR> hopefully not Loki
17:59:58 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
18:08:03 × crns quits (~netcrns@user/crns) (Ping timeout: 248 seconds)
18:09:20 crns joins (~netcrns@p4ff5e713.dip0.t-ipconnect.de)
18:09:20 × crns quits (~netcrns@p4ff5e713.dip0.t-ipconnect.de) (Changing host)
18:09:20 crns joins (~netcrns@user/crns)
18:09:53 zkSNOOP joins (~username@ptr-21zvp7p1ecvdx6mr7hf.18120a2.ip6.access.telenet.be)
18:13:19 Topsi joins (~Topsi@dyndsl-095-033-095-014.ewe-ip-backbone.de)
18:14:51 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:16:03 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Remote host closed the connection)
18:16:15 × razetime quits (~quassel@117.193.4.27) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
18:18:04 × loras quits (~loras@c-73-139-125-125.hsd1.fl.comcast.net) (Ping timeout: 246 seconds)
18:18:10 elbear joins (~lucian@188.24.138.239)
18:19:21 <jonathanx_> I'm experimenting with an effect lib that comes with a GHC plugin to disambiguate stuff. Using the plugin, ghc compiles fine, but HLS still thinks that the build is broken. How do I make HLS recognize ghc plugins?
18:22:56 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 268 seconds)
18:25:37 × jbayardo quits (~jbayardo@20.83.116.49) (Ping timeout: 252 seconds)
18:25:39 <geekosaur> that's probably a question for #haskell-language-server
18:27:16 × Alex_test quits (~al_test@178.34.163.70) (Ping timeout: 260 seconds)
18:28:26 × AlexZenon quits (~alzenon@178.34.163.70) (Ping timeout: 260 seconds)
18:29:06 freeside joins (~mengwong@103.252.202.193)
18:29:30 <monochrom> EvanR: Pessimistically I'm pretty sure it's Loki or someone isomorphic to Loki. Look at how everyone disagrees on the number, and on top of that, also voices that propose that there should be no mapping at all. Right, I have read a web page stating both "tab is not any number of spaces" and "tab does not even mean the next designated column, tab is just tab".
18:30:40 <EvanR> this calls for category theory
18:30:53 elbear joins (~lucian@188.24.138.239)
18:31:39 Alex_test joins (~al_test@178.34.163.70)
18:31:51 <darkling> Or just a proper standard that unifies all the existing standards.
18:32:02 <darkling> It wouldn't have to be very long. Just the parts that everyone can agree on.
18:32:09 <geekosaur> *hollow laugh*
18:32:11 <darkling> "Tabs are." possibly
18:32:23 AlexZenon joins (~alzenon@178.34.163.70)
18:32:55 × raym quits (~aritra@user/raym) (Ping timeout: 268 seconds)
18:32:55 geekosaur notes that an old typewriter he had had fixed tabs. ½ inch
18:33:15 <[exa]> pls could tabs finally start doing actual tabulation not just "maybe 8 spaces yolo"
18:33:35 <monochrom> Once upon a time, programmers gathered together and were like "let's collaborate on a super-project that develops the ultimate program, it will be so powerful that it will rival God". God cannot let that happen, so God simply said, "let every programmer disagrees on what tab means", and that suffices to dissolve the project. >:)
18:33:36 <geekosaur> if you were lucky that was 5 characters
18:33:37 cdimitroulas joins (~cdimitrou@17.232.83.98)
18:33:57 <geekosaur> the Tab of Babel
18:34:00 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Ping timeout: 264 seconds)
18:34:06 <darkling> The Tabulator of Babel?
18:34:09 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds)
18:34:26 jbayardo joins (~jbayardo@20.83.116.49)
18:35:09 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 250 seconds)
18:36:45 <EvanR> sadly, the question remains. If you print out tabs to stdio where does the spacing come from
18:37:02 <jonathanx_> geekosaur: thanks, I'll check there
18:37:06 <monochrom> The terminal.
18:37:29 <geekosaur> the terminal emulator
18:37:35 <geekosaur> which may or may not be sane
18:37:40 <geekosaur> fsvo sane
18:37:50 <EvanR> the terminal, it's not the OS, the c library, the runtime system, ...
18:37:53 <monochrom> Hell, the terminal doesn't insert spaces either. It just works in terms of screen positions.
18:38:00 <darkling> "What is it, doctor?" "I'm afraid it's terminal."
18:38:22 <monochrom> Right, except for the terminal, everything else preserves the '\t' character as is.
18:38:48 <[exa]> literal indentation heaven ^
18:39:22 <monochrom> And the terminal just plays with screen coordinates. In fact, if it retains memory (for copy-paste), it remembers the '\t' too, no change.
18:39:24 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 264 seconds)
18:39:37 <EvanR> cool so I can adjust the tabs globally
18:39:45 <EvanR> except within vim
18:40:08 <geekosaur> except that prpograms expect to be able to interpret tabs. and $SOMEONE help you if they disagree with your terminal
18:40:25 <EvanR> what kind of programs
18:40:43 <monochrom> The unix "expand" utility? >:)
18:40:47 <geekosaur> editors, indentation-aware compilers/interpreters, etc.
18:41:15 <EvanR> indentation aware doesn't mean... "number of tabs" ? xD
18:41:34 <monochrom> Next April 1st, "expand" converts tabs to a monkey face emoji >:)
18:41:45 <EvanR> looking up expand
18:42:03 <monochrom> Oh it normal just convert tabs to spaces.
18:42:11 <monochrom> s/normal/normally/
18:42:18 <geekosaur> someone apparently hasn't dealt with either haskell or python layout in the presence of tabs
18:42:38 <monochrom> Well, expand predates those...
18:42:44 <[exa]> hm guys lemme throw together a very quick idea
18:42:51 <geekosaur> you get unpleasant surprises if their notion of how tabs work differs from youtr terminal. or your editor
18:42:55 <EvanR> I read that there's a rule for figuring out layout when tabs are mixed with spaces, but it doesn't involves "tabs = 8 spaces" or such xD
18:43:22 <monochrom> Or at least the creators of expand had not heard of layout-sensitive languages. They were working with C etc.
18:43:27 <EvanR> how would haskell know what your editor is set to
18:43:42 <geekosaur> that's kinda the point
18:43:44 <geekosaur> it doesn't
18:43:57 <geekosaur> it's on *you* to make sure they agree
18:44:34 <monochrom> Yeah the rule is "go back to what terminals and typewriters actually do, tab expands to enough spaces for the next tabstop, rather than always a constant number of spaces".
18:45:08 <EvanR> ok, and that's why expand makes no sense
18:45:48 <tdammers> problem is that terminals and typewriters don't agree on where the next tabstop is
18:46:07 <monochrom> For the most part I'm OK with the wrong wording "tab is n spaces" whenever all participants knows it's an abbreviation for the correct but long wording.
18:46:08 vn36__ joins (~vn36@123.63.203.210)
18:46:16 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
18:46:55 <EvanR> is that "shortcut" language what is actually meant by the expand manual? xD
18:47:02 <monochrom> I mean, on other topics there are even worse wrong wordings to pick on, if you want to pick a fight.
18:47:07 <EvanR> or does it literally replace \t with n spaces
18:47:21 <geekosaur> EvanR, it at least used to mean that shortcut
18:47:30 <geekosaur> I haven't checked since the 1980s…
18:47:49 <darkling> tdammers: The last mechanical typewriter I used had settable tab stops, but they were true "move to the next tab column" tabs, not some fixed number of spaces.
18:48:06 <EvanR> oh yeah I remember that
18:48:11 <EvanR> tabstops were cool
18:48:15 <monochrom> I think "have tabs N characters apart" is close to the right wording, no?
18:48:28 rockystone joins (~rocky@user/rockymarine)
18:48:31 <tdammers> darkling: well yeah, and as long as the Tab key only drives the local, mechanically connected typing apparatus, it's fine. The trouble started when they started making teletypes.
18:48:52 <monochrom> I mean if you s/tabs/tabstops/ then it is unambiguously right.
18:49:20 <monochrom> And it is not literally "N spaces".
18:49:58 <EvanR> yeah, so the key mystery revealed was that tab is not a character but a location on the page
18:50:01 × wrengr quits (~wrengr@201.59.83.34.bc.googleusercontent.com) (Remote host closed the connection)
18:50:14 <EvanR> which contradicts everything everyone knows... about ASCII
18:50:14 codaraxis___ joins (~codaraxis@user/codaraxis)
18:50:38 ft joins (~ft@p3e9bc57b.dip0.t-ipconnect.de)
18:50:39 <darkling> And what does LF do? :)
18:51:11 <EvanR> carriage return obv
18:51:28 <EvanR> and CR moves the page up xD
18:51:36 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
18:51:39 <darkling> Hey, *I* was stirring with that spoon!
18:52:07 <monochrom> Well you need a wire format that accomodates both "actual data for humans" and "metadata/instructions for the machine".
18:52:13 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
18:52:34 <EvanR> that sounds like a bad sequel to the matrix
18:52:56 <darkling> ROFL
18:53:00 <monochrom> This is why tab and LF and etc are "control characters". Meaning, for the machine to move to locations, not for the ABC123 for humans.
18:53:04 × stef204 quits (~stef204@user/stef204) (Quit: WeeChat 3.7)
18:53:24 <darkling> It's just that they've undergone semantic drift in the lsat 50 years.
18:53:51 × codaraxis__ quits (~codaraxis@user/codaraxis) (Ping timeout: 252 seconds)
18:54:14 <monochrom> But then, once you have both in the same stream/wire, the same mentality as Lisp's "program and data can be unified" is the next logical conclusion slippery slope.
18:54:23 × Tuplanolla quits (~Tuplanoll@91-159-69-174.elisa-laajakaista.fi) (Ping timeout: 268 seconds)
18:55:05 wrengr joins (~wrengr@201.59.83.34.bc.googleusercontent.com)
18:56:06 <EvanR> ok so operational semantics. Category theory would be useless, nevermind
18:57:20 × cdimitroulas quits (~cdimitrou@17.232.83.98) (Quit: Connection closed)
18:58:02 raym joins (~aritra@user/raym)
18:59:02 <EvanR> I was reading that when ascii was being invented (some time in the 5th century?) there were other options like shift between text mode and control mode, but not shifting modes was the decision and the rest is history
19:00:21 <EvanR> imagine if plain text files had to shift modes xD (ok, now we have unicode)
19:01:24 freeside joins (~mengwong@103.252.202.193)
19:05:24 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
19:06:21 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds)
19:06:22 <geekosaur> uh, you do know about SI and SO?
19:06:43 <geekosaur> > ord '\SI'
19:06:44 <lambdabot> 15
19:07:35 <geekosaur> that said, earlier character sets used shift codes a lot more (BAUDOT, RADIX32, etc.)
19:08:48 Tuplanolla joins (~Tuplanoll@91-159-69-34.elisa-laajakaista.fi)
19:09:44 <EvanR> yeah, maybe it was that any control would be unavailable in text mode
19:10:15 <EvanR> the text would be out of control
19:10:40 <vn36__> hahaha
19:13:46 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
19:17:31 arcadewise joins (52968ed80d@2604:bf00:561:2000::3df)
19:19:15 <arcadewise> Hi! I'm trying to apply a function to a value i recieved from io, without having to do it on a seprate line, is there a way to do that? currently i get the value like this `s1 <- prompt "First sentence: "`, but ideally i could call `scntNum` on the result before i store it in `s1`
19:20:03 × Kaiepi quits (~Kaiepi@142.68.249.28) (Read error: Connection reset by peer)
19:20:07 <EvanR> fmap :: (a -> b) -> IO a -> IO b
19:20:16 <EvanR> IO post processor
19:20:27 Kaiepi joins (~Kaiepi@142.68.249.28)
19:21:08 <dminuoso> Also as its infix variant <$>
19:21:14 <EvanR> s1 <- fmap scntNum (prompt "First sentence: ")
19:21:15 <dminuoso> Or with flipped arguments <&>
19:21:15 <EvanR> or
19:21:26 <EvanR> s1 <- scntNum <$> prompt "First sentence: "
19:21:54 <arcadewise> thank you so much!
19:24:45 <EvanR> if foldr is a catamorphism, is there a fancy word for foldl or foldl'
19:25:02 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
19:25:07 <dminuoso> loop?
19:25:12 <dminuoso> :S
19:26:17 <dminuoso> But seriously, isnt foldl a catamorphism too?
19:26:24 <dminuoso> It's just a into a different algebra
19:30:47 <EvanR> :thonk:
19:31:42 × jpds quits (~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
19:32:46 jakalx joins (~jakalx@base.jakalx.net)
19:33:06 jpds joins (~jpds@gateway/tor-sasl/jpds)
19:33:22 zebrag joins (~chris@user/zebrag)
19:35:27 freeside joins (~mengwong@103.252.202.193)
19:36:09 <dminuoso> Okay so messing a lot with flatparse made me realize, that parsing UTF8 data is.. quite annoying . :S
19:38:06 × Kaiepi quits (~Kaiepi@142.68.249.28) (Remote host closed the connection)
19:38:41 Kaiepi joins (~Kaiepi@142.68.249.28)
19:39:43 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 250 seconds)
19:40:08 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds)
19:42:11 liz joins (~liz@cpc84585-newc17-2-0-cust60.16-2.cable.virginm.net)
19:43:36 × Kaiepi quits (~Kaiepi@142.68.249.28) (Ping timeout: 264 seconds)
19:45:57 TheCreatorOfCrea joins (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de)
19:49:35 × elbear quits (~lucian@188.24.138.239) (Ping timeout: 252 seconds)
19:49:46 <TheCreatorOfCrea> Hello. :) … I noticde that there a separate type syntax and even kind syntax in Haskell. I just read about GADT and data kinds and kind signatures and such, and it seems to approaches functionality duplication with “reqular” syntax. … I know there’s languages with more powerful type systems, so… Is there an alternative approach of just
19:49:47 <TheCreatorOfCrea> making type declarations in regular Haskell, so only one syntax is needed?
19:50:26 <dminuoso> TheCreatorOfCrea: Actually, the kind and type system has long been merged into a singular system.
19:50:32 pavonia joins (~user@user/siracusa)
19:50:41 × fserucas quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Ping timeout: 260 seconds)
19:51:01 <TheCreatorOfCrea> dminuoso: Hmm, that sounds great. Can you point me in the right direction for reading about it?
19:51:08 <EvanR> Maybe you are being tempted by Dependent Types, where kinds are just types, and values work as is at the type level
19:51:13 <geekosaur> look for TypeInType
19:51:20 <TheCreatorOfCrea> dminuoso: (I have no idea what to enter into the search engine for this.)
19:51:59 <geekosaur> also, you may be interested in https://en.wikipedia.org/wiki/%CE%A9mega
19:52:03 <dminuoso> TheCreatorOfCrea: The extension was called TypeInType, which over the course of the versions has become redundant.
19:52:14 <dminuoso> THat is, TypeInType is in effect whether you enable it or not.
19:52:22 <dminuoso> In short, `Type :: Type` holds.
19:52:29 <geekosaur> where every level works exactly the same way: value level, type level, kind level, sort level, and up infinitely
19:52:45 <dminuoso> Where `Type` is a more modern and better name for `*`
19:52:57 <EvanR> values work at the type level now?
19:53:20 <EvanR> or that still requires DataKinds
19:53:26 <c_wraith> no, that's the one set that wasn't collapsed.
19:53:36 <c_wraith> DataKinds doesn't give you arbitrary values, just constructors
19:53:39 <geekosaur> no, I was talking about Ωmega
19:53:46 <EvanR> oh
19:54:21 <TheCreatorOfCrea> dminuoso: Ok… does this allow you to define types as just regular functions, without the separate `::` syntax? Or does the `::` just allow you to write function-like syntax behind it. (I’m admittedly out of my depth here, so bear with my vague questions and just assume what you think makes the most sense. :)
19:54:42 <dminuoso> TheCreatorOfCrea: No, it just collapses everything above type into just types.
19:54:51 <geekosaur> haskell does not yet have dependent types, or type level functions, or other fancies
19:54:59 <dminuoso> TheCreatorOfCrea: before expressions had types, types had kinds, kinds had sorts, and above that everything was just an infinite singletons tack in haskell at least.
19:55:12 <TheCreatorOfCrea> dminuoso: Ah, so if I understan correctly, it does away with the kind syntax right?
19:55:26 <dminuoso> TheCreatorOfCrea: well the kind *syntax* was always the same as the type *syntax*
19:55:35 <dminuoso> TheCreatorOfCrea: what changes is that kinds and types are the same thing now.
19:55:51 <dminuoso> Or they exist in the same universe, rather.
19:56:30 <TheCreatorOfCrea> geekosaur: But it sounds like that is a goal, right? Because that would make me like the direction Haskell’s taking much more. :-) (Provided they manage to make it easy to actually use. :)
19:56:45 <geekosaur> that last is quite a sticking point though
19:56:59 <TheCreatorOfCrea> dminuoso: Sorts? wow. :D *takes step back*
19:57:11 <geekosaur> and iirc typechecking of general type level functions is undecidable
19:57:11 <EvanR> if haskell makes dependent types easy to use I'll eat my hat
19:57:28 <geekosaur> so you'd lose type inference and other nice things
19:57:30 <TheCreatorOfCrea> dminuoso: True, the syntax was the same. But yeah, that sounds really great.
19:57:31 <dolio> Instead of harder to use than normal?
19:57:38 <geekosaur> maybe it's just inference that's undecidable
19:57:45 <EvanR> exactly
19:58:04 <dminuoso> TheCreatorOfCrea: Well, in truth its actually very undesirable in general.
19:58:25 <TheCreatorOfCrea> geekosaur: about undecidability: Yeah, I thought there might be a conceptual hindrance like that there. :)
19:58:57 <geekosaur> and I'm not sure you can usefully infer dependent types either
19:58:58 <TheCreatorOfCrea> EvanR: Which type of had shall I serve you then, good sir? *opens fancy hat shop site*
19:59:08 <dminuoso> TheCreatorOfCrea: It violates logical consistencies in the type system, which would not happen if you have an infinite tower of types. But it turns out that Haskell already is inconsistent, so making that change doesnt make this worse.
19:59:26 <geekosaur> the whole point of them being providing proofs of things that can't otherwise be proven
20:00:55 <EvanR> when programming in idris, even though you can't freewheel put no type signatures anywhere, writing code haskell style with top level signatures often does work, with inference figuring out the rest of the function
20:01:21 <dminuoso> TheCreatorOfCrea: The expression for the alternative is a stratified universe (hierarchy), where you have an infinite tower of such universes. Agda is an example of a language that has this.
20:02:00 <TheCreatorOfCrea> dolio: I’m torn about “harder to use”. With time, I found that it only demands you actually make decisions that need to be made to obtain reliable yet fast code, which is what I like; but it was merely the way it was communicated, that was quite sub-optimal. So I think it’s like quantum physics: It’s easy once you can wrap your head
20:02:01 <TheCreatorOfCrea> around it. But it takes somebody to wrap his head around it first, before he can explain it to you at the Feyman “freshman level”. And we’re not really there yet. :)
20:02:17 <c_wraith> it's worth pointing out that inconsistent is not the same as unsafe. Inconsistency can be made safe by inserting runtime checks.
20:02:34 <EvanR> "quantum physics is easy once you get your head around it" --not feynmann
20:02:40 <c_wraith> and all the ways haskell is inconsistent does so. Sort of incidentally, but it works out!
20:03:00 <geekosaur> everyone keeps forgetting the "think really hard" part…
20:03:16 <c_wraith> On the other hand, Haskell has lots of unsafe functions that really are unsafe...
20:03:26 <dolio> I'm not saying dependent types are hard to use. I'm saying the things people do in GHC to fake them are much worse than using a language with dependent types.
20:03:31 <dminuoso> c_wraith: Heh, was about to say that GHC does not have runtime checks for infinite loops.. until I realized it does!
20:03:47 <geekosaur> only for the easy to detect ones
20:04:02 <EvanR> compile time checks for infinite loops would be better
20:04:07 <c_wraith> Well, and it never executes code that depends on the infinite loop!
20:04:08 <TheCreatorOfCrea> dminuoso: What did you refer to, when you said it was undesirable?
20:04:52 <dminuoso> TheCreatorOfCrea: See Girard's paradox
20:05:01 <c_wraith> like... (case (let x = x in x) of () -> "hello") - I'd argue this checks for an infinite loop, in some sense.
20:05:09 <dminuoso> You can roughly think of this as Russels paradox in the type system.
20:05:19 Kaiepi joins (~Kaiepi@142.68.249.28)
20:08:09 <TheCreatorOfCrea> EvanR: My thought too: As long as the compiler can tell me whether it cannot infer a type, and ask me to either provide or remove it, I’m fine with that. I’m no fan of implicitisms anyway. The many levels of implicit things you have to keep in mind is the biggest hindrance to using Haskell for me. (I’m the type who can’t stand the
20:08:10 <TheCreatorOfCrea> non-descriptive identifiers of mathematics though. To me they just look like deliberate obfuscation and gatekeeping. But I am willing to chalk that up to just different ways of thinking. )
20:08:45 <EvanR> the difference between math type inference and haskell type inference is that it's reliable when it works
20:09:15 <EvanR> it's not going to infer something totally wrong
20:09:34 <EvanR> the whole principal type thing
20:09:39 <c_wraith> I'd argue that non-meaningful identifiers are often more appropriate in Haskell than in math. It's common to write code in haskell that's so generic that there *is* no meaningful name for something.
20:10:04 <dminuoso> Monad being one such example :>
20:10:07 <TheCreatorOfCrea> c_wraith: about runtime checks: I’m using Haskell partially because it is able to move those checks to compile time though. :) But yeah, doing runtime checks it what Java does, AFAIK, and it’s not _that_ slow nowadays. I definitely prefer my life support machine to have runtime checks and be a little bit more expensive due to it. ;)
20:10:18 <c_wraith> is theFirstArgumentToThisFunction more meaningful than x?
20:10:55 freeside joins (~mengwong@103.252.202.193)
20:11:11 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
20:11:33 <EvanR> the main problem with runtime checks is when they finally happen...
20:11:47 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 250 seconds)
20:11:50 <c_wraith> I agree that it's reasonable to view type system inconsistencies as potential performance issues.
20:11:57 <dminuoso> EvanR: Be honest. When was the last time you used `evaluate`?
20:13:12 <EvanR> objection. relevance!
20:14:05 <EvanR> TheCreatorOfCrea, also, on invisible type inference, it's not invisible. You can always query ghci for the type of something
20:14:19 <TheCreatorOfCrea> c_wraith: Yes, you are right. In case of truly generic code, you cannot give the identifiers non-generic names. The trouble with that was, that in practice, for example, I hardly ever see the point of such generic things. E.g. yes, the concept of the monoid is nice. And I certainly wrote code that could implement the monoid class. But… why? All
20:14:19 <TheCreatorOfCrea> it gives me is that I can now use operators that obfuscate what my code does even more. :)
20:14:22 rockystone joins (~rocky@user/rockymarine)
20:14:59 <EvanR> abstraction is supposed to be for the opposite of obfuscation
20:15:11 <EvanR> to draw attention only to the important parts of what's going on
20:15:22 <EvanR> in the case of monoids, combining stuff
20:15:26 <c_wraith> what it gives you is the ability to use your type in places that abstract over all Monoid instances
20:15:32 <dminuoso> TheCreatorOfCrea: the main usefulness of many classes like monoid isnt as much using `(<>)` as opposed to say `(++)`, but its for when you write code that is *polymorphic* over any monoid, where the caller can decide what they want.
20:15:48 <TheCreatorOfCrea> dminuoso: At least `evaluate` is not the thing that it is in languages like JS. XD
20:15:58 <dminuoso> Or when you want to emphasize laws, such that you can on the spot use the laws to associate things around, or add a mempty in some spot.
20:16:37 × zer0bitz quits (~zer0bitz@2001:2003:f748:2000:3d5a:c60:7a1a:1513) (Read error: Connection reset by peer)
20:16:46 <c_wraith> :t M.alterF
20:16:47 <lambdabot> (Functor f, Ord k) => (Maybe a -> f (Maybe a)) -> k -> M.Map k a -> f (M.Map k a)
20:16:59 <TheCreatorOfCrea> EvanR: You have to query it though. BTW: Is there a code editor that just always shows this, without needing to press any shortcun even? Purely due to where the cursor currently is?
20:16:59 <EvanR> I should say proper abstraction, if your monoid generic code is really generic, it doesn't matter what monoid is used. Of course you see that messed up a lot in clojure, java, which always peeks around abstractions
20:17:29 <c_wraith> I love how powerful that function is. it can do about half the things Data.Map supports, based on your choice if Functor
20:17:29 vn36__ joins (~vn36@123.63.203.210)
20:17:58 <EvanR> I'm not the editor fu guy, sorry
20:18:22 <c_wraith> and there are a lot of cases where you can create a new Functor to add new functionality
20:18:52 <c_wraith> Monoid is a bit less general, but it's still really useful
20:19:09 <dminuoso> c_wraith: By the way, I recall from a previous discussion you mentioned (a,) as an interesting functor for alterF, and Ive begun to understand why.
20:19:13 <TheCreatorOfCrea> EvanR: Hmm, humans don’t do well with abstraction though. E.g. in 3D games you easily get lost if every wall texture is abstracted to look the same. It’s the same trap every novice coder falls in, to generalize everything until he ends up with a one super-generic thing like “evaluate”, that just takes a whole new language as its parameter
20:19:14 <TheCreatorOfCrea> again. ;)
20:19:25 <EvanR> see we're talking past each other again
20:19:31 talismanick joins (~talismani@96-67-197-217-static.hfc.comcastbusiness.net)
20:19:35 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 250 seconds)
20:19:43 <EvanR> I say abstraction is structure, you say abstraction is lack of structure
20:20:01 <c_wraith> dminuoso: ah, cool. I like returning a computed result and the updated map at the same time!
20:20:28 <EvanR> `eval' is a good example of the second kind
20:20:42 <TheCreatorOfCrea> dminuoso: Thanks for that point about monoids. It was useful to repeat that, and I agree. I’ll have to ponder it though, as it still feels uneasy. :)
20:21:33 <talismanick> if I define `f .> v = liftM2 f v`, what infix{r,l,} declaration makes do what I want in `(<>) .> fst (drop 1 . snd)`?
20:21:42 <EvanR> visualizations of structure is another topic though
20:22:09 <talismanick> (where the alternative was the working-but-ugly-looking `liftM2 (<>) fst (drop 1 . snd)`)
20:22:13 <dminuoso> TheCreatorOfCrea: That notion extends very well into monad, by the way. To a beginner, the term `Monad` is a red herring because it abstracts over something not necessarily relevant to the beginner themself, much like Monoid abstracts over say Integer addition.
20:22:29 <talismanick> makes .> do what I want*
20:22:31 <c_wraith> talismanick: it's the only infix operator in that expression. it doesn't matter.
20:23:01 <c_wraith> well. the only infix operator at that level
20:23:11 <talismanick> Then why is it giving me an error?
20:23:24 <c_wraith> we'd need more context to know.
20:23:32 <dminuoso> TheCreatorOfCrea: THere's a kind of symmetry in polymorphic things: When something has a `Monad` constraint it doesnt mean you have to know what Monad abstracts over to use it, it just means "As long as your type T has Monad T, you can use it at at that type". Its rather the author of that Monad polymorphic definition that has/wants to understand it.
20:23:48 <dminuoso> (Replace `Monad` with an arbitrary typeclass)
20:24:13 <TheCreatorOfCrea> EvanR: Ah, okay, if abstraction is structure by your definition, I’d agree. I implied abstraction is generalization to a more general pattern, as that was the definition I learned. But maybe those can be the same idea, if we simply think that there can be /many/ general patterns, which add structure again.
20:24:33 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Remote host closed the connection)
20:24:43 <dminuoso> The caller has the obligation/freedom to pick a particular type, but the implementor is writing over an unknown choice, so their implementation has to work with *any* possible type the user might choose. There is a kind of duality here.
20:24:55 <talismanick> nvm, fixed it
20:24:56 <EvanR> by melting away the unnecessary parts to leave the important structure, you could say that is a kind of generalization too
20:25:06 waleee joins (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
20:25:25 <EvanR> since it leaves the door open for other things to act as drop in replacements
20:25:41 <EvanR> different implementations, same interface
20:25:45 × jargon quits (~jargon@184.101.208.112) (Remote host closed the connection)
20:26:12 <EvanR> but eval, taking a string and "run it", leaves you with very little to go on
20:26:48 <EvanR> too much generalization if anything
20:26:54 <dminuoso> The two benefits of `Monad` is just avoiding needlessly naming things with the same shape `mapMaybe :: Maybe a -> (a -> Maybe b) -> Maybe b`, `concatMap :: [a] -> (a -> [b]) -> [b]`, `ioThen :: IO a -> (a -> IO b) -> IO b`, which I guess is just for convenience (remembering fewer names), and allowing folks to write generically over any such thing. The laws themselves are unrelated to the typeclass
20:26:56 <dminuoso> (as each individual such function already has these laws, whether a typeclass exists or not)
20:27:02 <dminuoso> (Or equivalently with monoid, or any other typeclass)
20:27:55 <TheCreatorOfCrea> dminuoso: I used to be at a level where I understood “A monad is just a monoid in the category of endofunctors! What’s the problem!” and it actually was easy to me! (Thanks to Bartosz Milewski’s YouTube series on category theory, which is really good.) But I forgot it all again. :( … But monads are a great example, because the main
20:27:55 <TheCreatorOfCrea> problem in that they are badly *explained*. E.g. what do we expect when we start our explanation by telling novices that it is considered a big riddle and hard to understand? It’s not. It’s just an interface for things with certain rules.
20:28:43 <dminuoso> TheCreatorOfCrea: The monad problem is as if you were introducing monoids to students in first class before talking about things like adding numbers. students get confused, dont know what you are talking about and why its a useful thing.
20:29:13 <EvanR> that's the worst explanation of a Monad ever xD
20:29:21 × wonko quits (~wjc@2a0e:1c80:2:0:45:15:19:130) (Ping timeout: 268 seconds)
20:29:41 <Rembane> EvanR: Challenge accepted! :D
20:29:51 <dminuoso> I think the single most important and best article on `Monad` is https://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/
20:30:03 <talismanick> Monoids aren't hard to explain if you can explain what a free group is (and substitute monoid for group)
20:30:07 chomwitt joins (~chomwitt@2a02:587:dc1e:5e00:e9e7:bb14:f272:9a4b)
20:30:15 <c_wraith> I've said it before and I'll say it again: I finally figured out what the heck is going on with Monad when I started learning Parsec and was like "wait, do notation just works!"
20:30:15 rockystone joins (~rocky@user/rockymarine)
20:30:26 <talismanick> then, "endofunctor" just means m(m a) = m a, but you also can't pull a back out
20:30:28 <Rembane> talismanick: What's a free group?
20:30:39 <dminuoso> @remember talismanick Monoids aren't hard to explain if you can explain what a free group is (and substitute monoid for group)
20:30:39 <lambdabot> Done.
20:31:06 <talismanick> Rembane: so, you could build the integers using {1} and adding/subtracting repeatedly
20:31:30 <talismanick> if you have some set, the free group is the smallest part which you can build the rest of it out of
20:31:33 <Rembane> talismanick: All integers? Not only positive ones?
20:31:44 <talismanick> Rembane: that's for free groups :)
20:31:51 <EvanR> it's a group so you can do -1
20:31:53 <talismanick> group = monoid + invertibility
20:32:21 <Rembane> talismanick: Cool, uh... I don't get it. Are the integers a free group?
20:32:21 <TheCreatorOfCrea> dminuoso: I would not say it’s needless, because it is imo extremely hard what that generic implementation *is* that the author of a monad actually chose. E.g. for lists, there are clearly several choices. That insight gets lost when you use the monad. Which, to me, is about as problematic as dynamic languages’ implicit casting. (E.g.
20:32:22 <TheCreatorOfCrea> JavaScript’s nightmares. ;)
20:32:37 <dminuoso> Rembane: That's also quite easily explained: First you must understand that a free functor is just left adjoint to a forgetful functor
20:32:41 <talismanick> {1}, together with + (and its minus) is the free group over the integers
20:33:02 <talismanick> a group is a set with some operator which takes 2 elements of that set and returns another element
20:33:14 <Rembane> talismanick: That funny {1}, is that the set consisting of the number one?
20:33:19 <talismanick> yep!
20:33:29 <talismanick> because, 4 = 1 + 1 + 1 + 1
20:33:31 <EvanR> I like how this exposition of free groups is going in reverse from the most abstract back to what a group even is
20:33:32 <Rembane> Cool, I thought it was some reference to something else at first.
20:33:44 <Rembane> dminuoso: :D
20:33:45 <Franciman> talismanick: wait i thought the free group over the integers was (Z, +)
20:33:57 <TheCreatorOfCrea> dminuoso: Also, I found it very hard to actually realize that my code is just an attempt at re-implementing that monad and I could clarify my code by using the monad. Specifically because it’s so hard to tell what implementation was chosen.
20:34:09 <talismanick> wait, shoot, you're right
20:34:19 <talismanick> haven't done abstract algebra in years :D
20:34:29 <dminuoso> Rembane: As a very simple starter, we can imagine lists to be a free monoid.
20:34:36 <c_wraith> Franciman: notational difference. 1 is a generator, and there are group notations where you list the generators.
20:34:39 <dminuoso> (or free monoidS)
20:34:45 <Franciman> ah ok cool
20:34:48 <EvanR> you can call Z with + and negate a group, now what about free group
20:34:52 <Franciman> i used <1> for that
20:34:54 <Franciman> now it makes sense
20:35:03 <dminuoso> Rembane: Very roughly the idea is that a free something is the simplest something, that satisfies all the laws of something, without any extra baggage.
20:35:13 <talismanick> but, yea, if you're given {'a','b'} with the concatenation operator, that's the free group over {'ab', 'aaaba', 'ababa', ...}
20:35:17 <talismanick> free monoid, I mean
20:35:21 <talismanick> because you don't have an inverse
20:35:24 <Rembane> dminuoso: Cool, a minimum working example. *handwaves*
20:35:29 <TheCreatorOfCrea> dminuoso: Yes. somehow, monoids and such were trivial to me though. Just an operator and a unit element. Like + and 0, or * and 1.
20:35:51 <EvanR> the concatenation is what you get when ask for the free monoid over that set
20:35:57 <TheCreatorOfCrea> dminuoso: I literally read that exact article! :D
20:36:02 <EvanR> you don't have to start with it
20:36:05 <talismanick> so, a monad is a monoid (maps back to itself under some operation), which maps back to itself
20:36:15 <dminuoso> Rembane: and in that sense, a list encapsulates bare monoidal structure, where [A, B] can be imagined as the monoidal combination of A and B.. but without talking what that monoidal combination really is.
20:36:19 <dminuoso> It's just the general shape.
20:36:26 <talismanick> so you can sequence them and get back a single one, but it's also a black hole, typewise
20:36:32 <dminuoso> And you can build things along that monoidal shape, but without actually picking an actual monoid (extra baggage)
20:36:50 <talismanick> what goes in doesn't come back out, because its only functors... are back into itself! they're endo-functors
20:37:08 <EvanR> I'm lost
20:37:11 <TheCreatorOfCrea> talismanick: What I saw: “just means [meaningless letters, maybe a call to mama]” 🤣
20:37:12 <talismanick> (endo is Greek for "into", "inside")
20:38:52 <talismanick> TheCreatorOfCrea: so, if you have a monad over a type, "m a", your operations include binding one wrapped value to another (>>=) and wrapping a value in "m" (return), but you aren't given any method to pull a value out
20:38:59 <dminuoso> Rembane: And similarly, free monads work the same way. You just use an algebraic datatype to build up the monad shape computation `data Free f a = Pure a | Roll (f (Free f a))` (you can think `Roll` as just a delayed `join` that we can execute once we commit to some particular `f`). You just capture the raw monad shape, without any extra baggage. Do you see the pattern here?
20:39:10 <talismanick> so, all of its maps which would otherwise go to another type, go back to itself
20:39:17 <dminuoso> (this is very handwavy, but I think its more usable from a programmer point of view this way)
20:39:18 <talismanick> once a value is inside, it's stuck there
20:39:29 <EvanR> so you're saying monads are like burritos
20:39:54 <talismanick> sure, if burritos destroyed information like black holes
20:39:54 <Rembane> dminuoso: I see the pattern. Somehow it's easier to see it in the free monad than in the free monoid. Most probably because I've actually used the free monad for implementing stuff.
20:40:05 <EvanR> monads are like black holes
20:40:09 <TheCreatorOfCrea> talismanick: The “maps back” explanation is actually a pretty good one, yeah. It partially reminds me of how I had understood it, when it was still fresh. But, the “return” adds one more thing to it, no?
20:40:10 <EvanR> that is a new one
20:40:14 <talismanick> I microwave my burritos with Hawking radiation
20:40:20 <dminuoso> Rembane: Imagine the `,` in the list to be the delayed mappend.
20:40:49 <dminuoso> with foldMap you can commit to a particular monoid choice
20:41:04 <talismanick> TheCreatorOfCrea: so, the signature is return :: a -> m a
20:41:11 <Rembane> dminuoso: Oh, cool. This is good stuff.
20:41:46 <talismanick> so, if you have some sequence of operations (inside the monad), return means "I'm done, you can stop here and wherever I'm at is the single opaque return value"
20:42:14 <dminuoso> Rembane: and lack of any associative structure in the list can be thought of proof of associativity embedded.
20:42:29 <EvanR> terms in a free monoid over a set are like the stem cells, you can replace the <>'s to get the behavior of any other monoid
20:42:42 <dminuoso> that is [a,b,c] makes no comment about whether ((a,b),c) or (a,(b,c)) so to speak
20:42:45 <EvanR> specialize into terms in any other monoid
20:42:47 <dminuoso> its just.. the same.
20:43:01 <talismanick> if you have readMyList :: IO [Int], you can read your list of Ints from the user and return that list, so you can `xs <- readMyList` inside main :: IO ()
20:43:22 <talismanick> return is what allows you to write with certainty that m ( m a ) == m a
20:43:31 <Rembane> dminuoso: That makes sense. The foldr-diagram of the Haskell Wiki is flashing in my brain, but that might be something else.
20:43:36 <dminuoso> Rembane: though I guess this doesnt really hold true if you look closer. but we do accept (++) to satisfy associativty
20:43:49 <talismanick> because it lets the inner one finish its work and cleanly merge back into the outer monadic context
20:43:57 <dminuoso> So there's this cool notion edward once brought up somewhere, where he argued that we could define list also as:
20:44:13 <dminuoso> newtype List a = List (forall b. Monoid b => (a -> b) -> b)
20:44:40 <TheCreatorOfCrea> talismanick: Well, you can always pull the value out, by “running” the monad. (Which btw is a really confusing name for that operation, because it only makes sense for IO.) The only monad where you can’t do that in Haskell is the IO monad, no? (Unless GHC allows you to `unsafeInvokeElterGods :: IO a -> (RealWorld, a)` :D
20:45:26 <EvanR> not all monads have run
20:45:29 <dminuoso> This also follows from the fact that Foldable itself is fully characterstic for something being list-like, and yet you can define it in terms of `foldr` *OR* `foldMap`
20:45:37 <EvanR> all comonads have extract
20:45:57 <talismanick> I remember once reading a suggestion to reimagine IO as a comonad
20:46:00 <talismanick> IIRC
20:46:01 nate1 joins (~nate@98.45.169.16)
20:46:23 <talismanick> flew over my head at the time, but I might understand it better now
20:47:39 <geekosaur> TheCreatorOfCrea, there is unsafePerformIO. and worse ones
20:48:29 <EvanR> IO a -> (RealWorld, a) looks bad
20:49:12 <[exa]> that's way beyond unsafe* prefixes
20:49:17 TheCreatorOfCrea has `fold*` flashbacks. … I *never* remember which one goes into which direction. All explanations I ever saw still stay ambiguous, since “*r” and “*l” could still mean either way, depending on which way you mean “right” and “left”.
20:49:29 <dminuoso> TheCreatorOfCrea: both go the same direcftion./
20:49:33 <geekosaur> ^
20:49:42 <geekosaur> they *associate* in different directions
20:49:45 <dminuoso> TheCreatorOfCrea: the difference between foldr and foldl is in association.
20:49:55 <dminuoso> its similar to say infixr vs infixl
20:49:55 Guest|32 joins (~Guest|32@dyn1174-208.insecure.ic.ac.uk)
20:50:07 × Guest|32 quits (~Guest|32@dyn1174-208.insecure.ic.ac.uk) (Client Quit)
20:50:37 <dminuoso> foldr replaces (:) with a function, associating towards the right
20:50:40 <dminuoso> foldl replaces (:) with a function, associating towards the left
20:51:33 × nate1 quits (~nate@98.45.169.16) (Ping timeout: 268 seconds)
20:51:38 <talismanick> I wish there was a Zip class in Prelude so I could zipWith-apply an n-tuple of functions to an n-tuple of values
20:51:45 <Rembane> It just struck me. There's no such thing as a foldmiddle, right?
20:51:45 × littlefinger quits (~littlefin@pool-74-102-98-242.nwrknj.fios.verizon.net) (Ping timeout: 244 seconds)
20:52:02 <dminuoso> TheCreatorOfCrea: https://upload.wikimedia.org/wikipedia/commons/3/3e/Right-fold-transformation.png https://upload.wikimedia.org/wikipedia/commons/5/5a/Left-fold-transformation.png
20:52:17 <dminuoso> See that, from left to right, the order of the numbers is the same?
20:52:19 <geekosaur> how do you associate a binary operation to the middle?
20:52:37 <TheCreatorOfCrea> geekosaur: I know. I had to use it once. (I used it somewhere, where I could know that it was safe, but the compiler couldn’t know so it was OK. Had to do with implementing dynamically loaded instances of a class, to allow for plugins. But I found better ways to do the same thing now.)
20:53:04 <Rembane> geekosaur: Like a binary tree perhaps?
20:53:20 <dminuoso> Mmm well on the grammatical level we have `infix` as an equivalent.
20:53:33 <dminuoso> A binary tree seems to be the shape here yes
20:53:44 <dminuoso> But it begs the question of balancing
20:54:13 <monochrom> For tree structures and most ADTs, perhaps you would like catamorphisms.
20:55:15 <darkling> I keep reading that word as "cacomorphisms". :/
20:55:36 <dminuoso> a comorphism!
20:55:42 <dminuoso> But what does ca mean
20:55:44 <EvanR> TheCreatorOfCrea, don't remember foldr foldl, rederive it
20:55:45 <monochrom> On Halloween, you will also hear me bring up pumpkin catmorphisms >:)
20:55:48 <TheCreatorOfCrea> EvanR: Wouldn’t `virtualMachine :: RealWorld -> IO a -> (RealWorld, a)` make sense though? ^^ Provided one could actually define “RealWorld”. (Maybe merely as `IO b`, so one can drop it into an outer IO monad, after processing it in some way that implements the VM?)
20:55:57 <dminuoso> TheCreatorOfCrea: that exists.
20:56:09 <dminuoso> Flip it around, and you have it
20:56:09 <talismanick> it means a morphism which you shotgun in hell while heavy metal blares
20:56:12 <dminuoso> https://hackage.haskell.org/package/base-4.17.0.0/docs/GHC-Base.html#v:unIO
20:56:14 <dminuoso> unIO :: IO a -> State# RealWorld -> (# State# RealWorld, a #)
20:56:30 <monochrom> Preview: https://www.vex.net/~trebla/photo/unorganized/pumpkin-catmorphism.jpg
20:56:47 <darkling> Scary.
20:56:57 <dminuoso> TheCreatorOfCrea: and it turns out, making a real world is possible too: https://hackage.haskell.org/package/base-4.17.0.0/docs/GHC-Exts.html#v:realWorld-35-
20:57:17 <dminuoso> If you combine these two, you have accursedUnutterablePerformIO which will elide all your mutable buffers or worse.
20:57:20 <TheCreatorOfCrea> dminuoso: Ok, that was actually helpful. :) Now I can blame my lack of understanding on having trouble remembering which direction “associates towards *” means. ;)
20:58:12 <geekosaur> that's easy though. (a * b) * c vs. a * (b * c) for some operator *
20:58:21 <dminuoso> TheCreatorOfCrea: Though I think picturing it horizontally is even better: (((z `f` 1) `f` 2) `f` 3) vs (1 `f` (2 `f` (3 `f` z)))
20:59:06 <TheCreatorOfCrea> talismanick: Isn’t the whole point of tuples that you cannot treat their elements the same? … But I think such functions exist though, for basic levels, no? … In any case, this sounds more like a list without the monomorphism restriction.
20:59:06 × Vajb quits (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57) (Read error: Connection reset by peer)
20:59:14 Vajb joins (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi)
20:59:34 <dminuoso> In effect the former is more like a loop (especially if `f` is strict in its first argument, or that strictness is forced inside the foldl'ing), because it readily computes answers, whereas foldr rather constructs structure.
20:59:48 <dminuoso> So its really not about direction, they are for different things.
21:00:16 <talismanick> TheCreatorOfCrea: yeah, but just the case of `apply :: (a->a1,b->b1,...) -> (a,b,...) -> (a1,b1,....)
21:00:43 <talismanick> err, zipApply
21:01:13 darkstardevx joins (~darkstard@50.126.124.156)
21:01:22 <TheCreatorOfCrea> Rembane: Now you made me think of audio filters. high pass (foldr), low pass (foldl), band pass (foldmiddle), and notch filder (foldouter), plus a merely phase-inverting filter (folddual?). ;)
21:02:31 × Vajb quits (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer)
21:02:35 <TheCreatorOfCrea> dminuoso: Those images you linked to are *exactly* what /causes/ my confusion. Thank you for trying to help, but this is a bug in my own mind that I need to fix myself first. ;)
21:02:51 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
21:03:09 × darkstardevx quits (~darkstard@50.126.124.156) (Remote host closed the connection)
21:03:14 Vajb joins (~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57)
21:03:28 <TheCreatorOfCrea> dminuoso: Thank you in general, too. It is always a joy to come here… and leave inspired. :)
21:03:33 darkstardevx joins (~darkstard@50.126.124.156)
21:05:20 <Rembane> TheCreatorOfCrea: Muaha! :D
21:06:50 <TheCreatorOfCrea> dminuoso: `unIO` => 😳
21:08:12 × johnjaye quits (~pi@173.209.64.74) (Ping timeout: 268 seconds)
21:08:41 <TheCreatorOfCrea> dminuoso: `import GHC.Magic; main = youShallNotPass -- cause it is unsafe`
21:09:02 <dminuoso> TheCreatorOfCrea: Let me emphasize: these two primitives are absurdly unsafe.
21:09:28 <dminuoso> In combination.
21:09:33 <TheCreatorOfCrea> dminuoso: WTF, `accursedUnutterablePerformIO` is an actual function!!
21:09:36 <dminuoso> Yes.
21:09:43 <dminuoso> Take one guess why it was renamed that way.
21:10:03 johnjaye joins (~pi@173.209.64.74)
21:10:23 <dminuoso> Imagine you pry open an IO with that, and you have two IO actions both of which internally do `malloc 4096`. Take one guess what the optimizer will do here.
21:10:34 × darkstardevx quits (~darkstard@50.126.124.156) (Remote host closed the connection)
21:10:55 darkstardevx joins (~darkstard@50.126.124.156)
21:12:58 <TheCreatorOfCrea> dminuoso: foldl being more like a loop, and foldr constructing structure finally seems to have made it stick for me. Amazin. Let’s see if I remember it the next time. :)
21:13:19 <dminuoso> TheCreatorOfCrea: note that foldl' should be better used in most cases when you want a loop
21:13:29 <dminuoso> otherwise you will accumulate thunks for every round.
21:13:36 × titibandit quits (~titibandi@xdsl-78-34-208-230.nc.de) (Remote host closed the connection)
21:14:12 <TheCreatorOfCrea> dminuoso: No need to take a guess. I instantly hoogled it, and the documentation speaks for itself. :D
21:14:42 <geekosaur> the linked bug reports are quite instructive
21:14:52 <TheCreatorOfCrea> dminuoso: I will definitely use it, just because I like to summon elder gods and watch the world burn. ;) (At least the virtual one that goes away after I reset my computer.)
21:15:08 wonko joins (~wjc@2a0e:1c80:2:0:45:15:19:130)
21:15:11 × gnyeki quits (~gnyeki@user/gnyeki) (Quit: leaving)
21:15:14 <dminuoso> TheCreatorOfCrea: yeah its fun. you now have mutable buffer, and if later IO actions come to free them, you might double-free that too. or maybe they get elided, free occurs, but the other side keeps using free'd memory!
21:15:27 <dminuoso> TheCreatorOfCrea: all kinds of memory corruption and bugs.
21:15:29 <dminuoso> :>
21:15:36 <geekosaur> (I winced when I read the descriptions; I could already see what was coming. But I suspect I'm a bit more familiar with this than the ByteString devs were back then)
21:15:36 <TheCreatorOfCrea> dminuoso: I know about `foldl'`. :)
21:16:17 <geekosaur> aliased buffers because ghc hoists the common allocation out of the loop
21:16:23 <geekosaur> fun stuff like that
21:16:53 TheCreatorOfCrea needs MOAR Tardis monad in there! :D
21:17:13 <geekosaur> (just remember the Tardis monad is slow)
21:17:34 × `2jt quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 268 seconds)
21:17:36 × vn36__ quits (~vn36@123.63.203.210) (Ping timeout: 260 seconds)
21:19:29 <TheCreatorOfCrea> geekosaur: I plan to relocate next to a black hole anyway, so no problem. ;)
21:19:47 × rockystone quits (~rocky@user/rockymarine) (Ping timeout: 252 seconds)
21:19:59 <dminuoso> I think you will find out that plan wont work out so well.
21:20:33 × michalz quits (~michalz@185.246.207.200) (Remote host closed the connection)
21:23:35 <TheCreatorOfCrea> dminuoso: If you stay at the right distance, actually it does. :D
21:24:38 <dminuoso> Just be sure to pick one without an accretion disk
21:25:00 <dminuoso> (Best to check before you fly there)
21:25:03 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74)
21:25:30 <geekosaur> still not the greatest of ideas, depending on distance. see Niven's "Neutron Star"
21:27:48 <TheCreatorOfCrea> geekosaur: I’m more of a Saggitarius A* kinda guy. :P
21:28:15 <geekosaur> same tidal effects only more so
21:28:18 <dminuoso> SagA* has a massive accretion disk
21:28:29 <dminuoso> You will have some serious thermal and radiation problems.
21:28:44 <geekosaur> you do not want tidal effects between your head and your feet
21:28:59 <dminuoso> geekosaur: the shear depends on how close to the event horizon you are though
21:29:13 <geekosaur> that's why I said "depending on distance"
21:29:16 <dminuoso> RIght.
21:29:26 <dminuoso> So first we have to establish how expensive TheCreatorOfCrea's tardis computation is
21:29:31 <dminuoso> And how much time he wants to skip
21:29:51 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:253c:9364:4f2a:ce74) (Ping timeout: 260 seconds)
21:30:03 <TheCreatorOfCrea> geekosaur: Actually, the bigger the hole, the more gradual the tidal effects. If the hole is big enough, you will not even notice you went past the horizon unless you got a window. Your space will have become ”time-like” though. ^^
21:30:26 <dminuoso> Then we just apply the lorentz transformation, figure out ideal orbit, predict radiation/thermal problems
21:30:40 <dminuoso> calculate necessary fuel for escape velocity
21:31:30 <dminuoso> I dont think its well agreed upon what you would observe when crossing the event horizon
21:31:35 <geekosaur> ^
21:31:42 abiss27 joins (~abiss27@190.213.236.106)
21:32:03 <geekosaur> hell, there are still hypotheses that the universe itself is contained within a massive event horizon
21:32:05 <TheCreatorOfCrea> dminuoso: “It’s almost TOO easy!” -- Garth ;)
21:32:47 <TheCreatorOfCrea> geekosaur: Yes, and like the big bang, the lack of testability makes it merely yet another creation myth. ^^
21:32:56 <geekosaur> yep
21:32:58 TheCreatorOfCrea ducks. ;)
21:33:44 TheCreatorOfCrea ’s porn is existentialism.
21:33:52 L29Ah parts (~L29Ah@wikipedia/L29Ah) ()
21:34:28 × TheCreatorOfCrea quits (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de) (Quit: Client closed)
21:34:32 L29Ah joins (~L29Ah@wikipedia/L29Ah)
21:34:41 TheCreatorOfCrea joins (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de)
21:34:49 rockystone joins (~rocky@user/rockymarine)
21:35:05 vn36_ joins (~vn36@123.63.203.210)
21:35:10 × chomwitt quits (~chomwitt@2a02:587:dc1e:5e00:e9e7:bb14:f272:9a4b) (Remote host closed the connection)
21:35:32 × TheCreatorOfCrea quits (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de) (Client Quit)
21:35:41 TheCreatorOfCrea joins (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de)
21:36:46 iphy_ is now known as iphy
21:37:48 <TheCreatorOfCrea> What’s the difference between Vector and MArray, btw? They seem to both be mutable arrays…
21:38:37 <TheCreatorOfCrea> (Ok, MArray seems to be indexed by a definable index, so I guess I already answered my own question.)
21:38:57 stackdroid18 joins (14094@user/stackdroid)
21:39:37 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
21:39:57 <EvanR> there's what's the difference between Vector and Array, and MVector / MArray
21:40:04 <EvanR> mutability isn't it, since both has both versions
21:40:43 <EvanR> Array uses an index type, Vector uses Int (and has more API)
21:44:16 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
21:44:17 × adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
21:44:18 jmdaemon joins (~jmdaemon@user/jmdaemon)
21:44:21 × johnjaye quits (~pi@173.209.64.74) (Ping timeout: 252 seconds)
21:44:55 <TheCreatorOfCrea> EvanR: Ah, OK, that completes the picture.
21:45:01 adanwan joins (~adanwan@gateway/tor-sasl/adanwan)
21:45:18 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
21:51:11 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
21:51:42 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
21:52:19 ddellacosta joins (~ddellacos@86.106.143.65)
21:56:41 × abiss27 quits (~abiss27@190.213.236.106) (Ping timeout: 260 seconds)
21:58:09 × ddellacosta quits (~ddellacos@86.106.143.65) (Ping timeout: 268 seconds)
22:10:44 ph88 joins (~ph88@tmo-085-129.customers.d1-online.com)
22:11:23 × TheCreatorOfCrea quits (~TheCreato@2a0a-a546-c344-1-e0bc-1e36-315c-295b.ipv6dyn.netcologne.de) (Quit: Client closed)
22:11:48 × vglfr quits (~vglfr@145.224.100.100) (Ping timeout: 264 seconds)
22:12:20 vglfr joins (~vglfr@145.224.100.100)
22:13:04 Feuermagier joins (~Feuermagi@user/feuermagier)
22:14:00 × zeenk quits (~zeenk@2a02:2f04:a311:7000:aa5:d3dd:854f:9922) (Quit: Konversation terminated!)
22:15:25 × gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
22:16:38 × talismanick quits (~talismani@96-67-197-217-static.hfc.comcastbusiness.net) (Remote host closed the connection)
22:19:14 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
22:21:24 × zkSNOOP quits (~username@ptr-21zvp7p1ecvdx6mr7hf.18120a2.ip6.access.telenet.be) ()
22:31:39 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 252 seconds)
22:37:31 × wonko quits (~wjc@2a0e:1c80:2:0:45:15:19:130) (Ping timeout: 260 seconds)
22:37:53 × jumper149 quits (~jumper149@base.felixspringer.xyz) (Quit: WeeChat 3.6)
22:40:00 × vglfr quits (~vglfr@145.224.100.100) (Ping timeout: 264 seconds)
22:43:53 × jbayardo quits (~jbayardo@20.83.116.49) (Read error: Connection reset by peer)
22:44:12 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
22:47:31 × acidjnk quits (~acidjnk@p200300d6e7137a21d59bab4b536388a8.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
22:47:43 jbayardo joins (~jbayardo@20.83.116.49)
22:52:17 × Tuplanolla quits (~Tuplanoll@91-159-69-34.elisa-laajakaista.fi) (Quit: Leaving.)
22:53:59 × Topsi quits (~Topsi@dyndsl-095-033-095-014.ewe-ip-backbone.de) (Read error: Connection reset by peer)
22:59:28 wonko joins (~wjc@2a0e:1c80:2:0:45:15:19:130)
22:59:58 dimsuz joins (~dima@185.17.128.139)
23:00:53 <dimsuz> hi! I'm trying to use filepath library, added it to the cabal file, then added 'import System.OsPath' and ghc says it couldn't find such module.
23:01:02 <dimsuz> I must have missed something obvious
23:01:09 freeside joins (~mengwong@103.252.202.193)
23:02:52 <geekosaur> are you using the right version? older versions only provide System.Filepath; System.OsPath is only in the latest version
23:02:57 <dimsuz> oh. found the suggestion to use a higher-level library in the README. Will do that, but still curious why won't it import this one
23:03:46 <dimsuz> geekosaur: I've just added 'filepath' to my cabal file without a strict verision bounds. Perhaps this is the cause then!
23:03:54 <geekosaur> in particular it's not included with ghc 9.2.x apparently
23:04:04 <dimsuz> yep, I'm on 9.2 atm
23:04:35 <geekosaur> then you have filepath 1.4.2.2
23:04:49 <geekosaur> you would have to specify you want filepath 1.4.100.0
23:05:51 <dimsuz> I see, thank you! Will go for `path` for now :)
23:06:06 × freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds)
23:09:27 × vn36_ quits (~vn36@123.63.203.210) (Ping timeout: 250 seconds)
23:19:26 freeside joins (~mengwong@103.252.202.193)
23:27:09 vn36_ joins (~vn36@123.63.203.210)
23:39:56 × ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 260 seconds)
23:39:57 Volt_ joins (~Volt_@c-73-167-119-209.hsd1.ma.comcast.net)
23:42:09 vglfr joins (~vglfr@145.224.100.100)
23:42:36 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
23:46:17 off^ joins (~off@c-76-17-6-165.hsd1.ga.comcast.net)
23:54:47 jargon joins (~jargon@184.101.208.112)
23:55:05 <EvanR> parsing statements using this grammar literally works but doesn't seem to produce the logical structure I admittedly made up after years of writing C https://paste.tomsmeding.com/8LrwBK4W
23:55:36 <EvanR> case is followed by 1 statement, in a switch there's probably multiple statements but it's grouped as a compound
23:56:12 <EvanR> but that's the official grammar from historical document
23:56:31 <EvanR> I wonder if there's a better grammar
23:56:40 <geekosaur> think duff's device 🙂

All times are in UTC on 2022-10-17.