2022/01/18

2022-01-18 00:01:39 +0100alx741(~alx741@157.100.93.160)
2022-01-18 00:05:09 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 00:11:21 +0100jkaye(~jkaye@2601:281:8300:7530:443b:68a:5f3e:dbe3)
2022-01-18 00:11:36 +0100DNH(~DNH@2a02:8108:1100:16d8:6155:4b1c:4cef:c11c)
2022-01-18 00:11:40 +0100chomwitt(~chomwitt@2a02:587:dc0b:200:12c3:7bff:fe6d:d374) (Remote host closed the connection)
2022-01-18 00:15:26 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd) (Remote host closed the connection)
2022-01-18 00:15:44 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd)
2022-01-18 00:18:34 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-01-18 00:19:43 +0100Inst(~delicacie@c-98-208-218-119.hsd1.fl.comcast.net) (Ping timeout: 256 seconds)
2022-01-18 00:20:02 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 240 seconds)
2022-01-18 00:20:12 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-01-18 00:22:40 +0100__monty__(~toonn@user/toonn) (Quit: leaving)
2022-01-18 00:23:16 +0100alx741(~alx741@157.100.93.160)
2022-01-18 00:23:37 +0100jkaye(~jkaye@2601:281:8300:7530:443b:68a:5f3e:dbe3) (Ping timeout: 240 seconds)
2022-01-18 00:24:47 +0100mmhat(~mmh@55d4d096.access.ecotel.net) (Quit: WeeChat 3.4)
2022-01-18 00:26:46 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 00:26:54 +0100ksqsf(~user@134.209.106.31)
2022-01-18 00:28:40 +0100burnsidesLlama(~burnsides@dhcp168-045.wadham.ox.ac.uk) (Remote host closed the connection)
2022-01-18 00:28:45 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 00:28:45 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 00:28:45 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 00:32:11 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 00:33:02 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 240 seconds)
2022-01-18 00:34:09 +0100jgeerds(~jgeerds@55d4090e.access.ecotel.net)
2022-01-18 00:34:26 +0100cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Ping timeout: 250 seconds)
2022-01-18 00:34:50 +0100geekosaur(~geekosaur@xmonad/geekosaur) (Quit: Leaving)
2022-01-18 00:35:59 +0100geekosaur(~geekosaur@xmonad/geekosaur)
2022-01-18 00:37:57 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 00:43:17 +0100alx741(~alx741@157.100.93.160)
2022-01-18 00:43:46 +0100Tuplanolla(~Tuplanoll@91-159-68-166.elisa-laajakaista.fi) (Quit: Leaving.)
2022-01-18 00:46:42 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 00:48:56 +0100burnsidesLlama(~burnsides@dhcp168-045.wadham.ox.ac.uk)
2022-01-18 00:49:02 +0100machinedgod(~machinedg@24.105.81.50) (Ping timeout: 240 seconds)
2022-01-18 00:51:39 +0100 <Axman6> Is there a name in lens for the function which takes Traversal s t a b, (a -> m b) and s and gives back m t? I know it's just `traversal func s` but it feels weird using it's sort of hidden structure
2022-01-18 00:52:13 +0100 <Axman6> @hoogle Traversal s t a b -> (a -> m b) -> s -> m t -- probably should've done this first
2022-01-18 00:52:13 +0100 <lambdabot> No results found
2022-01-18 00:52:17 +0100 <dibblego> id
2022-01-18 00:54:05 +0100 <Axman6> just wondering if it has a more... semantic? name
2022-01-18 00:54:39 +0100 <Axman6> looks like traverseOf
2022-01-18 00:54:53 +0100 <Axman6> traverseOf :: LensLike f s t a b -> (a -> f b) -> s -> f t
2022-01-18 00:54:53 +0100 <Axman6> traverseOf = id
2022-01-18 00:56:55 +0100waleee(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4)
2022-01-18 00:58:49 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-01-18 00:58:58 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-01-18 00:59:07 +0100max22-(~maxime@2a01cb088335980081b93665fb35a9cb.ipv6.abo.wanadoo.fr) (Remote host closed the connection)
2022-01-18 01:02:04 +0100DNH(~DNH@2a02:8108:1100:16d8:6155:4b1c:4cef:c11c) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-01-18 01:02:17 +0100n3rdy1(~n3rdy1@2600:1700:4570:3480:1b88:50f:dae0:9293) (Ping timeout: 240 seconds)
2022-01-18 01:03:19 +0100alx741(~alx741@157.100.93.160)
2022-01-18 01:06:53 +0100Shiranai(~Shiranai@190.237.13.17)
2022-01-18 01:07:11 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 01:07:55 +0100 <Axman6> it is also (%%~)
2022-01-18 01:09:07 +0100 <Shiranai> Hello, I want to compute the list of differences of a Int list, i.e. `difs [1,3,6] == [2,4]`. I can do this by pattern matching but I'm wondering if there is some way to do if by using folds or maps
2022-01-18 01:09:37 +0100 <c_wraith> Shiranai: it's typical to do it with a zip
2022-01-18 01:09:41 +0100 <monochrom> Does it mean difs [a,b,c,d] = [b-a, c-b, d-c]?
2022-01-18 01:09:53 +0100 <jackdk> monochrom: no d-c
2022-01-18 01:09:56 +0100 <Shiranai> monochrom yes
2022-01-18 01:10:03 +0100 <jackdk> Shiranai: what is `difs []`?
2022-01-18 01:10:18 +0100 <Shiranai> jackdk []
2022-01-18 01:10:38 +0100 <Shiranai> same with `difs [n]`
2022-01-18 01:11:02 +0100 <jackdk> Shiranai: you can write it as a map after zipping the list with its own tail, but you'll need to handle the empty list separately
2022-01-18 01:11:17 +0100merijn(~merijn@c-001-002-002.client.esciencecenter.eduvpn.nl)
2022-01-18 01:11:18 +0100 <monochrom> [b-a, c-b, d-c] = zipWith (-) [b,c,d] [a,b,c,d]
2022-01-18 01:11:18 +0100 <c_wraith> jackdk: nap, zip handles the empty list
2022-01-18 01:11:29 +0100 <Axman6> > zipWith f [a,b,c] [d,e,f]
2022-01-18 01:11:30 +0100 <c_wraith> Err. *nah*.
2022-01-18 01:11:30 +0100 <lambdabot> error:
2022-01-18 01:11:30 +0100 <lambdabot> • Ambiguous type variable ‘c0’ arising from a use of ‘show_M421258202089...
2022-01-18 01:11:30 +0100 <lambdabot> prevents the constraint ‘(Show c0)’ from being solved.
2022-01-18 01:11:36 +0100 <Axman6> > zipWith f [a,b,c] [d,e,f] :: [Expr]
2022-01-18 01:11:37 +0100 <lambdabot> [f a d,f b e,f c f]
2022-01-18 01:11:57 +0100 <jackdk> c_wraith: but `tail` doesn't
2022-01-18 01:12:10 +0100 <geekosaur> your f is ambiguous there
2022-01-18 01:12:17 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 240 seconds)
2022-01-18 01:12:18 +0100 <c_wraith> jackdk: but zip/zipWith does. The order it examines its arguments in is defined.
2022-01-18 01:12:24 +0100 <Axman6> iif you're careful zipWith won't evaluate the tail []
2022-01-18 01:12:27 +0100 <c_wraith> > zipWith [] undefined
2022-01-18 01:12:28 +0100 <monochrom> Consider "drop 1"
2022-01-18 01:12:29 +0100 <lambdabot> error:
2022-01-18 01:12:29 +0100 <lambdabot> • Couldn't match expected type ‘a1 -> b -> c’
2022-01-18 01:12:29 +0100 <lambdabot> with actual type ‘[a0]’
2022-01-18 01:12:36 +0100 <c_wraith> > zipWith (+) [] undefined
2022-01-18 01:12:37 +0100 <lambdabot> []
2022-01-18 01:12:45 +0100 <jackdk> wow, TIL. cool.
2022-01-18 01:12:46 +0100 <c_wraith> No special cases needed
2022-01-18 01:12:48 +0100 <Shiranai> yeah I think I need to cover the [] case with an if-statement and then dothe zip thing
2022-01-18 01:12:58 +0100 <Shiranai> ooo
2022-01-18 01:13:00 +0100 <Shiranai> nice
2022-01-18 01:13:03 +0100 <jackdk> until five seconds ago I would've agreed with you
2022-01-18 01:13:06 +0100 <Axman6> nope, no need to use if here at all
2022-01-18 01:13:22 +0100 <monochrom> c_wraith: May I entice you with a prank algebra exercise? Expand and simplify (x-a)(x-b)(x-c)...(x-z). >:)
2022-01-18 01:13:22 +0100 <Axman6> if is almost always a code smell in haskell too
2022-01-18 01:13:37 +0100biog(~user1@159.224.42.85) (Quit: ZZZzzz…)
2022-01-18 01:13:47 +0100 <geekosaur> 0
2022-01-18 01:13:53 +0100 <Axman6> I set x = a, and get ... 0
2022-01-18 01:14:03 +0100 <Axman6> hmmm, I feel tricked
2022-01-18 01:14:08 +0100 <geekosaur> don;t even need that, x-x is in the middle of it
2022-01-18 01:14:15 +0100Adran(~adran@botters/adran) (Quit: Este é o fim.)
2022-01-18 01:14:24 +0100 <Axman6> yeah. I've been had!
2022-01-18 01:14:25 +0100 <monochrom> This is similar to the "f c f" there. >:)
2022-01-18 01:15:31 +0100 <Axman6> > product $ zipWith (-) (repeat x) [a,b,c,d,e,f,g] :: Expr
2022-01-18 01:15:32 +0100 <lambdabot> 1 * (x - a) * (x - b) * (x - c) * (x - d) * (x - e) * (x - f) * (x - g)
2022-01-18 01:15:57 +0100 <Axman6> > iterate simplify $ (product $ zipWith (-) (repeat x) [a,b,c,d,e,f,g] :: Expr)
2022-01-18 01:15:59 +0100 <lambdabot> error:
2022-01-18 01:15:59 +0100 <lambdabot> • Variable not in scope: simplify :: Expr -> Expr
2022-01-18 01:15:59 +0100 <lambdabot> • Perhaps you meant ‘simply’ (imported from Control.Lens)
2022-01-18 01:16:13 +0100 <Axman6> of course lens has something called simply
2022-01-18 01:16:21 +0100 <geekosaur> ^5
2022-01-18 01:16:29 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-01-18 01:16:34 +0100little_mac(~little_ma@2601:410:4300:3ce0:ed98:da79:669a:f2be) (Remote host closed the connection)
2022-01-18 01:17:06 +0100 <jackdk> Axman6: and in keeping with today's theme, it is yet another `id`
2022-01-18 01:17:08 +0100 <Axman6> simply :: forall p f s a rep (r :: TYPE rep). (Optic' p f s a -> r) -> Optic' p f s a -> r -- | This is an adverb that can be used to modify many other Lens combinators to make them require simple lenses, simple traversals, simple prisms or simple isos as input.
2022-01-18 01:17:28 +0100Axman6glares at edwardk
2022-01-18 01:17:44 +0100 <jackdk> the real prank is that everything in lens is actually `id` (/s)
2022-01-18 01:19:11 +0100 <Axman6> :t id id id id id id id id
2022-01-18 01:19:12 +0100 <lambdabot> a -> a
2022-01-18 01:20:28 +0100edwardkfeels his neck burning and looks up.
2022-01-18 01:20:34 +0100 <Axman6> from :: AnIso s t a b -> Iso b a t s <- this is what got us into this whole COVID mess in the first place!
2022-01-18 01:20:49 +0100 <jackdk> "how many `id`s have we got in this lib, anyhow?" (with apologies to Mel Brooks and Col. Sandurz)
2022-01-18 01:21:00 +0100ksqsf(~user@134.209.106.31)
2022-01-18 01:21:05 +0100 <edwardk> Axman6: it just 'id', so 'simply' seems well named
2022-01-18 01:21:38 +0100 <Axman6> I just feel like I've been pranked half the time I look at lens' definitions and it's always id
2022-01-18 01:21:45 +0100 <edwardk> =)
2022-01-18 01:21:58 +0100Adran(~adran@botters/adran)
2022-01-18 01:22:10 +0100 <edwardk> if you ignore the newtypes even more of its definitions are just id in disguise
2022-01-18 01:22:50 +0100 <Axman6> "It turns out all we actually needed from SKI was I"
2022-01-18 01:24:55 +0100dka(~code-is-a@ns3059207.ip-193-70-33.eu) (Quit: My Ex-Girlfriend once told me: I'm not a slut, I'm just popular)
2022-01-18 01:24:56 +0100alx741(~alx741@157.100.93.160)
2022-01-18 01:25:01 +0100 <awpr> so I just accidentally wrote a maybe-kinda-useful extensible records library while trying to write a joke extensible records library: https://replit.com/@AndrewPritchard/ImplicitParamRecords2#Main.hs
2022-01-18 01:25:31 +0100dka(~code-is-a@ns3059207.ip-193-70-33.eu)
2022-01-18 01:25:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 01:25:46 +0100 <geekosaur> now I'm wondering if that's how lens started out :þ
2022-01-18 01:26:47 +0100 <awpr> the central idea: if I horribly abuse ImplicitParams to represent the fields, then GHC's constraint solver will do all the "hard" work of plumbing fields around for me
2022-01-18 01:27:39 +0100 <awpr> why you should use it over _any other inferior extensible records library_: it ~~accidentally~~totally on purpose has something equivalent to RecordWildCards.
2022-01-18 01:27:41 +0100 <boxscape_> vulkan let's me create a SurfaceKHR which is a newtype over Word64, but for GLFW-b, I need a Ptr instead. What's the proper way to convert a Word64 into a Ptr? (I'm assuming the Word64 is simply the memory address)
2022-01-18 01:28:19 +0100 <Axman6> what's IP stand for?
2022-01-18 01:28:21 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-01-18 01:28:43 +0100 <awpr> that's the internal class under the hood for ImplicitParams: `?aoeu :: Int` is actually `IP "aoeu" Int`
2022-01-18 01:28:43 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 01:29:45 +0100 <boxscape_> ...alternatively, is there a way to create a fresh Ptr for an arbitrary type?
2022-01-18 01:30:52 +0100Shiranai(~Shiranai@190.237.13.17) (Quit: Connection closed)
2022-01-18 01:31:23 +0100zmt01(~zmt00@user/zmt00)
2022-01-18 01:31:31 +0100 <boxscape_> (without allocating any memory for it)
2022-01-18 01:31:41 +0100 <EvanR> boxscape_, Word64... really...
2022-01-18 01:32:01 +0100 <jackdk> convert to Word, and use WordPtr newtype, then wordPtrToPtr?
2022-01-18 01:32:03 +0100 <EvanR> well, it might be coercable
2022-01-18 01:32:10 +0100 <boxscape_> I can try that
2022-01-18 01:32:13 +0100 <boxscape_> thanks
2022-01-18 01:32:13 +0100 <jackdk> haven't done ffi for a while, ymmv
2022-01-18 01:32:34 +0100ksqsf(~user@134.209.106.31)
2022-01-18 01:32:37 +0100zmt00(~zmt00@user/zmt00) (Ping timeout: 240 seconds)
2022-01-18 01:32:50 +0100aplainze1akind(~johndoe@captainludd.powered.by.lunarbnc.net)
2022-01-18 01:32:54 +0100 <Axman6> awpr: I hate this, it just feels like data soup, there's no structure D: but it works, and I'm curious how well it works and performs
2022-01-18 01:33:11 +0100 <jackdk> docs for distributive say: Categorically every Distributive functor is actually a right adjoint, and so it must be Representable endofunctor and preserve all limits. This is a fancy way of saying it isomorphic to (->) x for some x. this means Distributive and Representable are equivalent concepts on Hask?
2022-01-18 01:33:32 +0100xff0x(~xff0x@2001:1a81:53cb:cc00:be2f:4794:e7a4:33cb) (Ping timeout: 240 seconds)
2022-01-18 01:33:41 +0100 <awpr> I have no idea other than that it seems to work for the examples at the bottom of the file. I don't have any plans to use it for anything beyond entertainment though
2022-01-18 01:33:43 +0100 <jackdk> I assume this is not the case on Hask^Hask -> Hask (I've been thinking about rank2 representable as a way to index record fields with a GADT)
2022-01-18 01:33:48 +0100waleee(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4) (Ping timeout: 250 seconds)
2022-01-18 01:34:28 +0100 <awpr> jackdk, that's https://hackage.haskell.org/package/ten-0.1.0.2/docs/Data-Ten-Representable.html#t:Representable10 FWIW
2022-01-18 01:34:49 +0100xff0x(~xff0x@2001:1a81:53cb:cc00:10bf:48ef:429:dca8)
2022-01-18 01:34:55 +0100hamishmack_(sid389057@id-389057.hampstead.irccloud.com) (Ping timeout: 268 seconds)
2022-01-18 01:34:59 +0100 <Axman6> maybe ImplicitParams died too early (even if they do live on in the stack traces' implementation)
2022-01-18 01:35:03 +0100Jon(jon@dow.land) (Quit: ZNC - http://znc.in)
2022-01-18 01:35:04 +0100Hobbyboy(Hobbyboy@hobbyboy.co.uk) (Quit: The BNC has broken!)
2022-01-18 01:35:24 +0100 <jackdk> awpr: another one! I was only aware of rank2classes, conkin, and barbies.
2022-01-18 01:35:32 +0100ProofTechnique(sid79547@id-79547.ilkley.irccloud.com) (Ping timeout: 268 seconds)
2022-01-18 01:35:32 +0100amir(sid22336@user/amir) (Ping timeout: 268 seconds)
2022-01-18 01:35:33 +0100 <awpr> I think future versions of https://hackage.haskell.org/package/hkd-0.1/docs/Data-HKD.html are slated to have something equivalent too?
2022-01-18 01:35:38 +0100 <jackdk> thanks for the link. a shame none seem to be canonical
2022-01-18 01:36:10 +0100cstml[m](~cstmlmatr@2001:470:69fc:105::1:5c07) (Ping timeout: 268 seconds)
2022-01-18 01:36:10 +0100jmcantrell(~jmcantrel@user/jmcantrell) (Ping timeout: 268 seconds)
2022-01-18 01:36:10 +0100Topik[m](~topikmatr@2001:470:69fc:105::a082) (Ping timeout: 268 seconds)
2022-01-18 01:36:10 +0100jneira[m](~jneiramat@2001:470:69fc:105::d729) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100Nate[m]1(~m52957mat@2001:470:69fc:105::1:591a) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100marinelli[m](~marinelli@2001:470:69fc:105::2d8) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100eoiles[m](~eoilesmat@2001:470:69fc:105::1:6164) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100kadoban(~kadoban@user/kadoban) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100wildsebastian(~wildsebas@2001:470:69fc:105::1:14b1) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100aidy(~aidy@2001:470:69fc:105::c7b4) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100vaibhavsagar[m](~vaibhavsa@2001:470:69fc:105::ffe) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100benjamin[m]1234(~benjaminm@2001:470:69fc:105::1:3f2f) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100IgnatInsarov[m](~kindaroma@2001:470:69fc:105::f5d9) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100carmysilna(~brightly-@2001:470:69fc:105::2190) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100kawzeg(kawzeg@2a01:7e01::f03c:92ff:fee2:ec34) (Ping timeout: 268 seconds)
2022-01-18 01:36:11 +0100hexagoxel(~hexagoxel@2a01:4f8:c0c:e::2) (Ping timeout: 268 seconds)
2022-01-18 01:36:17 +0100mrmonday(~robert@what.i.hope.is.not.a.tabernaevagant.es) (Ping timeout: 240 seconds)
2022-01-18 01:36:32 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 240 seconds)
2022-01-18 01:36:41 +0100 <awpr> huh, I didn't find rank2classes when I surveyed the ecosystem... amusingly its description is extremely similar to mine
2022-01-18 01:36:46 +0100hsiktas[m](~hsiktasm]@2001:470:69fc:105::30d4) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100aplainzetakind(~johndoe@captainludd.powered.by.lunarbnc.net) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100cyphase(~cyphase@user/cyphase) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100maralorn(~maralorn@2001:470:69fc:105::251) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100siraben(~siraben@user/siraben) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100parseval(sid239098@id-239098.helmsley.irccloud.com) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100oxytocat(~alloca@user/suppi) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100krjst(~krjst@2604:a880:800:c1::16b:8001) (Ping timeout: 268 seconds)
2022-01-18 01:36:46 +0100thonkpod(~thonkpod@user/thonkpod) (Ping timeout: 268 seconds)
2022-01-18 01:36:55 +0100hamishmack_(sid389057@id-389057.hampstead.irccloud.com)
2022-01-18 01:37:02 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 01:37:15 +0100robertm(robertm@lattice.rojoma.com) (Ping timeout: 250 seconds)
2022-01-18 01:37:15 +0100zaquest(~notzaques@5.130.79.72) (Remote host closed the connection)
2022-01-18 01:37:37 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4)
2022-01-18 01:37:51 +0100kawzeg(kawzeg@2a01:7e01::f03c:92ff:fee2:ec34)
2022-01-18 01:37:57 +0100ProofTechnique(sid79547@id-79547.ilkley.irccloud.com)
2022-01-18 01:38:02 +0100parseval(sid239098@id-239098.helmsley.irccloud.com)
2022-01-18 01:38:03 +0100amir(sid22336@user/amir)
2022-01-18 01:38:04 +0100mrmonday(~robert@what.i.hope.is.not.a.tabernaevagant.es)
2022-01-18 01:38:05 +0100 <awpr> I'd love for `ten` to become canonical (afaik it's as complete as any other one), but it looks like `hkd` will win by virtue of `lens` depending on it in the moderate future
2022-01-18 01:38:08 +0100cyphase(~cyphase@user/cyphase)
2022-01-18 01:38:08 +0100oxytocat(~alloca@user/suppi)
2022-01-18 01:38:25 +0100thonkpod(~thonkpod@user/thonkpod)
2022-01-18 01:38:25 +0100Jon(jon@dow.land)
2022-01-18 01:38:30 +0100 <jackdk> at least hkd doesn't have that awful Identity-erasing type familyy
2022-01-18 01:38:53 +0100 <jackdk> why does `lens` need to depend on `hkd`?
2022-01-18 01:38:54 +0100hexagoxel(~hexagoxel@hexagoxel.de)
2022-01-18 01:38:56 +0100robertm(robertm@lattice.rojoma.com)
2022-01-18 01:39:01 +0100 <awpr> yeah, people seem to love that thing for reasons I can't understand
2022-01-18 01:39:01 +0100krjst(~krjst@2604:a880:800:c1::16b:8001)
2022-01-18 01:39:03 +0100Hobbyboy(Hobbyboy@hobbyboy.co.uk)
2022-01-18 01:39:03 +0100zaquest(~notzaques@5.130.79.72)
2022-01-18 01:39:28 +0100 <jackdk> because they don't reach a point where the inconsistency it introduces becomes painful
2022-01-18 01:39:28 +0100 <awpr> (re: `hkd` becoming canonical) in which case I'll probably just try to get the novel stuff from `ten` absorbed into `hkd`
2022-01-18 01:40:34 +0100 <boxscape_> actually I lied, I do need to allocate the memory, so maybe I should just use Foreign.Marshal.Alloc.malloc. Only problem is I'm not sure there's a way to programmatically find out how much memory I need for SurfaceKHR, but I guess I'll just have to rely on them never changing the size
2022-01-18 01:40:53 +0100 <awpr> IIUC the reason for growing the dependency is that `distributive` can be expressed in a much more performant way by being built on top of HKD ideas, with the core method being `Functor10 f => f g -> g (f Identity)`
2022-01-18 01:40:55 +0100 <boxscape_> s/malloc/mallocBytes
2022-01-18 01:41:06 +0100 <jackdk> awpr: you don't seem to have contravariant, and nobody seems to have divisible and decidable , but I don't know if those are useful for at rank2
2022-01-18 01:41:29 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-01-18 01:41:38 +0100 <awpr> yeah, true, I typed it in but left it commented out because I didn't have a use for it at the time
2022-01-18 01:42:07 +0100 <awpr> also don't know if Divisible10 and Decidable10 would be useful
2022-01-18 01:43:48 +0100 <boxscape_> ah, never mind, I suppose I can use malloc because it's Storable, solving that issue
2022-01-18 01:44:42 +0100 <jackdk> awpr: I like that you have variants of sequenceA etc that are ergonomic when you have Identity kicking around
2022-01-18 01:44:57 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4) (Ping timeout: 240 seconds)
2022-01-18 01:44:57 +0100alx741(~alx741@157.100.93.160)
2022-01-18 01:45:32 +0100 <monochrom> identity strikes again, this time at the type level too :)
2022-01-18 01:45:33 +0100 <awpr> yeah, tbh I just wasn't sure which form was more useful, so I threw both in there. the names get a bit dense though
2022-01-18 01:45:49 +0100Nate[m]1(~m52957mat@2001:470:69fc:105::1:591a)
2022-01-18 01:45:51 +0100merijn(~merijn@c-001-002-002.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-01-18 01:46:09 +0100cstml[m](~cstmlmatr@2001:470:69fc:105::1:5c07)
2022-01-18 01:46:12 +0100jneira[m](~jneiramat@2001:470:69fc:105::d729)
2022-01-18 01:46:17 +0100carmysilna(~brightly-@2001:470:69fc:105::2190)
2022-01-18 01:46:26 +0100jmcantrell(~jmcantrel@user/jmcantrell)
2022-01-18 01:47:15 +0100 <awpr> the main thing in `ten` that I'm not aware of any other library doing well is dealing with constraints that are common to every field type: `fmap10C @Show (Const . show)` says if you have a record where every field has a Show instance, then you can just go and 'show' each field with relatively little fanfare
2022-01-18 01:48:00 +0100 <jackdk> https://hackage.haskell.org/package/constraints-extras gives you that, and gets used a bit in the DMapverse
2022-01-18 01:48:39 +0100kadoban(~kadoban@user/kadoban)
2022-01-18 01:48:56 +0100 <awpr> ah yeah, looks like a very similar implementation
2022-01-18 01:49:21 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 01:50:16 +0100kaph(~kaph@net-2-47-208-144.cust.vodafonedsl.it) (Ping timeout: 250 seconds)
2022-01-18 01:50:30 +0100 <awpr> along the same lines, https://hackage.haskell.org/package/ten-unordered-containers is similar functionality to DMap except with a valid license
2022-01-18 01:50:30 +0100 <jackdk> but if hkd is going to be everywhere because it's depended on by the 500lb gorilla of teh haskell depgraph, then the best thing to do may be to pump your best ideas into that?
2022-01-18 01:50:56 +0100 <awpr> yeah, that's probably the direction it'll end up going
2022-01-18 01:52:24 +0100wildsebastian(~wildsebas@2001:470:69fc:105::1:14b1)
2022-01-18 01:52:29 +0100 <jackdk> interesting to see these libraries coming out with Google copyrights and recent dates. Have they started adopting more Haskell?
2022-01-18 01:52:37 +0100eoiles[m](~eoilesmat@2001:470:69fc:105::1:6164)
2022-01-18 01:52:38 +0100Topik[m](~topikmatr@2001:470:69fc:105::a082)
2022-01-18 01:52:40 +0100vaibhavsagar[m](~vaibhavsa@2001:470:69fc:105::ffe)
2022-01-18 01:52:42 +0100IgnatInsarov[m](~kindaroma@2001:470:69fc:105::f5d9)
2022-01-18 01:52:42 +0100 <awpr> well I've started open-sourcing more Haskell
2022-01-18 01:52:43 +0100marinelli[m](~marinelli@2001:470:69fc:105::2d8)
2022-01-18 01:52:53 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 01:52:53 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 01:52:53 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 01:53:42 +0100benjamin[m]1234(~benjaminm@2001:470:69fc:105::1:3f2f)
2022-01-18 01:54:16 +0100aidy(~aidy@2001:470:69fc:105::c7b4)
2022-01-18 01:54:43 +0100maralorn(~maralorn@2001:470:69fc:105::251)
2022-01-18 01:54:43 +0100siraben(~siraben@user/siraben)
2022-01-18 01:55:20 +0100 <jackdk> noice
2022-01-18 01:55:23 +0100hsiktas[m](~hsiktasm]@2001:470:69fc:105::30d4)
2022-01-18 01:58:06 +0100zfnmxt(~zfnmxtzfn@2001:470:69fc:105::2b32) (Changing host)
2022-01-18 01:58:06 +0100zfnmxt(~zfnmxtzfn@user/zfnmxt)
2022-01-18 01:59:32 +0100jgeerds(~jgeerds@55d4090e.access.ecotel.net) (Ping timeout: 240 seconds)
2022-01-18 02:01:25 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 02:01:47 +0100machinedgod(~machinedg@24.105.81.50)
2022-01-18 02:04:01 +0100ksqsf(~user@134.209.106.31)
2022-01-18 02:05:32 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 240 seconds)
2022-01-18 02:07:17 +0100zebrag(~chris@user/zebrag) (Quit: Konversation terminated!)
2022-01-18 02:07:29 +0100alx741(~alx741@157.100.93.160)
2022-01-18 02:08:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 02:09:05 +0100Shiranai(~Shiranai@190.237.13.17)
2022-01-18 02:09:27 +0100 <Shiranai> Why can't I eta reduce `f x = (*3) $ div 2 x` to `f = (*3) $ div 2`?
2022-01-18 02:09:44 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 02:10:08 +0100 <Axman6> )@src ($)
2022-01-18 02:10:11 +0100 <Axman6> @src ($)
2022-01-18 02:10:11 +0100 <lambdabot> f $ x = f x
2022-01-18 02:10:31 +0100 <Axman6> div 2 is the argument x
2022-01-18 02:10:55 +0100 <Axman6> so what you've written is ((*3) (div 2))
2022-01-18 02:11:16 +0100pavonia(~user@user/siracusa)
2022-01-18 02:11:24 +0100 <Axman6> which is ((\n ->n*3) (\p -> div 2 p))
2022-01-18 02:11:28 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2022-01-18 02:11:50 +0100 <Axman6> you _can_ write (*3) . div 2
2022-01-18 02:11:55 +0100 <Axman6> @src (.)
2022-01-18 02:11:55 +0100 <lambdabot> (f . g) x = f (g x)
2022-01-18 02:12:02 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2022-01-18 02:12:53 +0100 <Shiranai> ohh got it, thanks!
2022-01-18 02:14:38 +0100 <Axman6> it's worth going through this exercise, translating both expressions and see what you get back - what does ((\n ->n*3) (\p -> div 2 p)) become?
2022-01-18 02:15:33 +0100wroathe(~wroathe@user/wroathe) (Read error: Connection reset by peer)
2022-01-18 02:16:02 +0100Rembane(~Rembane@li346-36.members.linode.com) (Ping timeout: 265 seconds)
2022-01-18 02:16:10 +0100Rembane(~Rembane@li346-36.members.linode.com)
2022-01-18 02:16:59 +0100fiddlerwoaroof(~fiddlerwo@user/fiddlerwoaroof) (Quit: Gone.)
2022-01-18 02:17:00 +0100justJustache(~justache@user/justache) (Remote host closed the connection)
2022-01-18 02:17:28 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4)
2022-01-18 02:17:35 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2022-01-18 02:18:00 +0100justJustache(~justache@user/justache)
2022-01-18 02:18:05 +0100bens(~bens@www.typius.com) (Ping timeout: 268 seconds)
2022-01-18 02:18:17 +0100fiddlerwoaroof(~fiddlerwo@user/fiddlerwoaroof)
2022-01-18 02:18:28 +0100bens(~bens@www.typius.com)
2022-01-18 02:20:46 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 02:20:46 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 02:20:46 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 02:24:08 +0100ksqsf(~user@134.209.106.31)
2022-01-18 02:24:32 +0100machinedgod(~machinedg@24.105.81.50) (Ping timeout: 240 seconds)
2022-01-18 02:24:48 +0100ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 276 seconds)
2022-01-18 02:25:55 +0100ec(~ec@gateway/tor-sasl/ec)
2022-01-18 02:26:36 +0100alx741(~alx741@157.100.93.160)
2022-01-18 02:31:08 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 02:32:19 +0100ProfSimm(~ProfSimm@87.227.196.109) (Ping timeout: 256 seconds)
2022-01-18 02:44:26 +0100cross_cross
2022-01-18 02:46:02 +0100Gurkenglas(~Gurkengla@dslb-002-203-144-204.002.203.pools.vodafone-ip.de) (Ping timeout: 240 seconds)
2022-01-18 02:47:46 +0100alx741(~alx741@157.100.93.160)
2022-01-18 02:48:20 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 02:49:17 +0100xsperry(~xs@user/xsperry) (Remote host closed the connection)
2022-01-18 02:50:24 +0100xsperry(~xs@user/xsperry)
2022-01-18 02:51:47 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 02:55:58 +0100Shiranai(~Shiranai@190.237.13.17) (Quit: Connection closed)
2022-01-18 02:58:37 +0100mvk(~mvk@2607:fea8:5cdd:f000::55f8) (Ping timeout: 240 seconds)
2022-01-18 02:58:44 +0100Erutuon(~Erutuon@user/erutuon) (Ping timeout: 250 seconds)
2022-01-18 02:58:57 +0100SlowLearner(~SlowLearn@2804:14c:65a1:452d:faeb:2e8a:da33:265f) (Ping timeout: 256 seconds)
2022-01-18 03:01:50 +0100Erutuon(~Erutuon@user/erutuon)
2022-01-18 03:02:08 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Quit: Lost terminal)
2022-01-18 03:04:15 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
2022-01-18 03:05:49 +0100califax-(~califax@user/califx)
2022-01-18 03:08:45 +0100slack1256(~slack1256@186.11.99.46) (Ping timeout: 256 seconds)
2022-01-18 03:08:55 +0100alx741(~alx741@157.100.93.160)
2022-01-18 03:10:18 +0100califax(~califax@user/califx) (Ping timeout: 276 seconds)
2022-01-18 03:10:19 +0100califax-califax
2022-01-18 03:10:44 +0100kaph(~kaph@net-2-47-208-144.cust.vodafonedsl.it)
2022-01-18 03:11:27 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 03:12:19 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 03:16:32 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 240 seconds)
2022-01-18 03:18:40 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4) (Ping timeout: 250 seconds)
2022-01-18 03:20:32 +0100alp(~alp@user/alp) (Ping timeout: 240 seconds)
2022-01-18 03:22:08 +0100xff0x(~xff0x@2001:1a81:53cb:cc00:10bf:48ef:429:dca8) (Ping timeout: 250 seconds)
2022-01-18 03:24:02 +0100xff0x(~xff0x@2001:1a81:5209:df00:e795:8bea:73be:6c45)
2022-01-18 03:24:17 +0100neurocyte0917090(~neurocyte@IP-185189141194.dynamic.medianet-world.de)
2022-01-18 03:24:17 +0100neurocyte0917090(~neurocyte@IP-185189141194.dynamic.medianet-world.de) (Changing host)
2022-01-18 03:24:17 +0100neurocyte0917090(~neurocyte@user/neurocyte)
2022-01-18 03:26:01 +0100 <alexfmpe[m]> @free x :: Int
2022-01-18 03:26:01 +0100 <lambdabot> x = x
2022-01-18 03:26:02 +0100neurocyte091709(~neurocyte@user/neurocyte) (Ping timeout: 240 seconds)
2022-01-18 03:26:02 +0100neurocyte0917090neurocyte091709
2022-01-18 03:28:02 +0100alx741(~alx741@157.100.93.160)
2022-01-18 03:28:23 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 03:31:06 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4)
2022-01-18 03:31:21 +0100 <Axman6> awpr: I feel at least a blog post is deserved from that record thing
2022-01-18 03:31:55 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-01-18 03:32:08 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 03:38:19 +0100ksqsf(~user@134.209.106.31)
2022-01-18 03:41:44 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 03:43:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 03:55:04 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4) (Ping timeout: 250 seconds)
2022-01-18 03:57:40 +0100 <Axman6> Anyone know if anyone has written a linker in Haskell?
2022-01-18 04:01:12 +0100nunggu(~q@user/nunggu)
2022-01-18 04:02:59 +0100tomku(~tomku@user/tomku) (Read error: Connection reset by peer)
2022-01-18 04:03:48 +0100 <jackdk> what are you thinking of Axman6
2022-01-18 04:05:26 +0100little_mac(~little_ma@2601:410:4300:3ce0:ed98:da79:669a:f2be)
2022-01-18 04:06:15 +0100 <Axman6> I was reading https://maskray.me/blog/2021-12-19-why-isnt-ld.lld-faster and thinking "Surely linking is just tying the knot"
2022-01-18 04:07:34 +0100tomku(~tomku@user/tomku)
2022-01-18 04:08:02 +0100Erutuon(~Erutuon@user/erutuon) (Ping timeout: 240 seconds)
2022-01-18 04:10:25 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2022-01-18 04:10:25 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2022-01-18 04:10:25 +0100finn_elijaFinnElija
2022-01-18 04:11:24 +0100ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 276 seconds)
2022-01-18 04:15:04 +0100Everything(~Everythin@46-133-77-215.mobile.vf-ua.net) (Quit: leaving)
2022-01-18 04:16:11 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-01-18 04:19:44 +0100ksqsf(~user@134.209.106.31)
2022-01-18 04:21:25 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.4)
2022-01-18 04:24:41 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 04:27:32 +0100raym(~raym@user/raym) (Ping timeout: 240 seconds)
2022-01-18 04:29:36 +0100raym(~raym@user/raym)
2022-01-18 04:35:51 +0100td_(~td@94.134.91.126) (Ping timeout: 256 seconds)
2022-01-18 04:37:12 +0100little_mac(~little_ma@2601:410:4300:3ce0:ed98:da79:669a:f2be) (Remote host closed the connection)
2022-01-18 04:37:30 +0100little_mac(~little_ma@2601:410:4300:3ce0:c076:ae6d:3ec6:202c)
2022-01-18 04:37:32 +0100td_(~td@muedsl-82-207-238-179.citykom.de)
2022-01-18 04:41:00 +0100geranim0(~geranim0@modemcable242.171-178-173.mc.videotron.ca) (Ping timeout: 250 seconds)
2022-01-18 04:46:35 +0100 <lagash> "First comes love..."
2022-01-18 04:51:42 +0100mbuf(~Shakthi@136.185.86.67)
2022-01-18 04:52:44 +0100mbuf(~Shakthi@136.185.86.67) (Remote host closed the connection)
2022-01-18 04:54:48 +0100Jing(~hedgehog@240e:390:7c53:a7e1:a9:59ba:3231:6160)
2022-01-18 04:56:36 +0100little_mac(~little_ma@2601:410:4300:3ce0:c076:ae6d:3ec6:202c) (Ping timeout: 250 seconds)
2022-01-18 04:57:56 +0100mbuf(~Shakthi@136.185.86.67)
2022-01-18 05:05:02 +0100ksqsf(~user@134.209.106.31)
2022-01-18 05:06:01 +0100jackson99(~bc8147f2@cerf.good1.com)
2022-01-18 05:06:46 +0100vysn(~vysn@user/vysn)
2022-01-18 05:09:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 05:12:27 +0100burnsidesLlama(~burnsides@dhcp168-045.wadham.ox.ac.uk) (Remote host closed the connection)
2022-01-18 05:13:03 +0100 <Axman6> Then comes code...
2022-01-18 05:16:48 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 05:21:51 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Ping timeout: 268 seconds)
2022-01-18 05:31:49 +0100dyeplexer(~dyeplexer@user/dyeplexer)
2022-01-18 05:36:28 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) (Ping timeout: 250 seconds)
2022-01-18 05:37:12 +0100jinsun__(~quassel@user/jinsun)
2022-01-18 05:38:33 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf)
2022-01-18 05:39:09 +0100alMalsamo(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 276 seconds)
2022-01-18 05:41:01 +0100jinsun(~quassel@user/jinsun) (Ping timeout: 256 seconds)
2022-01-18 05:41:48 +0100Erutuon(~Erutuon@user/erutuon)
2022-01-18 05:43:45 +0100 <Axman6> awpr: ... why ten/10?
2022-01-18 05:44:31 +0100 <Axman6> ah, not in the README but is in Data.Ten - reading
2022-01-18 05:47:37 +0100emf(~emf@2620:10d:c090:400::5:2d26) (Ping timeout: 240 seconds)
2022-01-18 05:50:20 +0100emf(~emf@2620:10d:c090:400::5:2d26)
2022-01-18 05:53:58 +0100ksqsf(~user@134.209.106.31)
2022-01-18 05:58:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 05:59:54 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2022-01-18 06:01:14 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-01-18 06:01:35 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Client Quit)
2022-01-18 06:01:56 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-01-18 06:06:05 +0100slack1256(~slack1256@186.11.99.46)
2022-01-18 06:08:43 +0100jenna8912(~jenna@c-107-5-104-51.hsd1.mi.comcast.net)
2022-01-18 06:11:50 +0100ksqsf(~user@134.209.106.31)
2022-01-18 06:12:29 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 252 seconds)
2022-01-18 06:12:30 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 06:16:11 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 06:16:46 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 250 seconds)
2022-01-18 06:21:26 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-01-18 06:21:48 +0100boxscape_(~boxscape_@p4ff0b9d5.dip0.t-ipconnect.de) (Quit: Connection closed)
2022-01-18 06:23:27 +0100 <awpr> hmm, the GitHub repo README is more thorough, but not shown on Hackage. I should find a way to get that included (I think it's just extra-source-files, but this README is in the directory above the package, so it might take an extra symlink or copy or something)
2022-01-18 06:23:30 +0100 <awpr> https://github.com/google/hs-ten/issues/6
2022-01-18 06:23:34 +0100ksqsf(~user@134.209.106.31)
2022-01-18 06:30:55 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 06:36:28 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 268 seconds)
2022-01-18 06:38:26 +0100dyeplexer(~dyeplexer@user/dyeplexer) (Ping timeout: 250 seconds)
2022-01-18 06:43:36 +0100bens(~bens@www.typius.com) (Quit: leaving)
2022-01-18 06:44:18 +0100 <Axman6> Great, thanks :)
2022-01-18 06:44:59 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 06:44:59 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 06:44:59 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 06:44:59 +0100gentauro(~gentauro@user/gentauro) (Read error: Connection reset by peer)
2022-01-18 06:45:19 +0100gentauro(~gentauro@user/gentauro)
2022-01-18 06:46:57 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 268 seconds)
2022-01-18 06:48:02 +0100vysn(~vysn@user/vysn) (Ping timeout: 240 seconds)
2022-01-18 06:49:32 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 240 seconds)
2022-01-18 06:49:42 +0100arjun_(~arjun@user/arjun)
2022-01-18 06:50:18 +0100mvk(~mvk@2607:fea8:5cdd:f000::55f8)
2022-01-18 06:50:42 +0100 <arjun_> hi
2022-01-18 06:50:59 +0100 <arjun_> what's the least painful way to bound a type range?
2022-01-18 06:51:21 +0100 <arjun_> if i want a type that only is Float 0.0 to 1.0 and would error on range outside it
2022-01-18 06:57:42 +0100ksqsf(~user@134.209.106.31)
2022-01-18 06:59:15 +0100slowButPresent(~slowButPr@user/slowbutpresent) (Quit: leaving)
2022-01-18 06:59:50 +0100 <c_wraith> if Float/Double weren't pariahs at the type level, I'd say the refined package. But they are, so... not that.
2022-01-18 07:00:19 +0100 <arjun_> what's even a pariah? : P
2022-01-18 07:01:12 +0100 <jackdk> c_wraith is saying that you can't have typelevel Float/Double like you can Int
2022-01-18 07:01:44 +0100 <c_wraith> pariah - someone/something that must be avoided.
2022-01-18 07:01:45 +0100 <jackdk> I would probably write `data Clamped a = Clamped { cMin :: a, cMax :: a, cVal :: a }`
2022-01-18 07:01:49 +0100 <arjun_> i want to ask why but im scared lol
2022-01-18 07:01:55 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Quit: Lost terminal)
2022-01-18 07:02:02 +0100 <c_wraith> I honestly have no idea.
2022-01-18 07:02:21 +0100 <c_wraith> I don't know why GHC didn't promote all the primitive types when it promoted String and Integer
2022-01-18 07:02:59 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 07:03:12 +0100 <arjun_> i'd rather have them checked compile time rather than blowing at runtime or being have to carry around a smart constructor
2022-01-18 07:03:32 +0100alMalsamo(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-01-18 07:03:38 +0100 <arjun_> things like Type 0.3 + Type 0.4 should be allowed since they result in Type 0.7
2022-01-18 07:04:00 +0100 <arjun_> but Type 1.0 + Type 0.4 should be not since > 1.0
2022-01-18 07:04:02 +0100 <c_wraith> that seems... difficult... to do at compile time
2022-01-18 07:04:24 +0100 <c_wraith> ie, it only would work with completely static paths
2022-01-18 07:04:31 +0100 <c_wraith> um.. code paths
2022-01-18 07:04:46 +0100 <c_wraith> Any time something might behave differently based on input, it would fail
2022-01-18 07:07:04 +0100 <arjun_> refine seems alright
2022-01-18 07:10:05 +0100 <arjun_> refined*
2022-01-18 07:12:55 +0100 <Axman6> data Probability = Probability Word64 -- represents 1/n
2022-01-18 07:12:58 +0100 <Axman6> >_>
2022-01-18 07:13:18 +0100 <Axman6> hmm, I guess that makes 0.75 very difficult to represent
2022-01-18 07:15:37 +0100 <awpr> if that's meant to be a way of mapping things onto [0,1) by definition: `newtype Unity = Unity Double -- represents 0.5 + 0.5*log(p/(1-p))` is one traditional way to do it.
2022-01-18 07:17:05 +0100 <Axman6> > map (\p -> 0.5 + 0.5*log(p/(1-p))) [0,1,10,-1,-10]
2022-01-18 07:17:07 +0100 <lambdabot> [-Infinity,Infinity,NaN,NaN,NaN]
2022-01-18 07:17:31 +0100 <Axman6> > map (\p -> 0.5 + 0.5*log(p/(1-p))) [0.1,0.5,0.9]
2022-01-18 07:17:32 +0100 <lambdabot> [-0.5986122886681096,0.5,1.5986122886681098]
2022-01-18 07:17:35 +0100 <arjun_> it's not to map
2022-01-18 07:17:47 +0100 <awpr> I got the specifics very wrong, but it's meant to turn "approaches infinity" into "approaches 1" and "approaches -infinity" into "approaches 0"
2022-01-18 07:18:49 +0100 <Axman6> Interesting - would love to learn more
2022-01-18 07:19:07 +0100 <awpr> > map (\a -> exp a / (1 + exp a)) [-1000, -100, -10, -1, 0, 1, 10, 100, 1000)
2022-01-18 07:19:09 +0100 <lambdabot> <hint>:1:75: error: parse error on input ‘)’
2022-01-18 07:19:17 +0100 <awpr> > map (\a -> exp a / (1 + exp a)) [-1000, -100, -10, -1, 0, 1, 10, 100, 1000]
2022-01-18 07:19:18 +0100 <lambdabot> [0.0,3.720075976020836e-44,4.5397868702434395e-5,0.2689414213699951,0.5,0.73...
2022-01-18 07:19:55 +0100`2jt(~jtomas@10.red-83-58-228.dynamicip.rima-tde.net)
2022-01-18 07:21:36 +0100 <awpr> > map (\a -> realToFrac (exp a / (1 + exp a)) :: Fixed Milli) [-1000 :: Double, -100, -10, -1, 0, 1, 10, 100, 1000]
2022-01-18 07:21:38 +0100 <lambdabot> error:
2022-01-18 07:21:38 +0100 <lambdabot> Ambiguous occurrence ‘Fixed’
2022-01-18 07:21:38 +0100 <lambdabot> It could refer to
2022-01-18 07:21:53 +0100 <EvanR> Axman6, egyptian fractions to the rescue or something
2022-01-18 07:22:24 +0100ksqsf(~user@134.209.106.31)
2022-01-18 07:22:47 +0100 <EvanR> arjun_, if possible, make a new type for 0 to 1 and only have api functions that make sense for those, i.e. times but not plus
2022-01-18 07:23:25 +0100 <Axman6> yeah you can't make a sensible Num instance for that
2022-01-18 07:24:02 +0100 <arjun_> EvanR, how do i newtype a range?
2022-01-18 07:25:11 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 268 seconds)
2022-01-18 07:25:57 +0100 <Axman6> @hoogle log1p
2022-01-18 07:25:57 +0100 <lambdabot> Numeric log1p :: Floating a => a -> a
2022-01-18 07:25:57 +0100 <lambdabot> GHC.Float log1p :: Floating a => a -> a
2022-01-18 07:25:57 +0100 <lambdabot> Protolude log1p :: Floating a => a -> a
2022-01-18 07:29:03 +0100 <EvanR> arjun_, a new type wrapper allows you to control how values are constructed, gating them behind a check, in this case that they are in range
2022-01-18 07:29:17 +0100 <EvanR> aol keyword "smart constructor"
2022-01-18 07:29:42 +0100 <EvanR> that's a runtime techinque though
2022-01-18 07:29:55 +0100 <EvanR> but it's not painful
2022-01-18 07:31:17 +0100zmt01(~zmt00@user/zmt00) (Ping timeout: 240 seconds)
2022-01-18 07:38:08 +0100kaph(~kaph@net-2-47-208-144.cust.vodafonedsl.it) (Ping timeout: 268 seconds)
2022-01-18 07:39:32 +0100notzmv(~zmv@user/notzmv) (Ping timeout: 240 seconds)
2022-01-18 07:40:14 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 07:44:05 +0100 <arjun_> > a new type wrapper allows you to control how values are constructed, gating them behind a check
2022-01-18 07:44:07 +0100 <lambdabot> <hint>:1:7: error: parse error on input ‘type’
2022-01-18 07:44:09 +0100 <arjun_> i didn't know that
2022-01-18 07:44:21 +0100 <arjun_> do you have an example the top of your head EvanR ?
2022-01-18 07:46:28 +0100xff0x(~xff0x@2001:1a81:5209:df00:e795:8bea:73be:6c45) (Ping timeout: 250 seconds)
2022-01-18 07:46:32 +0100michalz(~michalz@185.246.204.101)
2022-01-18 07:46:50 +0100 <arjun_> nvm, i think i found it : p
2022-01-18 07:46:53 +0100 <arjun_> https://www.haskell.org/tutorial/moretypes.html
2022-01-18 07:47:15 +0100xff0x(~xff0x@2001:1a81:5209:df00:1935:85e:8166:55b)
2022-01-18 07:50:27 +0100alp(~alp@user/alp)
2022-01-18 07:53:47 +0100vglfr(~vglfr@46.96.179.132) (Ping timeout: 256 seconds)
2022-01-18 07:54:21 +0100hololeap(~hololeap@user/hololeap) (Excess Flood)
2022-01-18 07:55:43 +0100fef(~thedawn@user/thedawn)
2022-01-18 07:55:44 +0100_ht(~quassel@2a02:a468:b619:1:c1f2:a735:3541:23f8)
2022-01-18 07:55:46 +0100hololeap(~hololeap@user/hololeap)
2022-01-18 08:06:43 +0100fcc977(~kaph@151.19.243.144)
2022-01-18 08:07:48 +0100slac19759(~slack1256@191.125.99.76)
2022-01-18 08:09:35 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 268 seconds)
2022-01-18 08:10:12 +0100slack1256(~slack1256@186.11.99.46) (Ping timeout: 268 seconds)
2022-01-18 08:10:53 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-01-18 08:11:32 +0100max22-(~maxime@2a01cb0883359800958d49fa3415ab33.ipv6.abo.wanadoo.fr)
2022-01-18 08:15:03 +0100coot(~coot@89-64-85-93.dynamic.chello.pl)
2022-01-18 08:15:30 +0100fcc977(~kaph@151.19.243.144) (Remote host closed the connection)
2022-01-18 08:15:50 +0100fcc977(~kaph@151.19.243.144)
2022-01-18 08:17:35 +0100MajorBiscuit(~MajorBisc@c-001-025-054.client.tudelft.eduvpn.nl)
2022-01-18 08:18:18 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 08:19:50 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 08:22:33 +0100little_mac(~little_ma@2601:410:4300:3ce0:6136:2d74:4238:7594)
2022-01-18 08:23:06 +0100 <arjun_> anyway i can borrow or point to the fromInteger method of Double's Num ? :P
2022-01-18 08:23:20 +0100 <arjun_> and _just_ the fromInteger method
2022-01-18 08:26:02 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Ping timeout: 240 seconds)
2022-01-18 08:27:03 +0100foul_owl(~kerry@94.140.8.107) (Ping timeout: 256 seconds)
2022-01-18 08:32:02 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 240 seconds)
2022-01-18 08:32:12 +0100mc47(~mc47@xmonad/TheMC47)
2022-01-18 08:34:00 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd) (Ping timeout: 276 seconds)
2022-01-18 08:37:02 +0100Erutuon(~Erutuon@user/erutuon) (Ping timeout: 240 seconds)
2022-01-18 08:37:39 +0100newsham(~newsham@2603-800c-2d00-e994-c564-1d76-1f18-c3ec.res6.spectrum.com)
2022-01-18 08:37:47 +0100 <newsham> ?bot
2022-01-18 08:37:47 +0100 <lambdabot> :)
2022-01-18 08:37:53 +0100 <newsham> > fix id
2022-01-18 08:37:55 +0100 <lambdabot> *Exception: <<loop>>
2022-01-18 08:38:00 +0100 <newsham> hi
2022-01-18 08:40:01 +0100Erutuon(~Erutuon@user/erutuon)
2022-01-18 08:40:39 +0100foul_owl(~kerry@97-126-11-68.tukw.qwest.net)
2022-01-18 08:41:55 +0100shriekingnoise(~shrieking@201.231.16.156) (Quit: Quit)
2022-01-18 08:42:53 +0100cfricke(~cfricke@user/cfricke)
2022-01-18 08:42:58 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 08:53:54 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:8c5a:efae:38ab:4ad2)
2022-01-18 08:55:16 +0100gehmehgeh(~user@user/gehmehgeh)
2022-01-18 08:55:56 +0100fcc977(~kaph@151.19.243.144) (Read error: Connection reset by peer)
2022-01-18 08:58:18 +0100alp(~alp@user/alp) (Ping timeout: 268 seconds)
2022-01-18 08:59:21 +0100wagle(~wagle@quassel.wagle.io) (Quit: http://quassel-irc.org - Chat comfortably. Anywhere.)
2022-01-18 08:59:41 +0100fcc977(~kaph@151.43.53.126)
2022-01-18 08:59:55 +0100wagle(~wagle@quassel.wagle.io)
2022-01-18 09:00:07 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 09:01:50 +0100kuribas(~user@ptr-25vy0ia11vvy5vw4h88.18120a2.ip6.access.telenet.be)
2022-01-18 09:01:50 +0100wagle(~wagle@quassel.wagle.io) (Client Quit)
2022-01-18 09:02:23 +0100wagle(~wagle@quassel.wagle.io)
2022-01-18 09:02:34 +0100o(~niko@libera/staff/niko)
2022-01-18 09:03:15 +0100fcc977(~kaph@151.43.53.126) (Remote host closed the connection)
2022-01-18 09:04:32 +0100fcc977(~kaph@151.43.53.126)
2022-01-18 09:05:00 +0100 <hololeap> is there a preferred way to stream data from a TCP connection, which can handle network errors, EOF, and the like? I'm looking at the connection library, but it seems like it's missing something to stream the incoming chunks into something like attoparsec and still deal with errors and closing the socket on EOF.
2022-01-18 09:06:21 +0100 <kuribas> hololeap: conduit, streamly, pipes, etc... ?
2022-01-18 09:06:41 +0100 <kuribas> any decent streaming library would give you that.
2022-01-18 09:07:23 +0100alp(~alp@user/alp)
2022-01-18 09:07:49 +0100 <kuribas> https://hackage.haskell.org/package/conduit-extra-1.3.5
2022-01-18 09:07:51 +0100 <hololeap> sure, but those libraries don't seem to have any network-specific functions. this seems like something that would be common enough to have a preferred solution
2022-01-18 09:07:57 +0100fcc977(~kaph@151.43.53.126) (Read error: Connection reset by peer)
2022-01-18 09:08:11 +0100fcc977(~kaph@151.43.53.126)
2022-01-18 09:08:17 +0100 <kuribas> https://hackage.haskell.org/package/conduit-extra-1.3.5/docs/Data-Conduit-Network.html
2022-01-18 09:08:49 +0100 <hololeap> ok. I will add that I _did_ look at that and could not understand how to actually use it
2022-01-18 09:09:40 +0100 <kuribas> there are probably tutorials somewhere.
2022-01-18 09:10:03 +0100dhouthoo(~dhouthoo@178-117-36-167.access.telenet.be)
2022-01-18 09:11:11 +0100 <kuribas> If you first read a tutorial on using conduit, then the types for the more specific libraries should make more sense.
2022-01-18 09:11:22 +0100 <hololeap> this looks like what I'm looking for, but it hasn't been updated in a couple years: https://hackage.haskell.org/package/conduit-connection-0.1.0.5/docs/Network-Connection-Conduit.htm…
2022-01-18 09:11:34 +0100 <hololeap> I guess I'll just have to try it out
2022-01-18 09:12:32 +0100 <hololeap> conduit makes sense, and I could probably build this myself, but it seems like _such_ a common problem that there must be a prebuilt solution. the Data.Conduit.Network module just confuses me
2022-01-18 09:13:51 +0100 <hololeap> sourceSocket and sinkSocket make sense. the rest is just poorly documented
2022-01-18 09:14:13 +0100 <hololeap> data AppData -- The data passed to an Application.
2022-01-18 09:14:16 +0100 <hololeap> ok thanks
2022-01-18 09:14:59 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2022-01-18 09:15:11 +0100 <kuribas> yeah, that module is poorly documented.
2022-01-18 09:17:02 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 240 seconds)
2022-01-18 09:20:45 +0100ubert1(~Thunderbi@p200300ecdf09949ebd4b43e35031000e.dip0.t-ipconnect.de)
2022-01-18 09:24:24 +0100fcc977(~kaph@151.43.53.126) (Ping timeout: 250 seconds)
2022-01-18 09:29:46 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2022-01-18 09:30:13 +0100max22-(~maxime@2a01cb0883359800958d49fa3415ab33.ipv6.abo.wanadoo.fr) (Remote host closed the connection)
2022-01-18 09:32:32 +0100max22-(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr)
2022-01-18 09:34:48 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 250 seconds)
2022-01-18 09:40:57 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd)
2022-01-18 09:50:15 +0100machinedgod(~machinedg@24.105.81.50)
2022-01-18 09:50:43 +0100Erutuon(~Erutuon@user/erutuon) (Ping timeout: 268 seconds)
2022-01-18 09:51:16 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 250 seconds)
2022-01-18 09:52:28 +0100notzmv(~zmv@user/notzmv)
2022-01-18 09:57:09 +0100n8chan(~nate@108-233-125-227.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 256 seconds)
2022-01-18 09:59:16 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 10:00:20 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 10:03:36 +0100jgeerds(~jgeerds@55d4090e.access.ecotel.net)
2022-01-18 10:04:19 +0100chele(~chele@user/chele)
2022-01-18 10:07:58 +0100n8chan(~nate@108-233-125-227.lightspeed.sntcca.sbcglobal.net)
2022-01-18 10:09:47 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 10:10:56 +0100Erutuon(~Erutuon@user/erutuon)
2022-01-18 10:11:46 +0100 <hololeap> conduit-connection at least compiles on my system, so that's a good sign
2022-01-18 10:12:48 +0100wmacmil(~wmacmil@83-233-165-97.cust.bredband2.com)
2022-01-18 10:14:06 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd) (Ping timeout: 276 seconds)
2022-01-18 10:15:14 +0100rusrushal13(~rusrushal@2401:4900:447e:3bb1:d351:e0e8:3fcf:bb54)
2022-01-18 10:15:31 +0100Pickchea(~private@user/pickchea)
2022-01-18 10:16:51 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd)
2022-01-18 10:17:40 +0100allbery_b(~geekosaur@xmonad/geekosaur)
2022-01-18 10:17:40 +0100geekosaur(~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
2022-01-18 10:17:43 +0100allbery_bgeekosaur
2022-01-18 10:20:22 +0100vysn(~vysn@user/vysn)
2022-01-18 10:20:23 +0100rusrushal13(~rusrushal@2401:4900:447e:3bb1:d351:e0e8:3fcf:bb54) (Ping timeout: 256 seconds)
2022-01-18 10:27:15 +0100timCF(~timCF@200-149-20-81.sta.estpak.ee)
2022-01-18 10:27:38 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-01-18 10:27:52 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 10:28:00 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-01-18 10:28:49 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 10:29:01 +0100 <timCF> Hello! Is there some type and corresponding transformer similar to Either/ExceptT which behaves similar way, but don't fail on first Left value, and keep going accumulating Left values into some sort of monoid, let's say a list?
2022-01-18 10:30:07 +0100 <merijn> Validation from
2022-01-18 10:30:10 +0100 <merijn> @hackage either
2022-01-18 10:30:10 +0100 <lambdabot> https://hackage.haskell.org/package/either
2022-01-18 10:31:14 +0100 <timCF> merijn: thanks! I knew it was there something like this, but totally forgot name. I guess I have to implement transformer myself if I need?
2022-01-18 10:31:40 +0100 <merijn> arguably there is no transformer, because it's not a lawful Monad
2022-01-18 10:31:46 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2022-01-18 10:31:59 +0100 <timCF> aah, got it
2022-01-18 10:34:04 +0100 <lortabac> there is also Errors in Control.Applicative.Lift
2022-01-18 10:34:36 +0100Gurkenglas(~Gurkengla@dslb-002-203-144-204.002.203.pools.vodafone-ip.de)
2022-01-18 10:35:13 +0100 <lortabac> I've never used it though
2022-01-18 10:36:02 +0100ksqsf(~user@134.209.106.31)
2022-01-18 10:36:33 +0100aplainze1akind(~johndoe@captainludd.powered.by.lunarbnc.net) (Quit: Free ZNC ~ Powered by LunarBNC: https://LunarBNC.net)
2022-01-18 10:36:45 +0100aplainzetakind(~johndoe@captainludd.powered.by.lunarbnc.net)
2022-01-18 10:38:27 +0100 <timCF> lortabac: I guess it's kinda the same like Validation? Allows independent applicative computations, but not if computations do depend on each other (monadic)
2022-01-18 10:38:44 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-01-18 10:39:09 +0100 <merijn> timCF: You can trivially convert between Validation and Either, though. So you can write some wrapper around >>= that unwraps and rewraps
2022-01-18 10:39:54 +0100econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2022-01-18 10:40:23 +0100 <lortabac> timCF: I think so, but Validation is more widely used, so probably a better choice
2022-01-18 10:41:02 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 10:42:45 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-01-18 10:43:44 +0100 <timCF> I think I'll try Validation for now, at least it's clear how to replace Either in pure computations to simplify error accumulation
2022-01-18 10:44:13 +0100 <timCF> Places with side-effects more tricky of course
2022-01-18 10:45:15 +0100Vajb(~Vajb@2001:999:50:e6be:1e98:9376:d93e:4506)
2022-01-18 10:46:31 +0100 <kuribas> timCF: also checkout "these"
2022-01-18 10:47:32 +0100 <kuribas> https://hackage.haskell.org/package/these
2022-01-18 10:48:44 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2022-01-18 10:52:05 +0100 <timCF> kuribas: you mean ChronicleT?
2022-01-18 10:52:27 +0100 <kuribas> yeah, ChrincleT is the transformer version of these.
2022-01-18 10:53:02 +0100ubert1(~Thunderbi@p200300ecdf09949ebd4b43e35031000e.dip0.t-ipconnect.de) (Remote host closed the connection)
2022-01-18 10:53:28 +0100 <kuribas> ChronicleT
2022-01-18 10:53:35 +0100ksqsf(~user@134.209.106.31)
2022-01-18 10:53:43 +0100little_mac(~little_ma@2601:410:4300:3ce0:6136:2d74:4238:7594) (Remote host closed the connection)
2022-01-18 10:54:23 +0100jgeerds(~jgeerds@55d4090e.access.ecotel.net) (Ping timeout: 256 seconds)
2022-01-18 10:58:21 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 10:58:31 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 11:02:19 +0100Akiva(~Akiva@user/Akiva) (Ping timeout: 256 seconds)
2022-01-18 11:02:25 +0100 <hololeap> at least Applicatives compose, so you can get a Validation "applicative transformer"
2022-01-18 11:03:29 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 268 seconds)
2022-01-18 11:03:32 +0100 <hololeap> you're just stuck with combining results, not chaining them
2022-01-18 11:03:36 +0100alx741(~alx741@157.100.93.160) (Quit: alx741)
2022-01-18 11:04:51 +0100 <merijn> Data.Functor.Compose :)
2022-01-18 11:08:32 +0100foul_owl(~kerry@97-126-11-68.tukw.qwest.net) (Ping timeout: 240 seconds)
2022-01-18 11:10:20 +0100DNH(~DNH@2a02:8108:1100:16d8:edf9:3833:cff9:92b3)
2022-01-18 11:13:10 +0100Pickchea(~private@user/pickchea) (Ping timeout: 250 seconds)
2022-01-18 11:13:46 +0100ksqsf(~user@134.209.106.31)
2022-01-18 11:16:32 +0100xff0x(~xff0x@2001:1a81:5209:df00:1935:85e:8166:55b) (Ping timeout: 240 seconds)
2022-01-18 11:17:22 +0100xff0x(~xff0x@2001:1a81:5209:df00:5e7c:4acd:2a77:4d24)
2022-01-18 11:17:32 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 240 seconds)
2022-01-18 11:18:55 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 11:20:59 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 11:21:22 +0100arjun_(~arjun@user/arjun) (Ping timeout: 268 seconds)
2022-01-18 11:22:29 +0100foul_owl(~kerry@174-21-143-101.tukw.qwest.net)
2022-01-18 11:31:04 +0100 <hololeap> oh, hey Validation is an example of a Selective functor
2022-01-18 11:31:04 +0100Vajb(~Vajb@2001:999:50:e6be:1e98:9376:d93e:4506) (Read error: Connection reset by peer)
2022-01-18 11:31:12 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-01-18 11:31:30 +0100 <merijn> All monad and applicatives are selective
2022-01-18 11:31:42 +0100 <merijn> the real question is: Which ones have interesting selective instances :p
2022-01-18 11:31:47 +0100machinedgod(~machinedg@24.105.81.50) (Remote host closed the connection)
2022-01-18 11:32:20 +0100 <hololeap> all monads are selective, but not all applicatives, I don't think. but I haven't grokked selective yet
2022-01-18 11:32:55 +0100machinedgod(~machinedg@24.105.81.50)
2022-01-18 11:34:32 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-01-18 11:34:46 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-01-18 11:35:26 +0100 <merijn> hololeap: They are, because there's even a default implementation for Applicative :p
2022-01-18 11:36:27 +0100 <merijn> See selectA
2022-01-18 11:36:57 +0100 <merijn> The default Applicative/Monad implementation don't allow "proper" under-/overestimation
2022-01-18 11:37:04 +0100 <hololeap> yeah, I'm looking at that now. it says: We can write a function with the type signature of select using the Applicative type class, but it will always execute the effects associated with the second argument, hence being potentially less efficient.
2022-01-18 11:37:31 +0100 <merijn> hololeap: The same goes for Monad, though :)
2022-01-18 11:37:45 +0100 <hololeap> no, it shouldn't
2022-01-18 11:39:03 +0100 <hololeap> because you can peek into the contents of the monad and check if it is Left or Right, then execute the `f (a -> b)` only if it's needed
2022-01-18 11:39:53 +0100fcc977(~kaph@151.43.53.126)
2022-01-18 11:40:05 +0100ksqsf(~user@134.209.106.31)
2022-01-18 11:40:56 +0100 <merijn> Then you can't get Overapproximation, though?
2022-01-18 11:41:22 +0100 <hololeap> I don't know what that means
2022-01-18 11:41:38 +0100 <hololeap> is that from the paper?
2022-01-18 11:41:41 +0100 <merijn> hololeap: Yeah
2022-01-18 11:41:51 +0100 <hololeap> I haven't read it yet
2022-01-18 11:42:10 +0100 <hololeap> I'm just looking at the types from the module
2022-01-18 11:42:15 +0100Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2022-01-18 11:42:32 +0100 <merijn> hololeap: The point of selective is that you can inspect "what's the minimum effects guaranteed to execute" (underapproximation) vs "what is the maximum amount of effects executed?" (overapproximation)
2022-01-18 11:43:07 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds)
2022-01-18 11:43:20 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-01-18 11:43:28 +0100fcc977(~kaph@151.43.53.126) (Client Quit)
2022-01-18 11:43:41 +0100fcc977(~kaph@151.43.53.126)
2022-01-18 11:44:19 +0100 <hololeap> well, with a Monad you can choose to execute the secondary effect and discard the `a -> b` result. with an Applicative you don't have that choice
2022-01-18 11:44:56 +0100 <hololeap> the default implementation selectM just skips the execution of `y` if the inner value is Right: https://hackage.haskell.org/package/selective-0.5/docs/src/Control.Selective.html#selectM
2022-01-18 11:45:05 +0100Lord_of_Life_Lord_of_Life
2022-01-18 11:47:32 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds)
2022-01-18 11:52:28 +0100 <hololeap> instance Monoid m => Applicative (Over m) where ...
2022-01-18 11:52:46 +0100 <hololeap> how can you have a Monoid on something with the kind (Type -> Type)?
2022-01-18 11:53:05 +0100 <hololeap> oh, no `a` is just a phantom type here
2022-01-18 11:53:32 +0100kaph(~kaph@151.43.53.126)
2022-01-18 11:53:36 +0100 <hololeap> newtype Over m a = Over { getOver :: m }
2022-01-18 11:53:53 +0100aeka(~aeka@user/hiruji) (Read error: Connection reset by peer)
2022-01-18 11:54:27 +0100fcc977(~kaph@151.43.53.126) (Ping timeout: 256 seconds)
2022-01-18 11:56:55 +0100kaph(~kaph@151.43.53.126) (Read error: Connection reset by peer)
2022-01-18 11:57:11 +0100aeka(~aeka@user/hiruji)
2022-01-18 11:58:23 +0100kaph(~kaph@151.43.53.126)
2022-01-18 11:59:48 +0100 <hololeap> this seems like it could be interesting, although I don't quite understand it at the moment: https://hackage.haskell.org/package/selective-0.5/docs/src/Control.Selective.html#line-421
2022-01-18 12:00:57 +0100fef(~thedawn@user/thedawn) (Remote host closed the connection)
2022-01-18 12:01:24 +0100alx741(~alx741@157.100.93.160)
2022-01-18 12:03:00 +0100kaph(~kaph@151.43.53.126) (Remote host closed the connection)
2022-01-18 12:03:09 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net)
2022-01-18 12:03:35 +0100 <leibniz> hi, is anyone online? i was asking something the other day but there was noone around
2022-01-18 12:03:54 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-01-18 12:04:01 +0100 <hololeap> 732
2022-01-18 12:04:23 +0100 <leibniz> similar to the number online then, i guess many are not infact real users
2022-01-18 12:04:49 +0100 <leibniz> someone suggested it would be more likely to find actual people during the daytime
2022-01-18 12:05:42 +0100 <leibniz> im just trying to find the question i asked in the logs, hang on
2022-01-18 12:06:44 +0100 <geekosaur> many are real users, but IRC is 24/7 and people are around according to their timezones/work schedules
2022-01-18 12:07:39 +0100 <leibniz> sorry i got distracted looking up Control.Selective which hololeap mentioned
2022-01-18 12:09:16 +0100 <Axman6> leibniz: you definitely qwon't get any help if you dson't ask your question :)
2022-01-18 12:09:39 +0100 <leibniz> i cant find it in the logs...
2022-01-18 12:09:52 +0100 <hololeap> ax the axman
2022-01-18 12:09:56 +0100 <leibniz> i probably didnt phrase it all that well anyway, i could try again i suppose
2022-01-18 12:10:32 +0100 <leibniz> so you need to start with a listlike thing that has the tail wrapped in a monad
2022-01-18 12:10:45 +0100 <leibniz> then you cant write a "lazy traverse" instance
2022-01-18 12:11:01 +0100 <leibniz> since not all applicatives commute with the monad
2022-01-18 12:11:08 +0100 <Axman6> sounds just like the various streaming/iteratee libraries
2022-01-18 12:11:08 +0100 <leibniz> im wondering about this phenomina
2022-01-18 12:11:42 +0100kaph(~kaph@151.43.53.126)
2022-01-18 12:11:53 +0100 <leibniz> the proposal is that for these monadically wrapped tail lists, that there should be something other than traverse
2022-01-18 12:12:08 +0100 <leibniz> its much more high level as a consideration than a streaming library
2022-01-18 12:12:24 +0100 <Axman6> they're all essentially some variiation of data Step m a r = Done r | Step a (m (Step m a r)
2022-01-18 12:12:35 +0100 <leibniz> exactly
2022-01-18 12:12:54 +0100 <Axman6> do you have example of the type you're talking about?
2022-01-18 12:12:56 +0100 <leibniz> listT done right, i have seen it called
2022-01-18 12:13:04 +0100 <hololeap> logict?
2022-01-18 12:13:43 +0100 <leibniz> data MList' m a = MNil | a `MCons` MList m a
2022-01-18 12:13:44 +0100 <leibniz> type MList m a = m (MList' m a)
2022-01-18 12:13:44 +0100 <leibniz> newtype ListT m a = ListT { runListT :: MList m a }
2022-01-18 12:13:54 +0100 <leibniz> from; https://wiki.haskell.org/ListT_done_right
2022-01-18 12:14:33 +0100 <Axman6> that's essentially what Step above is
2022-01-18 12:14:48 +0100 <leibniz> hololeap: thats; (a -> m r -> m r) -> m r -> m r
2022-01-18 12:14:57 +0100 <leibniz> not sure that is the same
2022-01-18 12:15:29 +0100 <Axman6> the only difference is the Done r
2022-01-18 12:15:31 +0100 <leibniz> seems like a continuation wrapping a head value somehow
2022-01-18 12:15:42 +0100 <leibniz> Axman6: sure, yours would have an instance
2022-01-18 12:15:59 +0100 <leibniz> basically the idea is that any monadically wrapped tail thing should
2022-01-18 12:16:04 +0100 <leibniz> if its strictly infinite even
2022-01-18 12:16:07 +0100 <leibniz> etc.
2022-01-18 12:16:35 +0100newsham(~newsham@2603-800c-2d00-e994-c564-1d76-1f18-c3ec.res6.spectrum.com) (Quit: Client closed)
2022-01-18 12:16:43 +0100 <leibniz> oh right, yours is nonempty
2022-01-18 12:17:11 +0100 <leibniz> anyway, i cant quite communicate this properly
2022-01-18 12:17:18 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 250 seconds)
2022-01-18 12:17:24 +0100 <leibniz> and i dont think i would be able to write a coherent proposal for the class
2022-01-18 12:17:29 +0100 <Axman6> well, it would be empty if you got rid of the monadic return value r thst most streaming libraries provide because it's often useful
2022-01-18 12:17:42 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 12:17:44 +0100 <hololeap> if I understand logict correctly, (a -> m r -> m r) corresponds to MCons, and the second (m r) corresponds to (m MNil),
2022-01-18 12:18:25 +0100 <hololeap> I might be wrong there
2022-01-18 12:18:34 +0100 <leibniz> yeah, so its like a continuation right? it says, "given a constructor and a list, ill give you back a new list" presumably acting as a continuation over the head
2022-01-18 12:19:31 +0100 <leibniz> i guess i should check its instances to see if thats actually what its doing, but in any case, i dont think it seems like the same thing as ListT or Axmans nonempty version
2022-01-18 12:19:33 +0100alMalsamo(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 276 seconds)
2022-01-18 12:19:47 +0100 <hololeap> I think (a -> m r -> m r) is the success continuation and the second (m r) is the failure case
2022-01-18 12:20:10 +0100 <leibniz> what makes you suggest it here?
2022-01-18 12:20:15 +0100 <Axman6> yeah, that's just the... church encoding of the type above, roughly speaking
2022-01-18 12:20:20 +0100 <leibniz> ah ok
2022-01-18 12:20:25 +0100 <leibniz> so it should have an instance also
2022-01-18 12:20:29 +0100 <Axman6> they are equivallent
2022-01-18 12:20:30 +0100 <hololeap> because it's literally been called ListT done right
2022-01-18 12:20:34 +0100 <Axman6> -ish
2022-01-18 12:20:37 +0100 <leibniz> fair
2022-01-18 12:20:54 +0100 <leibniz> sure, if its an instance of the class, no problem
2022-01-18 12:20:57 +0100 <Axman6> basially all the streaming libraries are some variation of the ListT done right idea
2022-01-18 12:21:06 +0100 <leibniz> im sure there are are a bunch of equivalent encodings
2022-01-18 12:21:22 +0100 <leibniz> the point is to work at the class level to encapsulate all of them under the same abstraction
2022-01-18 12:21:29 +0100arjun_(~arjun@user/arjun)
2022-01-18 12:21:50 +0100 <leibniz> Axman6: i just dont see how its a "library" its more like a Functor, its a class
2022-01-18 12:22:11 +0100 <leibniz> calling it a library is kind of dismising it as a fundamental thing
2022-01-18 12:22:38 +0100 <leibniz> and not having the correct abstraction presented formally means its rewritten needlessly
2022-01-18 12:22:46 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-01-18 12:23:08 +0100 <Axman6> I think that's because the details of implementation matter when you care about performance
2022-01-18 12:23:23 +0100 <hololeap> you would have to look into the differences between e.g. conduit and pipes. I'm not sure they have such a common interface
2022-01-18 12:23:23 +0100 <leibniz> the point is that we can give the monadically wrapped tail things Functor instances, etc, but fail at Traverse
2022-01-18 12:23:33 +0100 <hololeap> there is
2022-01-18 12:23:36 +0100 <hololeap> @hackage streaming-commons
2022-01-18 12:23:36 +0100 <lambdabot> https://hackage.haskell.org/package/streaming-commons
2022-01-18 12:23:42 +0100 <hololeap> but I doubt that's what you want
2022-01-18 12:24:01 +0100 <leibniz> im trying to formulate a proposal
2022-01-18 12:24:13 +0100 <leibniz> for a class similar to Traverse
2022-01-18 12:24:41 +0100 <leibniz> that takes into account this thing about the Applicative and Monad not commuting and this messing up lazyness
2022-01-18 12:24:41 +0100 <hololeap> well, even Traverse doesn't specify if its instance is lazy or eager in the implementation
2022-01-18 12:25:30 +0100 <leibniz> the point is that it would be blocking in a blocking tail call, eg if evaluating the tail called a server in realtime to get the next value
2022-01-18 12:25:51 +0100 <leibniz> you need lazyness for them to compose - to get the "algebra"
2022-01-18 12:26:28 +0100 <leibniz> since really you should be able to pass the heads as they are made available, through several traverse like opperations
2022-01-18 12:27:12 +0100 <Axman6> what is the type of functions you want to travewrse with? just a -> m b?
2022-01-18 12:27:13 +0100 <leibniz> but unless the constructor and the applicative in the traversal commute, which they dont in general, because of the monad, then this is not possible
2022-01-18 12:28:11 +0100 <leibniz> Axman6: i can see two options, either you demand the monad and applicative commute, and just use the types as they appear in traverse
2022-01-18 12:28:14 +0100 <leibniz> :t traverse
2022-01-18 12:28:15 +0100 <lambdabot> (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
2022-01-18 12:28:37 +0100 <leibniz> or you specialise Applicative f to be StateL
2022-01-18 12:28:49 +0100 <leibniz> and just have mapAccumL
2022-01-18 12:28:52 +0100 <leibniz> :t mapAccumL
2022-01-18 12:28:53 +0100 <lambdabot> Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
2022-01-18 12:29:01 +0100 <leibniz> as the thing you need to implement for the class
2022-01-18 12:29:23 +0100 <hololeap> it sounds like you're talking about three different types here. a Traversable, an Applicative, and a Monad... but the combinators you've mentioned only have two of those
2022-01-18 12:29:45 +0100 <leibniz> obviously the monadic context allows some generalization, ie (a -> b -> m (a, c))
2022-01-18 12:30:46 +0100waleee-cl(~waleee@2001:9b0:21d:fc00:398f:b003:b90d:acf4)
2022-01-18 12:31:02 +0100coot(~coot@89-64-85-93.dynamic.chello.pl) (Quit: coot)
2022-01-18 12:31:08 +0100 <leibniz> hololeap: Traversable requires that the deconstructed head is returned into an applicative, which are then sequenced together. however, for the traverse instance, the constructor is mapped into the applicative, and unless you want to sequence together all the applicatives (not lazy) to then be able to chain togther all the constructors
2022-01-18 12:31:25 +0100 <leibniz> then you need to comute the constructor with the applicative, and then the monad and applicative need to comute
2022-01-18 12:32:02 +0100 <hololeap> what makes you think that sequencing applicatives isn't ever lazy?
2022-01-18 12:32:15 +0100kaph(~kaph@151.43.53.126) (Read error: Connection reset by peer)
2022-01-18 12:32:52 +0100 <leibniz> the point is that you either need the monad and applicative to commute, or that the "applicatives can be sequenced lazyily" as you suggest... though im not too sure about this
2022-01-18 12:33:00 +0100 <leibniz> basicall i know it works with StateL
2022-01-18 12:33:26 +0100 <hololeap> also, where is Monad coming into this. traverse just mentions Traversable and Applicative
2022-01-18 12:33:45 +0100 <leibniz> and this specialised/restricted behaviour is enough to make it nice and useful
2022-01-18 12:33:54 +0100 <leibniz> hololeap: the monad wraps the tail
2022-01-18 12:34:37 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
2022-01-18 12:34:43 +0100 <hololeap> hm, are you sure that the functor wrapping the tail needs to be a monad for this to work?
2022-01-18 12:34:44 +0100 <leibniz> Monda m => t m a
2022-01-18 12:34:49 +0100__monty__(~toonn@user/toonn)
2022-01-18 12:34:58 +0100alMalsamo(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-01-18 12:35:00 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2022-01-18 12:35:10 +0100 <leibniz> i guess there is no actual requirement for it to be a monad.
2022-01-18 12:35:21 +0100 <hololeap> because applicatives always compose, which seems to be the issue you're worried about
2022-01-18 12:35:34 +0100 <hololeap> I'd have to work this out by hand to see what you're talking about specifically
2022-01-18 12:35:38 +0100kaph(~kaph@151.43.53.126)
2022-01-18 12:36:03 +0100 <leibniz> you want to not have to sequence together all the applicatives all the way to the basecase of a potentially infinte stream
2022-01-18 12:36:15 +0100 <leibniz> in order to start composing together the constructors
2022-01-18 12:36:40 +0100 <leibniz> you want each head in turn to be available to subsequent traversals
2022-01-18 12:36:51 +0100 <leibniz> this being basically "lazyness"
2022-01-18 12:37:13 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 268 seconds)
2022-01-18 12:37:13 +0100 <leibniz> at some point you need the "monad" and applicative to commute
2022-01-18 12:38:10 +0100 <leibniz> hololeap; i guess you would run into the issue trying to get a monoidally composable traverse like opperation for monadically wrapped tails in a strictly infinite stream
2022-01-18 12:39:16 +0100 <leibniz> im not sure whats the correct way to present it though, either you require the commutation opperation is made available by a superclass
2022-01-18 12:39:39 +0100 <leibniz> or you just restrict the arbitrary applicative in traverse to StateL and just work with mapAccumL opperations
2022-01-18 12:39:52 +0100 <hololeap> so we are talking about some structure that looks like this: x : m ( y : m ( z : m [] ) )
2022-01-18 12:39:59 +0100 <leibniz> yes
2022-01-18 12:43:16 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-01-18 12:43:45 +0100kaph(~kaph@151.43.53.126) (Ping timeout: 256 seconds)
2022-01-18 12:44:51 +0100 <leibniz> im not sure how to move the discussion along, i guess it would be good to see someone else understand where the snag of commutation arises
2022-01-18 12:45:19 +0100 <hololeap> I'm trying to translate this into free monads if possible, because that might give some insight
2022-01-18 12:45:51 +0100 <leibniz> oh, ok
2022-01-18 12:48:56 +0100 <hololeap> Free (Compose ((,) x) m) () -- this is what it seems to be equivalent to, but the insight fizzled. probably because I still don't understand the problem correctly. maybe write up some code demonstrating what you're trying to do
2022-01-18 12:49:18 +0100 <hololeap> sorry, I've got limited energy right now
2022-01-18 12:50:47 +0100Erutuon(~Erutuon@user/erutuon) (Ping timeout: 268 seconds)
2022-01-18 12:51:09 +0100 <leibniz> not a problem
2022-01-18 12:51:33 +0100 <leibniz> i guess you could use Cofree aswell
2022-01-18 12:51:53 +0100 <leibniz> anyway, its not really an issue of which representation you use for the monadically wrapped tail thing
2022-01-18 12:52:21 +0100 <leibniz> more of how to present the class that all of these instantiate
2022-01-18 12:52:34 +0100 <hololeap> I just don't see the connection between the monads composing and the lazy/eager issue
2022-01-18 12:52:51 +0100 <leibniz> i cant tell if i should propose the version with the applicative restricted to StateL or the version with a commutation relation via a superclass
2022-01-18 12:53:26 +0100 <leibniz> hololeap: i guess since they are only monads as an artefact of using IO as m, to demonstraite how with a "blocking" class
2022-01-18 12:53:29 +0100 <leibniz> call*
2022-01-18 12:53:42 +0100 <leibniz> that the basecase would be inaccessible
2022-01-18 12:53:42 +0100cheater(~Username@user/cheater) (Ping timeout: 250 seconds)
2022-01-18 12:54:04 +0100 <leibniz> its the applicative that compise
2022-01-18 12:54:07 +0100 <leibniz> compose*
2022-01-18 12:54:17 +0100 <leibniz> the monadic bind opperation isnt actually used i dont think
2022-01-18 12:55:00 +0100 <leibniz> maybe it is somewhere, eg to flatten down a double nesting if the function returns the result in a monad aswell
2022-01-18 12:55:16 +0100 <hololeap> I need to get some sleep, but good luck with your proposal
2022-01-18 12:55:19 +0100 <sshine> what's the GHC extension that implies that nested type signatures refer to the parent variable if there isn't an explicit 'forall' in the inner type signature?
2022-01-18 12:55:25 +0100 <sshine> ScopedTypeVariables?
2022-01-18 12:55:27 +0100 <leibniz> (Applicative f,Monad m) => a -> m (f a)
2022-01-18 12:56:04 +0100 <leibniz> sshine: no you need an outer forall for that to work
2022-01-18 12:56:11 +0100 <hololeap> sshine: probably RankNTypes
2022-01-18 12:56:53 +0100SummerSonw(~The_viole@203.77.49.232)
2022-01-18 12:56:56 +0100 <leibniz> oh right, yes, you can ommit the forall on the inner type signature in a where block, nested like you say. its both RankNTypes and ScopedTypeVariables in combination
2022-01-18 12:57:11 +0100coot(~coot@89-64-85-93.dynamic.chello.pl)
2022-01-18 12:57:47 +0100 <leibniz> hololeap: ok thanks for your help
2022-01-18 12:58:05 +0100 <leibniz> i wonder if Axman is still online, im not sure if anyone managed to follow what i was writing
2022-01-18 13:02:15 +0100 <hololeap> try to work out a signature for your function first... would it be: (Traversable t, Applicative f, Monad m) => (a -> f b) -> t m a -> f (t m b) ?
2022-01-18 13:02:28 +0100 <hololeap> anyway, gnight
2022-01-18 13:03:02 +0100 <leibniz> (Traversable t, Applicative f, Monad m,Commutes f m) => (a -> m (f b)) -> t m a -> f (t m b)
2022-01-18 13:03:22 +0100 <leibniz> or, setting f ~ StateL, and using mapAccumL
2022-01-18 13:03:27 +0100 <leibniz> :t mapAccumL
2022-01-18 13:03:28 +0100 <lambdabot> Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
2022-01-18 13:03:50 +0100 <leibniz> Traversable t => (a -> b ->m  (a, c)) -> a -> t m b -> (a, t m c)
2022-01-18 13:04:01 +0100 <leibniz> erp, not Traversable
2022-01-18 13:04:04 +0100Midjak(~Midjak@may53-1-78-226-116-92.fbx.proxad.net)
2022-01-18 13:04:15 +0100 <leibniz> whatever this new class would be called
2022-01-18 13:04:21 +0100 <sshine> https://gist.github.com/sshine/8f350c862a1e49a1e7a3e1fca5bd12b6 -- 'employee' and 'skill' were originally fixed types, and I'd like to parameterise them. but somehow unification fails. I'm not sure if the Ord constraints are messing it up, or what.
2022-01-18 13:06:31 +0100 <leibniz> sshine: does it still throw an error if you enable AllowAmbiguousTypes?
2022-01-18 13:07:06 +0100 <sshine> leibniz, yes.
2022-01-18 13:07:13 +0100 <leibniz> or a functional dependecy stating that skill can be determined from employee
2022-01-18 13:07:32 +0100 <sshine> I'm not sure how to express that.
2022-01-18 13:07:47 +0100 <sshine> I thought I didn't have to express functional dependencies for this.
2022-01-18 13:08:29 +0100 <leibniz> it seems like it cant infer skill in the return type from employee in the input type
2022-01-18 13:09:06 +0100 <leibniz> i would have thought that with ApplowAmbiguousTypes you could just specify both with a typeApplication
2022-01-18 13:09:29 +0100 <leibniz> s/typo/notypo
2022-01-18 13:10:25 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 13:11:03 +0100 <leibniz> the fundep is for a class, my mistake sorry
2022-01-18 13:11:18 +0100 <leibniz> maybe injective types?
2022-01-18 13:14:55 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 256 seconds)
2022-01-18 13:15:55 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 13:16:06 +0100 <leibniz> aha
2022-01-18 13:16:14 +0100 <leibniz> you need a type application on "staff"
2022-01-18 13:18:07 +0100 <leibniz> er, or somewhere else, since staff actually has the correct "skill" and something else is expecting an arbitrary skill
2022-01-18 13:18:32 +0100 <leibniz> im guessing Set.empty
2022-01-18 13:20:45 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-01-18 13:21:12 +0100 <leibniz> erg! it was your foralls!
2022-01-18 13:21:23 +0100 <leibniz> you need to have them in one forall statement for some reason!
2022-01-18 13:22:02 +0100 <leibniz> such a weird error, its a bug?
2022-01-18 13:22:21 +0100 <leibniz> sshine^
2022-01-18 13:23:27 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net) (Quit: Connection closed)
2022-01-18 13:25:02 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 13:25:16 +0100arjun_(~arjun@user/arjun) (Remote host closed the connection)
2022-01-18 13:25:28 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 13:27:10 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 13:27:42 +0100cosimone(~user@93-47-230-83.ip115.fastwebnet.it)
2022-01-18 13:29:50 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 13:30:30 +0100geranim0(~geranim0@modemcable242.171-178-173.mc.videotron.ca)
2022-01-18 13:31:48 +0100jkaye(~jkaye@2601:281:200:1958:8e74:ef22:c471:c2e)
2022-01-18 13:33:57 +0100cheater(~Username@user/cheater)
2022-01-18 13:35:36 +0100slack1256(~slack1256@186.11.99.46)
2022-01-18 13:38:16 +0100slac19759(~slack1256@191.125.99.76) (Ping timeout: 268 seconds)
2022-01-18 13:43:24 +0100stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 276 seconds)
2022-01-18 13:43:57 +0100echoone(~echoone@188.74.32.13)
2022-01-18 13:45:36 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-01-18 13:46:04 +0100xlei_(~akans@pool-71-125-19-142.nycmny.fios.verizon.net)
2022-01-18 13:46:51 +0100xlei_(~akans@pool-71-125-19-142.nycmny.fios.verizon.net) (Client Quit)
2022-01-18 13:47:42 +0100caro_(~caro@212.83.144.58)
2022-01-18 13:47:47 +0100xlei(~akans@pool-71-125-19-142.nycmny.fios.verizon.net) (Ping timeout: 256 seconds)
2022-01-18 13:48:13 +0100xlei_(~akans@pool-71-125-19-142.nycmny.fios.verizon.net)
2022-01-18 13:48:19 +0100fef(~thedawn@user/thedawn)
2022-01-18 13:48:59 +0100caro_caro
2022-01-18 13:49:32 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds)
2022-01-18 13:50:52 +0100ksqsf(~user@134.209.106.31)
2022-01-18 13:51:29 +0100jackson99(~bc8147f2@cerf.good1.com) (Quit: CGI:IRC (Session timeout))
2022-01-18 13:53:31 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 13:55:53 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 13:56:11 +0100stiell_(~stiell@gateway/tor-sasl/stiell)
2022-01-18 13:56:24 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd) (Ping timeout: 276 seconds)
2022-01-18 13:56:44 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd)
2022-01-18 13:57:34 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk)
2022-01-18 13:58:00 +0100max22-(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr) (Ping timeout: 268 seconds)
2022-01-18 14:07:49 +0100ksqsf(~user@134.209.106.31)
2022-01-18 14:08:21 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 256 seconds)
2022-01-18 14:08:22 +0100Pickchea(~private@user/pickchea)
2022-01-18 14:08:32 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk) (Remote host closed the connection)
2022-01-18 14:13:25 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 14:15:55 +0100slowButPresent(~slowButPr@user/slowbutpresent)
2022-01-18 14:16:32 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net)
2022-01-18 14:17:02 +0100 <leibniz> so how do you open a proposal anyway?
2022-01-18 14:18:45 +0100ksqsf(~user@134.209.106.31)
2022-01-18 14:19:42 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 14:21:45 +0100fef(~thedawn@user/thedawn) (Ping timeout: 276 seconds)
2022-01-18 14:23:35 +0100kaph(~kaph@net-2-47-208-144.cust.vodafonedsl.it)
2022-01-18 14:23:50 +0100 <leibniz> i was hoping to get some feedback on which was the best way to phrase it before doing so though
2022-01-18 14:23:59 +0100rusrushal13(~rusrushal@2401:4900:4471:78e2:d490:6737:3704:78a1)
2022-01-18 14:24:19 +0100SummerSonw(~The_viole@203.77.49.232) (Quit: Leaving)
2022-01-18 14:24:29 +0100 <tomsmeding> a ghc implementation proposal?
2022-01-18 14:24:31 +0100 <leibniz> basically the "refine the applicative to StateL" version, or "allow all applicatives that commute with the tails monad" version
2022-01-18 14:24:37 +0100SummerSonw(~The_viole@203.77.49.232)
2022-01-18 14:24:38 +0100 <leibniz> tomsmeding: yeah
2022-01-18 14:24:45 +0100 <tomsmeding> look here https://github.com/ghc-proposals/ghc-proposals
2022-01-18 14:24:48 +0100 <leibniz> thanks
2022-01-18 14:25:45 +0100SummerSonw(~The_viole@203.77.49.232) (Client Quit)
2022-01-18 14:25:48 +0100echoone(~echoone@188.74.32.13) (Quit: Client closed)
2022-01-18 14:26:17 +0100 <leibniz> hmm, it doesnt seem like a new Prelude class is one of the types of thing that a proposal is for
2022-01-18 14:26:50 +0100xkuru(~xkuru@user/xkuru) (Read error: Connection reset by peer)
2022-01-18 14:27:06 +0100 <tomsmeding> leibniz: maybe here? https://github.com/haskell-core/core-libraries-proposals
2022-01-18 14:27:09 +0100 <jkaye> leibniz, Would that not be more of a library change than a GHC change?
2022-01-18 14:27:21 +0100 <jkaye> tomsmeding, Yep just what I was thinking
2022-01-18 14:27:21 +0100 <leibniz> yeah
2022-01-18 14:27:25 +0100 <leibniz> thanks
2022-01-18 14:27:27 +0100SummerSonw(~The_viole@203.77.49.232)
2022-01-18 14:27:35 +0100 <merijn> leibniz: What class would that be?
2022-01-18 14:27:57 +0100 <merijn> leibniz: Also, changes to Prelude are fairly unpopular because they affect nearly all code
2022-01-18 14:28:12 +0100 <leibniz> its just another class... shouldnt be a breaking change
2022-01-18 14:28:19 +0100 <leibniz> depends which version, the commuting type i havent actually been using so i dont have a name for
2022-01-18 14:28:34 +0100 <tomsmeding> another class _is_ a breaking change, for user code that used that same name for something else :)
2022-01-18 14:28:38 +0100 <leibniz> the version which requires the user to implement a monadic version of mapAccumL im calling a Scanner
2022-01-18 14:28:48 +0100 <merijn> leibniz: If that classes' name conflicts with anything in existing code, it *is* breaking
2022-01-18 14:29:04 +0100 <tomsmeding> might want to consider putting it not in Prelude, but somewhere else in base
2022-01-18 14:29:11 +0100 <tomsmeding> then it's not a breaking change
2022-01-18 14:29:12 +0100 <leibniz> tomsmeding: ok, modulo naming conflicts... oh right, i guess you cant guarantee the name is unused. guess a hackage search could show up any conflicts though
2022-01-18 14:29:13 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2022-01-18 14:29:20 +0100 <tomsmeding> (I didn't read any of the stuff before in this channel, sorry)
2022-01-18 14:29:23 +0100 <merijn> leibniz: You are introducing a new typename/function names in the global scope of every program//library without an explicit Prelude
2022-01-18 14:29:29 +0100 <merijn> leibniz: But why prelude?
2022-01-18 14:29:38 +0100 <leibniz> because its basically Traverse
2022-01-18 14:29:40 +0100 <merijn> leibniz: Why not in a different module in base?
2022-01-18 14:29:46 +0100 <leibniz> ie, its about as high level as you can get
2022-01-18 14:30:05 +0100 <leibniz> sure, maybe eg. Data.Scanner or something
2022-01-18 14:30:19 +0100 <merijn> Traversable in Prelude was already controversial and that one was widely used before the change :p
2022-01-18 14:30:19 +0100 <leibniz> idk how to ensure its shipped with base though
2022-01-18 14:30:36 +0100 <leibniz> its quite category theoretic
2022-01-18 14:30:39 +0100 <leibniz> things like Functor
2022-01-18 14:30:54 +0100 <leibniz> basicaly formalising the abstraction of map for regular lists
2022-01-18 14:31:03 +0100 <merijn> leibniz: Will this class a superclass of existing stuff in base?
2022-01-18 14:31:04 +0100 <leibniz> this is along those lines
2022-01-18 14:31:27 +0100 <merijn> If not, then it could just as easily be outside of base, though
2022-01-18 14:31:30 +0100 <leibniz> merijn: im not sure, i dont think so since it requires an extra parameter
2022-01-18 14:31:51 +0100 <merijn> @hackage witherable
2022-01-18 14:31:51 +0100 <lambdabot> https://hackage.haskell.org/package/witherable
2022-01-18 14:31:59 +0100 <leibniz> its kind of like Monad m => Traversable (f m)
2022-01-18 14:32:01 +0100 <merijn> leibniz: i.e. why couldn't it be a separate package like witherable?
2022-01-18 14:32:24 +0100 <leibniz> functor ships with base though?
2022-01-18 14:32:30 +0100 <leibniz> thats the proposal
2022-01-18 14:32:36 +0100 <leibniz> that it qualifies for that kind of status
2022-01-18 14:32:51 +0100 <leibniz> otherwise it would just be a library, i guess thats what im having to defend
2022-01-18 14:33:02 +0100 <leibniz> but cant argue more than just its formal centrality
2022-01-18 14:33:08 +0100 <merijn> leibniz: Making base bigger is a rather unpopular idea
2022-01-18 14:33:35 +0100 <leibniz> if it was missing something like Functor, im sure it would be addapted despite this
2022-01-18 14:33:36 +0100 <merijn> leibniz: Because the bigger base is, the more often breaking changes happen, so we either have to accept "base continually breaking"
2022-01-18 14:33:46 +0100 <merijn> or "stuff doesn't change because it'd break base"
2022-01-18 14:33:55 +0100 <leibniz> ok, well this wasnt discovered before
2022-01-18 14:33:56 +0100fef(~thedawn@user/thedawn)
2022-01-18 14:34:10 +0100 <leibniz> its unlikely it will need to be added again either
2022-01-18 14:34:36 +0100 <leibniz> sorry if that seems like a strange argument. but i cant exactly predict "no similar discoveries will occur"
2022-01-18 14:34:49 +0100 <leibniz> and can only argue that this is fundamental enough
2022-01-18 14:34:55 +0100 <leibniz> which i guess is debatable
2022-01-18 14:36:01 +0100 <leibniz> if it "started a trend of inflating base", i guess as long as it was sufficiently justified, this wouldnt be a bad thing
2022-01-18 14:36:16 +0100 <leibniz> "search for higher order formalisms"
2022-01-18 14:36:26 +0100 <ksqsf> base is already a big mudball; i kinda hope there will be a base 5 rewrite :]
2022-01-18 14:37:42 +0100 <leibniz> my main reason for approaching the committee is because i cant argue these rationalisations, or design the library sufficiently to have it accepted
2022-01-18 14:37:47 +0100 <leibniz> alone
2022-01-18 14:37:49 +0100 <geekosaur> we already had one split base,m maybe it's time for another
2022-01-18 14:38:47 +0100 <leibniz> i dont want to get into the details too much, but i have reason to believe this to be a very high order abstraction, based on some theorems to do with isomorphic containers
2022-01-18 14:39:20 +0100 <leibniz> something like "the monad on the tail can contain the structure directing index required for shaped pattern matching"
2022-01-18 14:41:15 +0100 <leibniz> which is where (for anything (traversable containers?) more shaped than lists, eg trees)  you need extra data on the constructor to retain the shape during traversal implemented by pattern matching on a head/tail opperation (the structure directing index is required as an argument to the constructor)
2022-01-18 14:41:18 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk)
2022-01-18 14:41:37 +0100 <leibniz> since the monadic tail thing subsumes this, and thats a pretty high level thing, i guess that makes this super high level
2022-01-18 14:42:01 +0100 <leibniz> "its really a thing" => "it should go in base"
2022-01-18 14:42:10 +0100 <lortabac> leibniz: if it can technically be implemented as a new library, I'd do it as a library anyway
2022-01-18 14:42:21 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 256 seconds)
2022-01-18 14:42:25 +0100 <leibniz> point is that would have me doing it alone
2022-01-18 14:42:48 +0100 <leibniz> id rather kind of consult on the design of a proposal and have people that can do things properly do it
2022-01-18 14:42:53 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2022-01-18 14:43:11 +0100 <tomsmeding> the advantage of writing a library is that you can completely rewrite it when you get new insight :)
2022-01-18 14:43:19 +0100 <leibniz> might seem like a cop out, but i think its both complex and important enough to have it done by pros, instead of me
2022-01-18 14:43:20 +0100 <tomsmeding> for example insight from other people
2022-01-18 14:43:43 +0100 <tomsmeding> I think a proposal for including stuff in base would be stronger anyway if there is an existing implementation that people can look at
2022-01-18 14:43:44 +0100 <lortabac> in any case it's better to make a library, then it can be moved to base if it becomes popular enough
2022-01-18 14:43:46 +0100 <leibniz> iv written it several times, at this point im suggesting a proposal that would involve the GHC team
2022-01-18 14:44:20 +0100 <leibniz> lortabac: i think thats whats being debated, i disagree, i think infact that assertion is whats preventing its acceptance
2022-01-18 14:44:41 +0100 <merijn> "the GHC team" always makes me think that people think GHC has a whole lot more people than it does :p
2022-01-18 14:44:51 +0100 <leibniz> ok "you lot"
2022-01-18 14:45:05 +0100 <leibniz> :-/
2022-01-18 14:45:15 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 14:45:28 +0100 <tomsmeding> I feel like the best way to continue would be to write up what you think, and post it in this channel, on reddit and perhaps on haskell weekly, and get discussions going
2022-01-18 14:45:52 +0100 <leibniz> did you see the presentation in the scrollup?
2022-01-18 14:46:04 +0100 <tomsmeding> if you feel like you're to a point where you think "this is a good idea and it should be implemented in this form", make a proposal
2022-01-18 14:46:08 +0100 <tomsmeding> no sorry lol
2022-01-18 14:46:12 +0100 <leibniz> right...
2022-01-18 14:46:16 +0100 <tomsmeding> hence my point, make a writeup in one document
2022-01-18 14:46:23 +0100 <leibniz> im saying i cant
2022-01-18 14:46:39 +0100 <leibniz> i have the theoretical results but cant write well enough
2022-01-18 14:47:08 +0100 <leibniz> which is difficult for both myself and the comunity, since neither party actually benifits from the existence of the results
2022-01-18 14:48:05 +0100 <leibniz> this is why i was asking for "help drfing a proposal"
2022-01-18 14:48:17 +0100 <leibniz> drafting*
2022-01-18 14:49:23 +0100 <leibniz> tomsmeding: also, its stateable in one line
2022-01-18 14:50:52 +0100 <leibniz> "my thing is either a refinement over traverse, to the StateL Applicative, for monadically wrapped tail list-like things, or its a requirement that a more general applicative comute with the monad, to ensure the lazy traversability permits monoidal composition in a blocking monadic streaming setting for example"
2022-01-18 14:50:58 +0100 <leibniz> or various similar presentations
2022-01-18 14:51:48 +0100 <leibniz> "scanner algebras" result from the version refining the applicative to StateL, idk much about the general version with the commuting
2022-01-18 14:51:51 +0100 <tomsmeding> sounds interesting but still very abstract
2022-01-18 14:52:06 +0100 <tomsmeding> "I have the theoretical results" sounds like you have some more mathematical results; is that true?
2022-01-18 14:53:17 +0100 <leibniz> theres some theorems like "everything of a certain style is isomorphic to free lists - so basically is trees, so thats what you want structure directing indexes for, and abstractions that subsume these"
2022-01-18 14:53:26 +0100 <leibniz> the theorem being the isomorphic to trees statement
2022-01-18 14:54:22 +0100 <leibniz> "theoretically, this is important" ... :-/
2022-01-18 14:54:39 +0100 <leibniz> sorry...
2022-01-18 14:55:28 +0100 <lortabac> I'd suggest this: if you have some mathematical insights to share, write a blog post; if you have an implementation, write a library; if you have a vague intuition that needs to be refined, write a post on Reddit
2022-01-18 14:56:03 +0100 <leibniz> so basically you suggest not approaching it directly on the active channel, and presenting it in a way which i have stated i cannot
2022-01-18 14:56:04 +0100 <leibniz> thanks!
2022-01-18 14:56:09 +0100 <leibniz> i think i should go
2022-01-18 14:56:20 +0100cosimone(~user@93-47-230-83.ip115.fastwebnet.it) (Remote host closed the connection)
2022-01-18 14:56:27 +0100 <leibniz> perhaps these results, at some point, can be written by someone other than myself
2022-01-18 14:56:31 +0100 <leibniz> peace
2022-01-18 14:56:33 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net) (Quit: Connection closed)
2022-01-18 14:56:40 +0100 <tomsmeding> ideas like these typically benefit from writing some kind of exposition, and feedbacking a fixed piece of text
2022-01-18 14:56:40 +0100 <tomsmeding> oh
2022-01-18 14:56:47 +0100 <tomsmeding> o/
2022-01-18 14:57:10 +0100 <yushyin> oO
2022-01-18 15:01:24 +0100alx741(~alx741@157.100.93.160)
2022-01-18 15:04:41 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 15:04:46 +0100 <ksqsf> :( ghc doesn't let me use 𝟙 as an identifier
2022-01-18 15:05:29 +0100 <geekosaur> > generalCategory '𝟙'
2022-01-18 15:05:31 +0100 <lambdabot> DecimalNumber
2022-01-18 15:07:50 +0100 <ksqsf> it's not a number anyway
2022-01-18 15:08:08 +0100 <geekosaur> > 𝟙
2022-01-18 15:08:09 +0100 <lambdabot> <hint>:1:1: error: lexical error at character '\120793'
2022-01-18 15:08:18 +0100neurocyte091709(~neurocyte@user/neurocyte) (Ping timeout: 268 seconds)
2022-01-18 15:08:34 +0100neurocyte0917090(~neurocyte@user/neurocyte)
2022-01-18 15:08:35 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 15:08:46 +0100 <geekosaur> interesting the category is number but you can't use it as one
2022-01-18 15:11:42 +0100michalz(~michalz@185.246.204.101) (Remote host closed the connection)
2022-01-18 15:12:47 +0100rusrushal13(~rusrushal@2401:4900:4471:78e2:d490:6737:3704:78a1) (Ping timeout: 256 seconds)
2022-01-18 15:13:21 +0100neverwas(jpneverwas@swissbox.unperson.link) (Ping timeout: 256 seconds)
2022-01-18 15:13:53 +0100 <pfurla-matrix> !whois puffnfresh
2022-01-18 15:14:28 +0100pfurla(~pfurla@2804:d41:4331:4800:2caa:3e9f:9236:25d4)
2022-01-18 15:14:41 +0100 <geekosaur> did you want /whois ?
2022-01-18 15:15:31 +0100 <sshine> is there a notify service on libera chat?
2022-01-18 15:16:19 +0100 <pfurla-matrix> I did but I am in a matrix.org bridge , bang-ircCommand is supposed to be a irc command, but apparently only in special chat room
2022-01-18 15:16:35 +0100 <geekosaur> looks like they have memoserv. need to have a registered nick both to send and to receive
2022-01-18 15:16:53 +0100 <geekosaur> lambdabot also has @tell
2022-01-18 15:22:20 +0100neverwas(jpneverwas@swissbox.unperson.link)
2022-01-18 15:23:06 +0100Snoopy4(~Snoopy@host-82-49-101-122.retail.telecomitalia.it)
2022-01-18 15:23:33 +0100 <Snoopy4> Haskell is the esoteric language with the most money invested in, and still manages to suck. Congrats ^^
2022-01-18 15:23:47 +0100Snoopy4(~Snoopy@host-82-49-101-122.retail.telecomitalia.it) (Client Quit)
2022-01-18 15:25:58 +0100michalz(~michalz@185.246.204.122)
2022-01-18 15:26:38 +0100 <sshine> haha
2022-01-18 15:26:48 +0100 <sshine> if that were true
2022-01-18 15:27:00 +0100 <kuribas> well, someone invested money in haskell, that's good news :)
2022-01-18 15:27:09 +0100 <sshine> I think there are legacy languages that have way more money invested and "suck" in a different sense :)
2022-01-18 15:27:21 +0100alx741(~alx741@157.100.93.160)
2022-01-18 15:27:48 +0100 <geekosaur> javascript immediately came to mind for some reason
2022-01-18 15:27:55 +0100 <sshine> but I'm impressed at how far Haskell has gotten in production considering how impractical its toolchain is, and how hard the language itself is to learn. :D
2022-01-18 15:28:00 +0100 <kuribas> I agree that haskell sucks, just less than other languages :)
2022-01-18 15:28:34 +0100 <sshine> kuribas, I recall that being the motto behind mutt, the email client. how many still use that? ;)
2022-01-18 15:28:58 +0100 <geekosaur> it's still my go-to if I'm limited to TUI
2022-01-18 15:29:15 +0100 <sshine> I'll quit email before I get a good email client.
2022-01-18 15:29:20 +0100 <geekosaur> thankfully that doesn't happen much any more, but.
2022-01-18 15:30:08 +0100 <sshine> apparently people use email to send these "job contracts" and "job applications" and they keep bugging me to check it. it's so unproductive!
2022-01-18 15:30:27 +0100 <sshine> like, don't they have /dcc send?
2022-01-18 15:31:13 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 15:31:18 +0100fef(~thedawn@user/thedawn) (Quit: Leaving)
2022-01-18 15:33:57 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 15:33:57 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 15:33:57 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 15:35:02 +0100nvmd(~nvmd@user/nvmd)
2022-01-18 15:36:06 +0100ystael(~ystael@user/ystael)
2022-01-18 15:38:51 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 256 seconds)
2022-01-18 15:39:16 +0100vglfr(~vglfr@46.96.165.111)
2022-01-18 15:40:32 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 15:41:17 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net)
2022-01-18 15:41:30 +0100 <leibniz> hey, sorry, i had to duck out
2022-01-18 15:41:55 +0100 <leibniz> i think we were discussing the format of the proposal
2022-01-18 15:42:11 +0100 <leibniz> where there were considerations about limited bandwidth
2022-01-18 15:42:49 +0100 <leibniz> i personally dont feel confident to author a persistent article
2022-01-18 15:43:06 +0100 <leibniz> it seems this is a sticking point
2022-01-18 15:44:33 +0100 <merijn> sshine: What makes you say the toolchain is impractical?
2022-01-18 15:44:52 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 250 seconds)
2022-01-18 15:44:57 +0100 <leibniz> i guess this means that the most help i can be is to answer any questions anyone has
2022-01-18 15:44:58 +0100 <merijn> I'm genuinely curious, because nearly every other language I use has toolchains that seem way less practical than cabal
2022-01-18 15:45:14 +0100razetime(~quassel@49.207.203.87)
2022-01-18 15:45:32 +0100 <leibniz> merijn: it seemed like a flippant comment
2022-01-18 15:45:41 +0100 <merijn> And I'm also curious which toolchains you've used that seem better...
2022-01-18 15:46:18 +0100 <leibniz> discussing the merits of haskell as a language on a channel dedicated to haskell seems a bit pointless
2022-01-18 15:46:42 +0100 <leibniz> its not as if its advertising to anyone not already part of the community
2022-01-18 15:47:19 +0100 <leibniz> but certainly stack, by allowing persistent builds across time, is an unprecedentedly useful tool, setting haskells toolchain arguably ahead of any other language
2022-01-18 15:47:22 +0100alx741(~alx741@157.100.93.160)
2022-01-18 15:49:14 +0100shriekingnoise(~shrieking@201.231.16.156)
2022-01-18 15:49:16 +0100mmhat(~mmh@55d4d6e9.access.ecotel.net)
2022-01-18 15:49:51 +0100leibniz(~leibniz@cpc101088-sgyl37-2-0-cust22.18-2.cable.virginm.net) (Quit: Connection closed)
2022-01-18 15:50:28 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 15:51:11 +0100 <merijn> I fear you have much more faith in stack than I, and that's not the part of the toolchain I'd consider good, tbh :p
2022-01-18 15:51:57 +0100 <ksqsf> cabal is great. it is mostly declarative but also supports advanced constructs like 'if'.
2022-01-18 15:52:39 +0100 <ksqsf> though some keywords are really weird, like 'hs-source-dirs'
2022-01-18 15:52:57 +0100 <merijn> ksqsf: Seems perfectly cromulent?
2022-01-18 15:54:14 +0100 <ksqsf> it's acceptable but i don't know why there is 'hs-'
2022-01-18 15:54:35 +0100 <sclv> cabal also allows persistent builds across time and also lots of tools for lots of languages
2022-01-18 15:54:50 +0100 <Sqaure> i couldnt get hs-source-dirs to handle ../some/path some days ago. But im on some 2-3 yo cabal version.
2022-01-18 15:54:58 +0100 <sclv> The idea has been around a minute
2022-01-18 15:55:32 +0100 <sclv> src dirs shouldn’t handle paths like that because those don’t go into tarballs
2022-01-18 15:56:01 +0100 <merijn> ksqsf: You can package C sources in Haskell packages (and there's work on C++ too, and no reason other languages couldn't be included)
2022-01-18 15:56:49 +0100 <merijn> ksqsf: so hs- lets you distinguish from (potential) future extensions such as c-source-dirs and cxx-source-dirs, etc. :)
2022-01-18 15:56:54 +0100 <sshine> merijn, I like Rust's cargo a lot :) I *think* Go's toolchain is good (but I've never used it), and I *have* used Perl's, which is not that bad, although, of course, the language itself is... let's not go there. :-P
2022-01-18 15:56:58 +0100 <ksqsf> merijn: nice to know, thanks
2022-01-18 15:57:11 +0100Guest49(~Guest49@2405:201:1e:5848:ecc5:3ef:bb63:fa9f)
2022-01-18 15:58:05 +0100 <Guest49> Hi
2022-01-18 15:58:28 +0100 <merijn> sshine: Go's toolchain is only good if you believe "sacrificing hundreds/thousands of man hours to ensure everything always works with HEAD of everything else" is both feasible and good
2022-01-18 15:59:03 +0100 <Guest49> Is there a way that I can contribute to Haskell?
2022-01-18 15:59:21 +0100 <sshine> merijn, good toolchains require sacrifices. I can't say what went into it, but I did once try to install Go code, and it was easy.
2022-01-18 15:59:22 +0100 <merijn> Depends what kinda contributions you are interested in making? :)
2022-01-18 15:59:38 +0100 <merijn> sshine: Hackage doesn't have the manpower to make that work
2022-01-18 15:59:44 +0100LukeHoersten(~LukeHoers@user/lukehoersten)
2022-01-18 15:59:56 +0100 <sshine> merijn, I think you can make a statement about the quality of a tool without making a moral statement about how it came to be. but sure, the latter is not unimportant.
2022-01-18 15:59:57 +0100 <fendor[m]> didn't go move to a cargo like approach?
2022-01-18 16:00:06 +0100 <merijn> sshine: It's the same with people saying "oh, bet debian packages make this work!". Sure, by virtue of throwing hundreds of man hours to fix each individual issue"
2022-01-18 16:00:08 +0100max22-(~maxime@2a01cb08833598005d86ce1a880654d8.ipv6.abo.wanadoo.fr)
2022-01-18 16:00:37 +0100 <sshine> merijn, I also use Debian. apparently I believe in sacrificing humans.
2022-01-18 16:00:39 +0100 <sshine> :P
2022-01-18 16:00:40 +0100 <merijn> sshine: I'm saying the quality you observe isn't a part of the tool, but the manpower thrown against the problem
2022-01-18 16:00:52 +0100 <maerwald> I doubt that
2022-01-18 16:00:56 +0100 <merijn> sshine: i.e. if we threw the same manpower at hackage we'd have the same result
2022-01-18 16:01:09 +0100 <maerwald> debian is the perfect example: lots of manpower and lots of f-ups
2022-01-18 16:01:43 +0100 <sshine> merijn, the tool is the thing I download and see working, because of the time spent to make it work. it sounds like you're justifying why a tool isn't bad because people didn't kill themselves fixing it (yet) :)
2022-01-18 16:02:26 +0100 <Guest49> Something simple, maybe adding a small but missing feature in the std lib. or maybe some issue that I can try to fix
2022-01-18 16:02:59 +0100 <Clint> debian doesn't have lots of manpower
2022-01-18 16:03:23 +0100 <sshine> Guest49, this might be for you: https://discourse.haskell.org/t/a-new-future-for-cryptography-in-haskell/3888
2022-01-18 16:03:38 +0100 <ksqsf> Clint: why? debian has ~1000 DDs and DMs
2022-01-18 16:03:56 +0100 <sshine> Clint, I think what's meant here is that Debian's maintainer model depends on manpower.
2022-01-18 16:04:04 +0100 <merijn> sshine: I don't mean "fixing the tool" I mean that most breakage isn't breakage in the tooling, but in the packages you are trying to install
2022-01-18 16:04:06 +0100 <Clint> ksqsf: most of whom are not active
2022-01-18 16:04:30 +0100 <sshine> merijn, my software isn't broken, you're giving it wrong inputs!
2022-01-18 16:04:34 +0100 <merijn> sshine: Most "cabal problems" are "this set of dependencies doesn't install", which is not a problem with cabal, but with your dependencies
2022-01-18 16:04:57 +0100 <ksqsf> NixOS has far less manpower, but a great tool (Nix) helps a lot
2022-01-18 16:05:02 +0100 <merijn> Clint: It does compared to Hackage
2022-01-18 16:05:16 +0100 <merijn> Clint: Hackage has, like, low double digit people *at best*
2022-01-18 16:05:36 +0100 <ksqsf> iirc Nix ships even more packages than Debian does
2022-01-18 16:06:27 +0100 <sshine> merijn, maybe it is impossible to even define the quality of a tool without making statements about its dependencies, and so any statement about the tool is really a statement about other things. :-D somehow, this completely derails any comparative assessment about toolchains.
2022-01-18 16:06:44 +0100Guest49(~Guest49@2405:201:1e:5848:ecc5:3ef:bb63:fa9f) (Quit: Client closed)
2022-01-18 16:07:13 +0100 <merijn> sshine: The quality of a toolchain, to me, is how easily you can integrate it into larger systems. How predictable it's behaviour is. etc.
2022-01-18 16:07:57 +0100 <merijn> cabal-install is very predictable, allows for all the possible control I've needed and integrates into larger build system fairly well (there's some room for improvement still, but infinitely better than, say, pip)
2022-01-18 16:08:59 +0100alx741(~alx741@157.100.93.160)
2022-01-18 16:08:59 +0100 <maerwald> not sure a constraint solver is really what you'd call predictable from a user pov
2022-01-18 16:09:21 +0100max22-(~maxime@2a01cb08833598005d86ce1a880654d8.ipv6.abo.wanadoo.fr) (Ping timeout: 268 seconds)
2022-01-18 16:09:32 +0100 <merijn> maerwald: It is a 1) a predictable constraint solver and 2) you can freeze it and/or use index-state to achieve that for users
2022-01-18 16:09:33 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2022-01-18 16:10:21 +0100 <maerwald> I'm not sure what a predictable constraint solver is... I'm talking about naive user interaction
2022-01-18 16:10:40 +0100 <maerwald> stack has predictability as a priority, I don't think cabal has
2022-01-18 16:11:50 +0100 <merijn> maerwald: as of v2-build the solver is (to the best of my knowledge) deterministic, so that the same index-state will always produce the same plan (and always preferring the newest admissible versions)
2022-01-18 16:12:07 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 16:12:15 +0100 <maerwald> sure
2022-01-18 16:12:27 +0100 <maerwald> well, not exactly, but almost
2022-01-18 16:12:32 +0100 <maerwald> flags and pkg-config can change that
2022-01-18 16:12:39 +0100 <sshine> merijn, I'm talking about the experience of using the tool. in the case of Cabal, the experience is pretty good in spite of how you can delegate the responsibility/probability of success to however coherent the package graph you happen to refer to at the time of evaluation. clearly there's some ideological difference here where it seems like you don't want any one point of failure to reflect the quality
2022-01-18 16:12:45 +0100 <sshine> of "the thing" (tool, language, ecosystem, whatever), whereas with e.g. Stack's snapshots, you do get something to point your fingers at if it breaks, but you also have to sacrifice humans to make those snapshots both consistent and recent.
2022-01-18 16:12:55 +0100zmt01(~zmt00@user/zmt00)
2022-01-18 16:13:15 +0100texasmynsted(~texasmyns@99.96.221.112)
2022-01-18 16:14:11 +0100 <ksqsf> I think most of this UX problem is just that GHC insists on having a set of compatible versions
2022-01-18 16:14:40 +0100Sgeo(~Sgeo@user/sgeo)
2022-01-18 16:15:22 +0100 <maerwald> merijn: from a user POV, cabal is not predictable. By default, the input is mutable/rolling and the result of a resolution is not something they would be able to predict
2022-01-18 16:15:27 +0100 <ksqsf> ksqsf: while Rust just compiles and links every needed major versions
2022-01-18 16:15:51 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-01-18 16:16:10 +0100 <sshine> ksqsf, a set of compatible versions of what?
2022-01-18 16:16:19 +0100 <ksqsf> sshine: build-depends
2022-01-18 16:16:35 +0100dsrt^(~dsrt@wsip-98-188-242-61.mc.at.cox.net) (Remote host closed the connection)
2022-01-18 16:17:38 +0100 <merijn> ksqsf: GHC actually admits conflicting versions, to some extend
2022-01-18 16:18:03 +0100 <merijn> ksqsf: But it's messy and hairy and cabal doesn't allow it for that reason, because it's likely to break shit
2022-01-18 16:18:13 +0100 <merijn> *extent
2022-01-18 16:21:05 +0100jackson99(~bc8147f2@cerf.good1.com)
2022-01-18 16:21:39 +0100 <ksqsf> hmm, I'm not really sure GHC can be like Rust in this regard; Rust has more restrictions on class instances for coherence
2022-01-18 16:22:34 +0100Pickchea(~private@user/pickchea) (Ping timeout: 250 seconds)
2022-01-18 16:23:15 +0100 <ksqsf> but it would be great if it turned out to be feasible
2022-01-18 16:23:52 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 16:23:52 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 16:23:52 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 16:26:05 +0100ksqsf(~user@134.209.106.31) (Remote host closed the connection)
2022-01-18 16:26:24 +0100ksqsf(~user@134.209.106.31)
2022-01-18 16:27:27 +0100xb0o2(~xb0o2@user/xb0o2)
2022-01-18 16:27:44 +0100LukeHoersten(~LukeHoers@user/lukehoersten) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-01-18 16:28:28 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 268 seconds)
2022-01-18 16:28:50 +0100geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-01-18 16:29:01 +0100alx741(~alx741@157.100.93.160)
2022-01-18 16:30:46 +0100geekosaur(~geekosaur@xmonad/geekosaur)
2022-01-18 16:37:26 +0100zmt01(~zmt00@user/zmt00) (Quit: Leaving)
2022-01-18 16:37:33 +0100max22-(~maxime@2a01cb0883359800e30a3abeb76df7a4.ipv6.abo.wanadoo.fr)
2022-01-18 16:37:35 +0100shapr(~user@98-159-193-131.scottsboro.org)
2022-01-18 16:38:26 +0100zmt00(~zmt00@user/zmt00)
2022-01-18 16:38:57 +0100alp(~alp@user/alp) (Ping timeout: 268 seconds)
2022-01-18 16:39:21 +0100laslmtdbm^(~laslmtdbm@wsip-98-188-242-61.mc.at.cox.net)
2022-01-18 16:47:39 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 16:47:40 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972)
2022-01-18 16:47:54 +0100sm2n(ae95cb1267@user/sm2n) (Remote host closed the connection)
2022-01-18 16:47:54 +0100filwisher(2e6936c793@2604:bf00:561:2000::170) (Remote host closed the connection)
2022-01-18 16:47:54 +0100tdmm(1c9b9145fc@2604:bf00:561:2000::1c8) (Remote host closed the connection)
2022-01-18 16:47:54 +0100jkoshy(99b9359beb@2604:bf00:561:2000::10f) (Remote host closed the connection)
2022-01-18 16:47:54 +0100jakzale(6291399afa@user/jakzale) (Remote host closed the connection)
2022-01-18 16:47:54 +0100samhh(7569f027cf@2604:bf00:561:2000::e4) (Remote host closed the connection)
2022-01-18 16:47:54 +0100evanrelf(3addc196af@2604:bf00:561:2000::f0) (Remote host closed the connection)
2022-01-18 16:47:54 +0100bsima1(9d7e39c8ad@2604:bf00:561:2000::dd) (Remote host closed the connection)
2022-01-18 16:47:54 +0100Ankhers(e99e97ef8e@2604:bf00:561:2000::2a2) (Remote host closed the connection)
2022-01-18 16:47:54 +0100raghavgururajan(ea769b8000@user/raghavgururajan) (Remote host closed the connection)
2022-01-18 16:47:54 +0100lukec(9dfd4d094e@2604:bf00:561:2000::10e) (Remote host closed the connection)
2022-01-18 16:47:54 +0100fluffyballoon(45ce440a48@2604:bf00:561:2000::e2) (Remote host closed the connection)
2022-01-18 16:48:26 +0100filwisher(2e6936c793@2604:bf00:561:2000::170)
2022-01-18 16:48:27 +0100bsima1(9d7e39c8ad@2604:bf00:561:2000::dd)
2022-01-18 16:48:27 +0100lukec(9dfd4d094e@2604:bf00:561:2000::10e)
2022-01-18 16:48:28 +0100samhh(7569f027cf@2604:bf00:561:2000::e4)
2022-01-18 16:48:37 +0100jakzale(6291399afa@user/jakzale)
2022-01-18 16:48:37 +0100Ankhers(e99e97ef8e@2604:bf00:561:2000::2a2)
2022-01-18 16:48:42 +0100evanrelf(3addc196af@2604:bf00:561:2000::f0)
2022-01-18 16:48:42 +0100fluffyballoon(45ce440a48@2604:bf00:561:2000::e2)
2022-01-18 16:48:42 +0100tdmm(1c9b9145fc@2604:bf00:561:2000::1c8)
2022-01-18 16:48:42 +0100jkoshy(99b9359beb@2604:bf00:561:2000::10f)
2022-01-18 16:48:45 +0100sm2n(ae95cb1267@user/sm2n)
2022-01-18 16:48:49 +0100raghavgururajan(ea769b8000@user/raghavgururajan)
2022-01-18 16:49:06 +0100n3rdy1(~n3rdy1@2600:1700:4570:3480::41)
2022-01-18 16:49:43 +0100myShoggoth(~myShoggot@97-120-67-120.ptld.qwest.net)
2022-01-18 16:52:02 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972) (Ping timeout: 250 seconds)
2022-01-18 16:52:16 +0100ec(~ec@gateway/tor-sasl/ec)
2022-01-18 16:53:51 +0100jlamothe(~jlamothe@198.251.61.229) (Quit: leaving)
2022-01-18 16:53:55 +0100stiell(~stiell@gateway/tor-sasl/stiell)
2022-01-18 16:54:28 +0100cosimone(~user@93-47-230-83.ip115.fastwebnet.it)
2022-01-18 16:55:45 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg)
2022-01-18 16:55:48 +0100 <sclv> rust’s model can lead to both compile time and runtime failures https://doc.rust-lang.org/cargo/reference/resolver.html#version-incompatibility-hazards
2022-01-18 16:55:55 +0100SummerSonw(~The_viole@203.77.49.232) (Ping timeout: 256 seconds)
2022-01-18 16:56:23 +0100 <sclv> haskellers are just less forgiving of such things and so the safer more restrictive choice is made
2022-01-18 16:57:36 +0100jakalx(~jakalx@base.jakalx.net) (Error from remote client)
2022-01-18 16:58:24 +0100stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 276 seconds)
2022-01-18 16:59:38 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Remote host closed the connection)
2022-01-18 16:59:57 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg)
2022-01-18 17:00:02 +0100jakalx(~jakalx@base.jakalx.net)
2022-01-18 17:02:21 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net)
2022-01-18 17:04:04 +0100alx741(~alx741@157.100.93.160)
2022-01-18 17:06:05 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Remote host closed the connection)
2022-01-18 17:06:24 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg)
2022-01-18 17:07:38 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 17:07:51 +0100newsham(~newsham@2603-800c-2d00-e994-c564-1d76-1f18-c3ec.res6.spectrum.com)
2022-01-18 17:08:10 +0100jlamothe(~jlamothe@198.251.61.229)
2022-01-18 17:08:32 +0100laslmtdbm^(~laslmtdbm@wsip-98-188-242-61.mc.at.cox.net) (Ping timeout: 240 seconds)
2022-01-18 17:10:15 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-01-18 17:16:44 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:8c5a:efae:38ab:4ad2) (Quit: WeeChat 2.8)
2022-01-18 17:17:32 +0100shapr(~user@98-159-193-131.scottsboro.org) (Ping timeout: 240 seconds)
2022-01-18 17:17:52 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 17:18:00 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk) (Remote host closed the connection)
2022-01-18 17:19:20 +0100laslmtdbm^(~laslmtdbm@wsip-98-188-242-61.mc.at.cox.net)
2022-01-18 17:20:37 +0100myShoggoth(~myShoggot@97-120-67-120.ptld.qwest.net) (Ping timeout: 240 seconds)
2022-01-18 17:22:33 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-01-18 17:24:05 +0100alx741(~alx741@157.100.93.160)
2022-01-18 17:25:12 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 17:26:05 +0100ksqsf(~user@134.209.106.31)
2022-01-18 17:27:03 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 17:28:40 +0100Henson(~kvirc@107-179-133-201.cpe.teksavvy.com)
2022-01-18 17:29:33 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 17:31:52 +0100myShoggoth(~myShoggot@97-120-67-120.ptld.qwest.net)
2022-01-18 17:32:16 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 17:33:53 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-01-18 17:34:57 +0100 <Henson> Hi everyone, I'm trying to understand this performance confusion I'm encountering with the following Haskell code https://paste.tomsmeding.com/U6K7rBaM. It's just a simple benchmark to crunch a quadratic curve fit 1 million times. On my (old) laptop this runs in 0.02 seconds. However, if I change line 8 from "!pVal" to "pVal" then it runs in 2.0 seconds. Why is there such an enormous performance boost for this simple strict evaluation?
2022-01-18 17:35:57 +0100 <Henson> I'm trying to understand this as I have much more complicated code that does something similar, and I'm wondering if I can make the performance much greater with a few simple bang patterns in the right spot.
2022-01-18 17:35:57 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.4)
2022-01-18 17:36:22 +0100 <Henson> well, similar code embedded in a much more complicated program.
2022-01-18 17:36:49 +0100 <sm> it's laziness at work. Accumulators in tight loops are something you want to be evaluated eagerly
2022-01-18 17:36:55 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
2022-01-18 17:37:43 +0100 <Henson> sm: is there a way I can profile my code to determine what parts are being held up by laziness and where I should add eager evaluations?
2022-01-18 17:37:53 +0100 <sm> Debug.Trace can be useful for seeing when things are being evaluated
2022-01-18 17:38:03 +0100cfricke(~cfricke@user/cfricke) (Quit: WeeChat 3.3)
2022-01-18 17:38:06 +0100Jing(~hedgehog@240e:390:7c53:a7e1:a9:59ba:3231:6160) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-01-18 17:38:58 +0100 <sm> there's no magic tool alas, it's one of the skills a haskeller needs to develop. Though in practice, I find it doesn't come up that often in real code
2022-01-18 17:39:08 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 17:39:08 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 17:39:08 +0100wroathe(~wroathe@user/wroathe)
2022-01-18 17:39:21 +0100 <sm> I don't think a profile helps here...
2022-01-18 17:39:23 +0100 <Henson> sm: but the pVal isn't even an accumulator, it's just an index to prevent Haskell from reusing the previously calculated inputs and outputs
2022-01-18 17:39:50 +0100 <c_wraith> I keep thinking about this. There is a simple set of rules to follow to prevent space use problems. It should be possible to write some sort of assistance to validate that you're following those rules.
2022-01-18 17:40:27 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-01-18 17:41:58 +0100 <sm> c_wraith++
2022-01-18 17:42:17 +0100Pickchea(~private@user/pickchea)
2022-01-18 17:43:04 +0100 <sm> Henson: I hear you. I can't see the exact mechanism myself, but I would guess the tuple is the problem, maybe the strict pval helps force it ?
2022-01-18 17:43:33 +0100 <c_wraith> the problem comes from going "this set of rules is simple" to actually writing the rules down. Because they aren't actually quite so simple when you deal with all the extra cases
2022-01-18 17:43:51 +0100 <Henson> sm: in the more complex production code there's a simple "p2 = sum $ map (\(t,p) -> p*t) (zip times positions)" where times :: [Double] and positions :: [Double] that takes up a big chunk of the time when profiling. It's a pretty simple operation, but gets done a lot. If the times and positions lists need to be evaluated to calculate p3, does the evaluation of those lists count towards the...
2022-01-18 17:43:59 +0100 <sm> tuples always cause thunk leaks so should not be used as an accumulator
2022-01-18 17:44:09 +0100 <shane> You know the way the `time` library has `UTCTime` and `NominalDiffTime`, where `NominalDiffTime` is a number, and can be added to and subtracted from `UTCTime`, and `UTCTime` can be subtracted from itself to produce a `NominalDiffTime`, but `UTCTime` is not itself a number? And there's a related thing going on with the `.+^`, `.-^` and `.-.` operators from `Linear.Affine`. What I want to ask is, is there a
2022-01-18 17:44:15 +0100 <shane> general name for this type of thing in abstract algebra, and are there any Haskell packages that try to implement it?
2022-01-18 17:44:15 +0100 <Henson> sm: calculation time of p3, or does it get attributed to the functions that went into producing the times and positions lists?
2022-01-18 17:44:31 +0100 <c_wraith> You can use a tuple in an accumulator as long as your function producing them seqs the elements first.
2022-01-18 17:44:53 +0100 <c_wraith> Strictness isn't about the data structures you use, it's about when things get evaluated.
2022-01-18 17:45:19 +0100 <sm> c_wraith: if we could at least write them down such that a human could evaluate/check them relatively easily, that would still be a big help
2022-01-18 17:45:42 +0100alx741(~alx741@157.100.93.160)
2022-01-18 17:45:55 +0100 <c_wraith> remember that a strict pair type doesn't do anything you couldn't do by writing seq twice by hand. :)
2022-01-18 17:46:02 +0100xff0x(~xff0x@2001:1a81:5209:df00:5e7c:4acd:2a77:4d24) (Ping timeout: 240 seconds)
2022-01-18 17:46:31 +0100 <Henson> c_wraith: how do I seq the elements first? just seq the list, or figure out how to deepseq them?
2022-01-18 17:46:52 +0100 <c_wraith> deepseq is more of a debugging tool. It'll never show up in optimized code.
2022-01-18 17:46:55 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-01-18 17:46:59 +0100xff0x(~xff0x@2001:1a81:5209:df00:b3fa:3a32:fd8e:f809)
2022-01-18 17:47:00 +0100 <c_wraith> It's not efficient at all
2022-01-18 17:47:16 +0100pfurla(~pfurla@2804:d41:4331:4800:2caa:3e9f:9236:25d4) (Quit: gone to sleep. ZZZzzz…)
2022-01-18 17:47:59 +0100 <Henson> also, the performance problems of laziness comes up all the time for me in my reading, and the difficulty in reasoning about performance and space issues. Was it a good idea to make Haskell a lazy language, given that so few others are? Not to derail my own conversation here, but what are the benefits of laziness in practice, as I mostly hear about the downsides of it.
2022-01-18 17:47:59 +0100 <sm> Henson: I don't know the answer to your profiling q, seeing the profile and code might help. I have found profiles hard and sometimes misleading to read
2022-01-18 17:48:01 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 17:48:12 +0100 <c_wraith> Henson: that line you're talking about doesn't look like a problem. I mean, you probably want to use zipWith instead of zip + map, but that's for clarity rather than performance
2022-01-18 17:48:51 +0100 <c_wraith> Henson: if that line is being credited with a performance problem, it's in the generation of one of those lists. not that line itself
2022-01-18 17:49:07 +0100 <c_wraith> and laziness is wonderful.
2022-01-18 17:49:18 +0100 <c_wraith> It lets you write code that's actually efficiently composable
2022-01-18 17:49:40 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk)
2022-01-18 17:49:45 +0100 <sm> Henson: it's generally considered worthwhile for forcing purity and supporting greater abstraction, although people always wonder what a "strict haskell" would be like
2022-01-18 17:50:19 +0100 <Henson> c_wraith: do you have any suggestions as to avenues and techniques I could investigate to try to get the lists to be evaluated eagerly? Should I target the sites where they are produced for eager evaluation, or where they're consumed, or (hopefully not) somewhere in-between?
2022-01-18 17:50:24 +0100 <sm> it's also not as much of a problem in practice as it may sound - for most people
2022-01-18 17:50:35 +0100 <maerwald> Henson: forcing evaluation of 'a' in quadFit seems to have the same effect
2022-01-18 17:50:55 +0100xb0o2(~xb0o2@user/xb0o2) (Quit: Client closed)
2022-01-18 17:50:59 +0100Hensontests
2022-01-18 17:51:42 +0100 <c_wraith> Henson: that question is... not going to lead you anywhere useful. If you're producing lists, you don't want to do it strictly. What you want to be doing is making sure that consuming the spine of the list doesn't generate nested thunks.
2022-01-18 17:51:47 +0100coot(~coot@89-64-85-93.dynamic.chello.pl) (Quit: coot)
2022-01-18 17:53:08 +0100n3rdy1(~n3rdy1@2600:1700:4570:3480::41) (Ping timeout: 250 seconds)
2022-01-18 17:53:12 +0100 <maerwald> sm: until it is and then you're in big trouble
2022-01-18 17:53:14 +0100 <maerwald> :)
2022-01-18 17:53:18 +0100 <c_wraith> Henson: a lot of the trouble people have is that not realizing that producing lazy data structures must be done with as much care as consuming them.
2022-01-18 17:53:20 +0100 <Henson> c_wraith: can you explain that more? I know what thunks are, but don't really understand what you're suggesting or how I would make sure I'm not doing that.
2022-01-18 17:53:34 +0100MajorBiscuit(~MajorBisc@c-001-025-054.client.tudelft.eduvpn.nl) (Ping timeout: 268 seconds)
2022-01-18 17:53:57 +0100zebrag(~chris@user/zebrag)
2022-01-18 17:53:59 +0100 <sm> we should have a reading list for this topic
2022-01-18 17:54:02 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk) (Ping timeout: 240 seconds)
2022-01-18 17:54:09 +0100 <sm> @where laziness
2022-01-18 17:54:09 +0100 <lambdabot> I know nothing about laziness.
2022-01-18 17:54:19 +0100 <maerwald> sm: it's a constantly moving target
2022-01-18 17:54:32 +0100 <c_wraith> maerwald: it really isn't. If you get it right, you've got it right.
2022-01-18 17:54:42 +0100lbseale(~ep1ctetus@user/ep1ctetus)
2022-01-18 17:54:44 +0100 <maerwald> c_wraith: unless inlining is involved
2022-01-18 17:54:55 +0100 <c_wraith> things only move if you get it wrong and depend on the compiler to rescue you
2022-01-18 17:55:26 +0100 <maerwald> there's no right or wrong in terms of optimization tricks for the inliner
2022-01-18 17:56:39 +0100 <Henson> maerwald: how did you force it? I put a bang on a in quadFit and it made it about twice as fast, but the bang on pVal makes it 70 times faster.
2022-01-18 17:57:25 +0100 <maerwald> Henson: in seq a (accA + a, accB + b, accC + c)
2022-01-18 17:57:49 +0100 <Henson> c_wraith: I'm also interested in learning more about how to carefully produce and consume lazy data structures
2022-01-18 17:57:59 +0100 <maerwald> I also played a little with using a lambda as argument to foldl'
2022-01-18 17:58:09 +0100 <maerwald> which also seemed to make some difference in some circumstance
2022-01-18 17:58:27 +0100Danishman(~Danishman@2-104-144-110-cable.dk.customer.tdc.net)
2022-01-18 17:59:30 +0100 <Henson> maerwald: interesting! seq'ing any of a,b,c or pVal (at least) cause the performance increase
2022-01-18 17:59:44 +0100vglfr(~vglfr@46.96.165.111) (Ping timeout: 268 seconds)
2022-01-18 18:00:41 +0100whatif(~user@123.123.223.41)
2022-01-18 18:00:52 +0100 <Henson> maerwald: how is it that "seq a" makes a difference, but putting a bang on (!a,b,c) doesn't make a difference? Don't they do the same thing?
2022-01-18 18:00:53 +0100 <whatif> why there's so many String in haskell?
2022-01-18 18:01:37 +0100 <whatif> Data.ByteString, Data.ByteString.Lazy.Internal.ByteString, [Word 8], Data.Text, Lazy blabla
2022-01-18 18:01:42 +0100 <razetime> https://mmhaskell.com/blog/2017/5/15/untangling-haskells-strings
2022-01-18 18:01:45 +0100 <whatif> what's wrong with string
2022-01-18 18:01:47 +0100 <c_wraith> Henson: it's a somewhat big topic, and I don't have anything prepared. The best I can do right now is say that I finally started understanding how to think about this after reading https://apfelmus.nfshost.com/blog/2013/08/21-space-invariants.html
2022-01-18 18:01:56 +0100 <maerwald> Henson: also check out this: https://paste.tomsmeding.com/P3xMdKX9
2022-01-18 18:01:59 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 18:02:15 +0100 <maerwald> there I force inside quadFit... but it only works if using the lambda-form above or so
2022-01-18 18:02:28 +0100 <geekosaur> whatif: everything? one string type does not actually cover all use cases, and most programmers do stupid things with them
2022-01-18 18:02:39 +0100 <whatif> I need Data.ByteString.Lazy.Internal.ByteString to write to file, there's no writeFile implement, only Data.ByteString has writeFile
2022-01-18 18:02:45 +0100 <ksqsf> whatif: String is a linked list of characters, which is unreasonable in practice
2022-01-18 18:02:57 +0100 <c_wraith> whatif: String has always been underspecified. Some languages just let you ignore that. Look at Rust if you want to see what being *really* careful about strings looks like
2022-01-18 18:03:17 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net) (Ping timeout: 240 seconds)
2022-01-18 18:03:18 +0100 <c_wraith> ksqsf: String is fine when its semantics are correct. But often they aren't.
2022-01-18 18:03:50 +0100 <geekosaur> https://hackage.haskell.org/package/bytestring-0.11.2.0/docs/Data-ByteString-Lazy.html#v:writeFile
2022-01-18 18:04:38 +0100 <whatif> geekosaur: what's the 'Internal' here mean?
2022-01-18 18:04:48 +0100 <c_wraith> nothing.
2022-01-18 18:04:49 +0100alx741(~alx741@157.100.93.160)
2022-01-18 18:04:52 +0100 <shane> If anyone was wondering, I found the answer to my question above: torsors
2022-01-18 18:04:52 +0100 <c_wraith> literally ignore it.
2022-01-18 18:05:02 +0100 <c_wraith> Internal means that the normal name wasn't imported
2022-01-18 18:05:04 +0100 <ksqsf> c_wraith: sure, if you only consider the semantics; but my point is that String is slow, and if you use String as a store format, it can take much RAM
2022-01-18 18:05:05 +0100 <whatif> c_wraith: then why people don't remove it?
2022-01-18 18:05:06 +0100 <geekosaur> that you didn't import Data.ByteString.Lazy so it hunted it down to its source, which is the core implementation in the Internal module
2022-01-18 18:05:28 +0100 <sm> @where+ spaceleaks https://apfelmus.nfshost.com/blog/2013/08/21-space-invariants.html
2022-01-18 18:05:28 +0100 <lambdabot> Good to know.
2022-01-18 18:05:31 +0100 <geekosaur> you almost never care. just import Data.ByteString.Lazy and get on with life
2022-01-18 18:05:37 +0100vglfr(~vglfr@46.96.165.111)
2022-01-18 18:06:06 +0100n3rdy1(~n3rdy1@2600:1700:4570:3480:1b88:50f:dae0:9293)
2022-01-18 18:06:07 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net)
2022-01-18 18:06:09 +0100smwonders why is lambdabot so slow
2022-01-18 18:06:17 +0100 <geekosaur> as to why Strict vs. Lazy, Strict is faster but you probably don't want to suck a 10GB file into memeory to operate on it, so we have Lazy as well
2022-01-18 18:06:26 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net) (Client Quit)
2022-01-18 18:06:31 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 268 seconds)
2022-01-18 18:06:57 +0100 <maerwald> lazy bytestring is poor man's streaming
2022-01-18 18:07:30 +0100econo(uid147250@user/econo)
2022-01-18 18:08:08 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 18:08:49 +0100fendor(~fendor@178.115.55.2.wireless.dyn.drei.com)
2022-01-18 18:09:23 +0100 <Henson> c_wraith: thank you for the help and suggestions on the literature. I'll take a look at that
2022-01-18 18:09:52 +0100 <Henson> maerwald: thanks for tinkering around with the code and suggesting improvments. I'll see what I'm able to do with the production code.
2022-01-18 18:10:05 +0100 <whatif> how I can turn Data.ByteString.Lazy.Internal.String to String?
2022-01-18 18:10:20 +0100 <ksqsf> unpack
2022-01-18 18:10:29 +0100 <whatif> ksqsf: unpack get [Word8]
2022-01-18 18:10:32 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 240 seconds)
2022-01-18 18:10:38 +0100 <whatif> and what the heck Word8 is?
2022-01-18 18:10:50 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
2022-01-18 18:11:12 +0100 <ksqsf> @hoogle Word8 -> Char
2022-01-18 18:11:12 +0100 <lambdabot> Data.ByteString.Internal w2c :: Word8 -> Char
2022-01-18 18:11:13 +0100 <lambdabot> Data.Text.Internal.Unsafe.Char unsafeChr8 :: Word8 -> Char
2022-01-18 18:11:13 +0100 <lambdabot> Data.Bits.Utils w82c :: Word8 -> Char
2022-01-18 18:11:35 +0100 <maerwald> uhm
2022-01-18 18:12:09 +0100 <maerwald> that might not be what you want
2022-01-18 18:12:20 +0100 <ksqsf> actually Word8-version ByteString is not intended to be directly used as String
2022-01-18 18:12:24 +0100 <whatif> there's no w2c in Data.ByteString.Lazy
2022-01-18 18:12:34 +0100 <maerwald> whatif: what's the data? UTF-8?
2022-01-18 18:12:37 +0100 <geekosaur> no, it's an internal function
2022-01-18 18:12:38 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-01-18 18:12:45 +0100 <ksqsf> you probably want decodeUtf8, or Char8-version ByteString if you only care about ASCII
2022-01-18 18:13:03 +0100 <whatif> ksqsf: then why unpack Data.ByteString.Lazy get Word8
2022-01-18 18:13:29 +0100 <ksqsf> whatif: it's a byte array.
2022-01-18 18:13:37 +0100 <maerwald> https://hackage.haskell.org/package/text-2.0/docs/Data-Text-Lazy-Encoding.html#v:decodeUtf8With
2022-01-18 18:13:57 +0100 <maerwald> then T.unpack
2022-01-18 18:14:03 +0100 <whatif> ksqsf: does Data.ByteString.Encoding come with ghc?
2022-01-18 18:14:37 +0100 <whatif> @hoogle ByteString -> String
2022-01-18 18:14:37 +0100 <lambdabot> Control.Lens.Internal.ByteString unpackStrict8 :: ByteString -> String
2022-01-18 18:14:37 +0100 <lambdabot> Control.Lens.Internal.ByteString unpackLazy8 :: ByteString -> String
2022-01-18 18:14:37 +0100 <lambdabot> Data.ByteString.Lazy.UTF8 toString :: ByteString -> String
2022-01-18 18:14:43 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 18:18:33 +0100chele(~chele@user/chele) (Remote host closed the connection)
2022-01-18 18:18:42 +0100razetime(~quassel@49.207.203.87) (Ping timeout: 250 seconds)
2022-01-18 18:19:02 +0100 <whatif> Data.ByteString.Lazy.UTF8.toString can't work on Data.ByteString.Internal.ByteString, what?
2022-01-18 18:19:13 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds)
2022-01-18 18:19:26 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972)
2022-01-18 18:19:43 +0100 <whatif> is there twenty kinds of String in Haskell?
2022-01-18 18:20:10 +0100 <monochrom> 2
2022-01-18 18:20:19 +0100 <maerwald> whatif: yes
2022-01-18 18:20:21 +0100tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2022-01-18 18:20:22 +0100 <monochrom> String and Text.
2022-01-18 18:20:36 +0100 <whatif> monochrom: and Char and Word8
2022-01-18 18:20:39 +0100 <monochrom> That's right, ByteString doesn't count.
2022-01-18 18:20:48 +0100 <whatif> and a bunch of Lazy or Internel
2022-01-18 18:20:54 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-01-18 18:20:58 +0100 <whatif> monochrom: what a pain in the ass
2022-01-18 18:21:12 +0100 <maerwald> whatif: https://mmhaskell.com/blog/2017/5/15/untangling-haskells-strings
2022-01-18 18:21:25 +0100 <monochrom> Unless your "string" means the C kind of string, i.e., bytes. In that case, 1, ByteString. That's right, String and Text don't count.
2022-01-18 18:21:56 +0100 <polyphem_> whatif: https://gist.github.com/dino-/28b09c465c756c44b2c91d777408e166
2022-01-18 18:21:56 +0100 <ksqsf> string, text (strict + lazy), bytestring (strict + lazy) * (char8 + word8)
2022-01-18 18:22:07 +0100 <ksqsf> only 7 you need to know ;)
2022-01-18 18:22:30 +0100 <whatif> why the Lazy thing can't work on Internal thing?
2022-01-18 18:22:36 +0100 <whatif> or the verse
2022-01-18 18:22:52 +0100 <ksqsf> you're using a strict bytestring
2022-01-18 18:23:31 +0100 <ksqsf> @hoogle fromStrict
2022-01-18 18:23:31 +0100 <lambdabot> Data.ByteString.Lazy fromStrict :: ByteString -> ByteString
2022-01-18 18:23:31 +0100 <lambdabot> Data.ByteString.Lazy.Char8 fromStrict :: ByteString -> ByteString
2022-01-18 18:23:32 +0100 <lambdabot> Data.Text.Lazy fromStrict :: Text -> Text
2022-01-18 18:24:12 +0100polyphem_polyphem
2022-01-18 18:24:13 +0100 <maerwald> whatif: they're different data types
2022-01-18 18:24:25 +0100 <maerwald> for performance reasons
2022-01-18 18:24:49 +0100 <maerwald> so yes, it's a mess
2022-01-18 18:24:50 +0100alx741(~alx741@157.100.93.160)
2022-01-18 18:25:01 +0100 <whatif> how I turn a Internal.ByteString to a String?
2022-01-18 18:25:13 +0100 <whatif> I need a FilePath
2022-01-18 18:25:29 +0100 <maerwald> whatif: on what platform?
2022-01-18 18:25:31 +0100 <whatif> scotty give me a Internal.ByteString
2022-01-18 18:25:37 +0100 <whatif> maerwald scotty
2022-01-18 18:25:43 +0100 <whatif> maerwald debian
2022-01-18 18:25:45 +0100 <monochrom> Yeah, that's actually platform-dependent territory.
2022-01-18 18:25:45 +0100 <slack1256> Is this correct syntax for setting SCC and get info at call sites? https://pastebin.com/AWiRncm5
2022-01-18 18:26:01 +0100 <maerwald> whatif: where did scotty obtain that filepath from?
2022-01-18 18:26:21 +0100 <whatif> maerwald FileInfo
2022-01-18 18:27:15 +0100 <maerwald> whatif: on unix, a filepath can have arbitrary encoding
2022-01-18 18:27:32 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk)
2022-01-18 18:27:37 +0100 <maerwald> most people assume utf-8
2022-01-18 18:28:43 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 18:28:43 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 18:29:44 +0100 <whatif> maerwald found it, Data.ByteString.Char8.unpack
2022-01-18 18:29:51 +0100 <maerwald> whatif: that will truncate
2022-01-18 18:31:38 +0100 <monochrom> It's only good for ASCII.
2022-01-18 18:31:59 +0100 <whatif> what's the proper way, assume utf-8
2022-01-18 18:32:14 +0100 <maerwald> whatif: that depends where the filepath is from
2022-01-18 18:32:30 +0100 <whatif> maerwald debian linux
2022-01-18 18:32:37 +0100qeqeqw1(~qeqeqw3@2001:861:3a04:e320:31ea:a59b:1c06:51f4)
2022-01-18 18:32:48 +0100 <maerwald> I mean... can you know what's the encoding... is it on your machine? Is it sent to you?
2022-01-18 18:32:55 +0100 <whatif> utf-8
2022-01-18 18:33:00 +0100 <monochrom> A lot of people assume ASCII to head-in-sand so they don't have to answer those tough questions.
2022-01-18 18:33:18 +0100 <ksqsf> https://paste.tomsmeding.com/ArEYKick if it's utf8, using 'text' is pretty easy
2022-01-18 18:33:32 +0100 <maerwald> whatif: there's https://hackage.haskell.org/package/base-4.16.0.0/docs/GHC-IO-Encoding.html#v:getFileSystemEncoding
2022-01-18 18:36:12 +0100 <maerwald> whatif: https://github.com/hasufell/abstract-filepath/blob/a913d715d8971224b45ef22a7b9ceaa263a77601/abstra…
2022-01-18 18:36:24 +0100 <maerwald> that's an example of using current filesystem encoding to turn bytestring into String
2022-01-18 18:37:13 +0100deadmarshal(~deadmarsh@95.38.228.70)
2022-01-18 18:38:09 +0100 <sclv> shane those things are usually called torsors? you can also just view it as an affine space i guess
2022-01-18 18:39:06 +0100mbuf(~Shakthi@136.185.86.67) (Quit: Leaving)
2022-01-18 18:40:00 +0100hippoid(~hippoid@184.105.6.88)
2022-01-18 18:40:52 +0100 <slack1256> It seems that call-site SCC do not appear when reporting exceptions via +RTS -xc . Does somebody know how to track who threw an exceptions?
2022-01-18 18:41:48 +0100Akiva(~Akiva@user/Akiva)
2022-01-18 18:42:36 +0100turlando(~turlando@93-42-250-112.ip89.fastwebnet.it)
2022-01-18 18:42:36 +0100turlando(~turlando@93-42-250-112.ip89.fastwebnet.it) (Changing host)
2022-01-18 18:42:36 +0100turlando(~turlando@user/turlando)
2022-01-18 18:43:52 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net)
2022-01-18 18:43:53 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-01-18 18:44:52 +0100alx741(~alx741@157.100.93.160)
2022-01-18 18:46:28 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 18:47:48 +0100 <slack1256> Nevermind, they seem to do. The exception was not thrown from where I excepted.
2022-01-18 18:48:27 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net) (Ping timeout: 268 seconds)
2022-01-18 18:53:18 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Remote host closed the connection)
2022-01-18 18:53:38 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg)
2022-01-18 18:53:51 +0100alp(~alp@user/alp)
2022-01-18 18:53:58 +0100 <shane> sclv: I figured it out eventually, but I appreciate you getting back to me!
2022-01-18 18:56:28 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 18:57:48 +0100whatif(~user@123.123.223.41) (Quit: ERC (IRC client for Emacs 26.3))
2022-01-18 18:58:19 +0100ProfSimm(~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Ping timeout: 256 seconds)
2022-01-18 19:01:32 +0100coot(~coot@89-64-85-93.dynamic.chello.pl)
2022-01-18 19:02:51 +0100alx741(~alx741@157.100.93.160)
2022-01-18 19:03:13 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 19:03:26 +0100kritzefitz(~kritzefit@debian/kritzefitz)
2022-01-18 19:05:02 +0100jkaye(~jkaye@2601:281:200:1958:8e74:ef22:c471:c2e) (Ping timeout: 240 seconds)
2022-01-18 19:05:46 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 19:05:56 +0100xb0o2(~xb0o2@user/xb0o2)
2022-01-18 19:06:18 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 19:08:14 +0100fef(~thedawn@user/thedawn)
2022-01-18 19:11:25 +0100 <zzz> why should we avoid GADTs if we don't need them?
2022-01-18 19:13:59 +0100 <geekosaur> did something tell you that?
2022-01-18 19:14:25 +0100 <geekosaur> I mean, there are those who prefer GADT syntax even for non-GADTs
2022-01-18 19:14:33 +0100 <slack1256> Anybody has used the `mold` linker with ghc?
2022-01-18 19:14:38 +0100 <geekosaur> (and GADTSyntax is a language option)
2022-01-18 19:14:52 +0100 <geekosaur> slack1256, it's been tried in #ghc, ask there but they had problems with it
2022-01-18 19:16:15 +0100coot(~coot@89-64-85-93.dynamic.chello.pl) (Quit: coot)
2022-01-18 19:16:55 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com)
2022-01-18 19:17:54 +0100Pickchea(~private@user/pickchea) (Quit: Leaving)
2022-01-18 19:19:47 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.4)
2022-01-18 19:20:01 +0100ksqsf(~user@134.209.106.31)
2022-01-18 19:20:37 +0100 <geekosaur> zzz, beyond that, there are those who believe existentials (the main purpose of GADTs) are often an anti-pattern.
2022-01-18 19:20:59 +0100gdd(~gdd@129.199.146.230) (Ping timeout: 256 seconds)
2022-01-18 19:21:28 +0100 <geekosaur> you should probably read the arguments in both directions and make your own decision; the fact that they are still around and used suggests it's not a clear-cut "this is bad"
2022-01-18 19:21:31 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-01-18 19:21:42 +0100kspalaiologos(~kspalaiol@user/kspalaiologos)
2022-01-18 19:22:31 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
2022-01-18 19:22:52 +0100alx741(~alx741@157.100.93.160)
2022-01-18 19:23:00 +0100ub(~Thunderbi@141.98.252.232)
2022-01-18 19:23:12 +0100 <zzz> oh i remember someone saying we should avoid it but never understood why. thanks
2022-01-18 19:23:15 +0100ubert(~Thunderbi@141.98.252.232) (Ping timeout: 256 seconds)
2022-01-18 19:23:15 +0100ububert
2022-01-18 19:23:24 +0100 <EvanR> GADTs are awesome
2022-01-18 19:23:29 +0100 <EvanR> totally rad, even
2022-01-18 19:24:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 19:24:42 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 19:27:52 +0100hippoid(~hippoid@184.105.6.88) ()
2022-01-18 19:27:56 +0100kspalaiologos(~kspalaiol@user/kspalaiologos) (Quit: Leaving)
2022-01-18 19:28:43 +0100ksqsf(~user@134.209.106.31)
2022-01-18 19:30:23 +0100 <zzz> agree
2022-01-18 19:30:54 +0100 <zzz> i even prefer GADT syntax for non-GADTs
2022-01-18 19:31:06 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net)
2022-01-18 19:31:06 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 19:32:31 +0100 <zzz> and we can now use it in newtype decls, nice
2022-01-18 19:34:05 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 19:35:20 +0100 <EvanR> really
2022-01-18 19:35:32 +0100yauhsien(~yauhsien@61-231-62-246.dynamic-ip.hinet.net) (Ping timeout: 240 seconds)
2022-01-18 19:35:33 +0100 <EvanR> does that mean you can have existential newtype
2022-01-18 19:36:47 +0100ksqsf(~user@134.209.106.31)
2022-01-18 19:38:32 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 240 seconds)
2022-01-18 19:39:16 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972) (Remote host closed the connection)
2022-01-18 19:40:56 +0100gentauro(~gentauro@user/gentauro) (Quit: leaving)
2022-01-18 19:40:57 +0100wombat875(~neilfulwi@pool-72-89-24-154.nycmny.fios.verizon.net)
2022-01-18 19:41:11 +0100gentauro(~gentauro@user/gentauro)
2022-01-18 19:41:26 +0100gentauro(~gentauro@user/gentauro) (Client Quit)
2022-01-18 19:42:36 +0100gentauro(~gentauro@user/gentauro)
2022-01-18 19:45:08 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 19:45:24 +0100ksqsf(~user@134.209.106.31) (Remote host closed the connection)
2022-01-18 19:45:45 +0100ksqsf(~user@134.209.106.31)
2022-01-18 19:47:44 +0100 <geekosaur> existential newtype seems unlikely since it'd have at least two fields (the value and its dictionary)?
2022-01-18 19:47:54 +0100alx741(~alx741@157.100.93.160)
2022-01-18 19:48:16 +0100 <EvanR> that assumes you put a constraint
2022-01-18 19:48:34 +0100 <EvanR> which I guess is often implied by using existential types
2022-01-18 19:48:53 +0100 <EvanR> and I guess that is the anti-pattern you were talking about
2022-01-18 19:48:59 +0100 <geekosaur> they're kinda useless without?
2022-01-18 19:49:45 +0100 <geekosaur> "great, I have a value but no clue what I can do with it"
2022-01-18 19:50:19 +0100 <EvanR> in tricky code where internally you have external information on how to unwrap the unknown value, and you just want something like old GHC.Any
2022-01-18 19:50:30 +0100 <EvanR> and you don't want an extra wrapper
2022-01-18 19:50:37 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 19:50:47 +0100 <EvanR> er, internally, you have tricky extra information
2022-01-18 19:50:47 +0100 <awpr> contrived as this is, it demonstrates why that's not completely true: `data Thing where Thing :: Dict (Show a) -> a -> Thing`
2022-01-18 19:51:14 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 19:51:22 +0100 <EvanR> yes geekosaur is probably thinking, either a constraint or a paired thing that uses a
2022-01-18 19:51:57 +0100ProfSimm(~ProfSimm@87.227.196.109)
2022-01-18 19:52:05 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 19:52:27 +0100 <awpr> yeah, you can obtain "things to do with" the existentials by their relation to other fields, like `data Generator a where Generator :: b -> (b -> (a, b)) -> Generator a`
2022-01-18 19:52:33 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 19:52:52 +0100 <EvanR> which is besides the point of newtypes, which have only 1 field
2022-01-18 19:53:08 +0100jinsun__jinsun
2022-01-18 19:53:20 +0100geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-01-18 19:53:46 +0100 <awpr> could have a newtype over a tuple, or a newtype over any type that mentions the existential twice
2022-01-18 19:54:32 +0100 <EvanR> if they wrapped type has fields, then it could have used its own existential
2022-01-18 19:54:36 +0100 <monochrom> geekosaur: As the user's guide says, as you observed, a useful existential type is not going to be a semantic newtype; a syntactic newtype (that the compiler secretly s/newtype/data/ under the hood) is no problem but the GHC devs are too lazy to do it until they hear enough requests.
2022-01-18 19:55:07 +0100geekosaur(~geekosaur@xmonad/geekosaur)
2022-01-18 19:55:25 +0100 <maerwald> awpr: you don't need GADT syntax for that though
2022-01-18 19:55:25 +0100 <awpr> but even without other fields, you can get interesting things: `data Colimit f where Colimit :: f a -> Colimit f`, s.t. `Colimit (Int,)` is isomorphic to `Int`
2022-01-18 19:56:09 +0100 <EvanR> ok so that looks like a good time for a newtype
2022-01-18 19:56:18 +0100 <EvanR> but it's illegal
2022-01-18 19:56:36 +0100 <maerwald> that just makes it more exciting
2022-01-18 19:57:19 +0100 <awpr> maerwald: hmm? you mean the Generator example being expressible with just ExistentialTypes? needing GADT syntax wasn't the point, it was doing something useful with unconstrained existentials
2022-01-18 19:57:58 +0100 <monochrom> I had to decode the GADT syntax to recognize the existential type...
2022-01-18 19:58:47 +0100 <maerwald> awpr: ExistentialQuantification
2022-01-18 19:58:51 +0100 <monochrom> I recognize that there is now a school of thought of using only GADT syntax to write existential types.
2022-01-18 20:00:12 +0100 <EvanR> it seems like since you can use GADT to write newtypes, there's gotta be special case there to see if you used existentials and tell you no xD
2022-01-18 20:00:26 +0100 <EvanR> why not just make it work
2022-01-18 20:03:03 +0100val-host(~val-host@2a02:2f0f:9108:b00:6891:37fc:a7bd:3738)
2022-01-18 20:03:23 +0100Erutuon(~Erutuon@user/erutuon)
2022-01-18 20:03:40 +0100ksqsf(~user@134.209.106.31)
2022-01-18 20:05:09 +0100 <awpr> oh right, I forgot the name since I never end up enabling it explicitly
2022-01-18 20:06:12 +0100val-host(~val-host@2a02:2f0f:9108:b00:6891:37fc:a7bd:3738) (Client Quit)
2022-01-18 20:06:32 +0100deadmarshal(~deadmarsh@95.38.228.70) (Ping timeout: 240 seconds)
2022-01-18 20:07:39 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 20:07:55 +0100alx741(~alx741@157.100.93.160)
2022-01-18 20:08:35 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 256 seconds)
2022-01-18 20:10:35 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 20:12:47 +0100zwro[m](~zwromatri@2001:470:69fc:105::1d4)
2022-01-18 20:15:24 +0100michalz(~michalz@185.246.204.122) (Ping timeout: 268 seconds)
2022-01-18 20:17:03 +0100dhouthoo(~dhouthoo@178-117-36-167.access.telenet.be) (Quit: WeeChat 3.4)
2022-01-18 20:18:54 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 20:21:03 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-01-18 20:21:26 +0100ksqsf(~user@134.209.106.31)
2022-01-18 20:22:45 +0100DNH(~DNH@2a02:8108:1100:16d8:edf9:3833:cff9:92b3) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-01-18 20:26:30 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 20:28:52 +0100alx741(~alx741@157.100.93.160)
2022-01-18 20:29:49 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 20:32:58 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 20:33:26 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2022-01-18 20:33:26 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2022-01-18 20:33:26 +0100finn_elijaFinnElija
2022-01-18 20:34:21 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 20:36:32 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-01-18 20:37:39 +0100ksqsf(~user@134.209.106.31)
2022-01-18 20:39:05 +0100DNH(~DNH@2a02:8108:1100:16d8:edf9:3833:cff9:92b3)
2022-01-18 20:39:40 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972)
2022-01-18 20:39:59 +0100fef(~thedawn@user/thedawn) (Quit: Leaving)
2022-01-18 20:40:30 +0100 <EvanR> are instances based on Generics inherently less efficient than handcoded ones for a given type
2022-01-18 20:40:33 +0100eron(~eron@2804:431:c7c2:3848:71e8:6fbf:96e2:3117)
2022-01-18 20:40:45 +0100 <EvanR> or is there some GHC magic
2022-01-18 20:41:01 +0100 <awpr> not inherently less efficient, but sometimes they are
2022-01-18 20:41:41 +0100 <awpr> the hope is that GHC will be able to inline from/to, do some optimization, and annihilate them against each other so that the result is the same as if it never went through generics
2022-01-18 20:41:55 +0100 <EvanR> oh, nice
2022-01-18 20:41:59 +0100 <monochrom> GHC does not have magic. However, efficiency depends on the actual class and methods.
2022-01-18 20:42:03 +0100 <[exa]> there are "pretty good chances" that it inlines to a form that is more less equivalent to what you'd get by writing the instances by hand
2022-01-18 20:42:22 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972) (Remote host closed the connection)
2022-01-18 20:42:28 +0100 <awpr> but if the particular instance has something that prevents that from working, or if the type is big enough that GHC doesn't want to inline it, then it's likely to become a disaster
2022-01-18 20:42:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 20:42:32 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:81c9:f67f:1443:f972)
2022-01-18 20:42:53 +0100 <monochrom> I don't see myself handwriting a more efficient Show than the usual Generics solution, for example.
2022-01-18 20:43:02 +0100ksqsf(~user@134.209.106.31)
2022-01-18 20:43:09 +0100 <monochrom> It's the same structural recursion.
2022-01-18 20:43:26 +0100 <awpr> (disaster: ) because actually executing to/from at runtime involves allocating/scrutinizing a _ton_ of data constructors
2022-01-18 20:43:28 +0100 <EvanR> yes but this business of first converting to a generic rep, then coming back
2022-01-18 20:43:39 +0100 <EvanR> at each element of the structure
2022-01-18 20:43:58 +0100bliminse(~bliminse@host86-188-36-178.range86-188.btcentralplus.com) (Quit: leaving)
2022-01-18 20:43:58 +0100 <EvanR> e.g. if it's a 4 field record, it'll become a (a :*: b) :*: (c :*: d)
2022-01-18 20:44:04 +0100 <monochrom> Ah, OK yeah.
2022-01-18 20:44:36 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net)
2022-01-18 20:44:36 +0100 <awpr> `case (case x of Left a -> L1 a; Right b -> R1 b) of L1 a -> showString "Left" ... ; R1 b -> showString "Right" ...`
2022-01-18 20:45:13 +0100 <awpr> this can be optimized easily enough to `case x of Left a -> showString "Left" ... ; Right b -> showString "Right" ...`
2022-01-18 20:45:13 +0100Hildegun1t(~luc@80.248.12.109.rev.sfr.net)
2022-01-18 20:45:38 +0100 <monochrom> Damn, the world is more magical than I thought.
2022-01-18 20:45:42 +0100Hildegun1t(~luc@80.248.12.109.rev.sfr.net) (Client Quit)
2022-01-18 20:46:00 +0100 <EvanR> so from-tos can be fused?
2022-01-18 20:46:23 +0100 <awpr> effectively yeah, in good cases they get inlined and eventually vanish
2022-01-18 20:46:29 +0100 <EvanR> that is amazing
2022-01-18 20:47:32 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 20:48:14 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.4)
2022-01-18 20:48:21 +0100 <awpr> unfortunately it's a bit brittle in that there's some cutoff point where GHC stops thinking it's worth it to inline from/to, compile times skyrocket, runtime performance gets slow, and there's not really anything you can do about it as a library author
2022-01-18 20:48:30 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
2022-01-18 20:49:02 +0100Hildegunst(~luc@80.248.12.109.rev.sfr.net) (Ping timeout: 240 seconds)
2022-01-18 20:49:02 +0100 <awpr> cutoff point in terms of the size (number of constructors/fields) of the type whose Generic instance is being used
2022-01-18 20:49:09 +0100 <EvanR> as a user though, you can write an offending instance by hand
2022-01-18 20:49:31 +0100 <awpr> yeah, that's true
2022-01-18 20:49:31 +0100 <EvanR> and remove deriving Generic
2022-01-18 20:49:48 +0100alx741(~alx741@157.100.93.160)
2022-01-18 20:50:05 +0100 <awpr> but then you have to notice that's happening, which is rarely obvious unless you're already looking at Core
2022-01-18 20:50:09 +0100eron(~eron@2804:431:c7c2:3848:71e8:6fbf:96e2:3117) (Quit: Client closed)
2022-01-18 20:50:21 +0100 <EvanR> if no one notices it's slow, then it's fast!
2022-01-18 20:51:02 +0100Midjak(~Midjak@may53-1-78-226-116-92.fbx.proxad.net) (Ping timeout: 240 seconds)
2022-01-18 20:51:17 +0100 <awpr> alternatively if no one notices your Generic instance is slow due to inlining failure, then it's an ambient performance tax that just gets lumped into a vague cultural belief that Haskell is slow
2022-01-18 20:52:20 +0100 <monochrom> This is why I look at Core all the time.
2022-01-18 20:52:57 +0100 <monochrom> My ratio of looking at Core to looking at profiling graphs is 99:1.
2022-01-18 20:52:58 +0100alx741(~alx741@157.100.93.160) (Read error: Connection reset by peer)
2022-01-18 20:54:00 +0100 <EvanR> I don't even see Core anymore, just blonde, brunette, redhead
2022-01-18 20:54:37 +0100 <EvanR> (a reference to this really old movie The Matrix)
2022-01-18 20:54:58 +0100 <Rembane> EvanR: Good reference. Good movie.
2022-01-18 20:55:11 +0100 <sm> truthfully ? that's interesting then
2022-01-18 20:55:27 +0100 <sm> (monochrom)
2022-01-18 20:55:49 +0100 <awpr> profiling graph is just a hint about what Core to look at :)
2022-01-18 20:56:06 +0100 <EvanR> getting a core output and looking at it seems somewhat more ergonomic than profiling graph
2022-01-18 20:56:21 +0100mjs2600(~mjs2600@c-24-91-3-49.hsd1.vt.comcast.net) (Ping timeout: 256 seconds)
2022-01-18 20:56:23 +0100 <EvanR> since it's text
2022-01-18 20:56:24 +0100smresolves to read more core in 2022
2022-01-18 20:57:38 +0100 <sm> but which reveals relevant insights more l efficiently
2022-01-18 20:58:06 +0100bliminse(~bliminse@host86-188-36-178.range86-188.btcentralplus.com)
2022-01-18 20:58:26 +0100smdoesn't get as far as charts, but does read textual profile output from time to time
2022-01-18 20:58:45 +0100geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-01-18 20:59:21 +0100 <monochrom> I am an extreme. But awpr is at the truth in the middle. A profiling graph can only tell you where to dig. It still doesn't dig for you.
2022-01-18 21:00:29 +0100geekosaur(~geekosaur@xmonad/geekosaur)
2022-01-18 21:01:31 +0100 <sm> gtoolkit.com advocates "moldable development": casually whipping up just the custom tools and visualizations you need at any point. I want this
2022-01-18 21:02:39 +0100ubert(~Thunderbi@141.98.252.232) (Quit: ubert)
2022-01-18 21:05:25 +0100juhp(~juhp@128.106.188.82) (Ping timeout: 256 seconds)
2022-01-18 21:05:52 +0100 <EvanR> that's some ironman sh*t
2022-01-18 21:06:04 +0100 <EvanR> jarvis, show me something
2022-01-18 21:06:28 +0100 <sm> :)
2022-01-18 21:06:41 +0100 <monochrom> "I'm going to send you to the MIT student lab"
2022-01-18 21:06:45 +0100juhp(~juhp@128.106.188.82)
2022-01-18 21:08:07 +0100 <sm> could be a point of contact between the smalltalk and haskell worlds. (needs a haskell parser added)
2022-01-18 21:08:16 +0100gehmehgeh(~user@user/gehmehgeh) (Remote host closed the connection)
2022-01-18 21:09:00 +0100gehmehgeh(~user@user/gehmehgeh)
2022-01-18 21:11:15 +0100ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 276 seconds)
2022-01-18 21:13:00 +0100ec(~ec@gateway/tor-sasl/ec)
2022-01-18 21:17:53 +0100geranim0(~geranim0@modemcable242.171-178-173.mc.videotron.ca) (Ping timeout: 256 seconds)
2022-01-18 21:18:51 +0100xkuru(~xkuru@user/xkuru)
2022-01-18 21:19:17 +0100lavaman(~lavaman@98.38.249.169)
2022-01-18 21:21:09 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2022-01-18 21:21:32 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-01-18 21:23:51 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 268 seconds)
2022-01-18 21:24:47 +0100ProfSimm(~ProfSimm@87.227.196.109) (Remote host closed the connection)
2022-01-18 21:25:06 +0100ProfSimm(~ProfSimm@87.227.196.109)
2022-01-18 21:25:42 +0100mjs2600(~mjs2600@c-24-91-3-49.hsd1.vt.comcast.net)
2022-01-18 21:25:49 +0100travv0(sid293381@user/travv0)
2022-01-18 21:31:02 +0100Tuplanolla(~Tuplanoll@91-159-68-166.elisa-laajakaista.fi)
2022-01-18 21:32:15 +0100ksqsf(~user@134.209.106.31)
2022-01-18 21:33:11 +0100kmein(~weechat@user/kmein) (Quit: ciao kakao)
2022-01-18 21:33:31 +0100kmein(~weechat@user/kmein)
2022-01-18 21:37:02 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 240 seconds)
2022-01-18 21:39:23 +0100ubert(~Thunderbi@p200300ecdf09949e91b35a252eb85141.dip0.t-ipconnect.de)
2022-01-18 21:39:26 +0100ubert(~Thunderbi@p200300ecdf09949e91b35a252eb85141.dip0.t-ipconnect.de) (Client Quit)
2022-01-18 21:41:02 +0100qeqeqw1(~qeqeqw3@2001:861:3a04:e320:31ea:a59b:1c06:51f4) (Ping timeout: 240 seconds)
2022-01-18 21:41:19 +0100jkaye(~jkaye@2601:281:200:1958:2b64:9a7d:6899:8349)
2022-01-18 21:41:29 +0100pfurla(~pfurla@2804:d41:4331:4800:31ef:1aaf:1e7:47d)
2022-01-18 21:46:58 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-01-18 21:48:15 +0100kuribas(~user@ptr-25vy0ia11vvy5vw4h88.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 26.3))
2022-01-18 21:49:13 +0100hololeap_(~hololeap@user/hololeap)
2022-01-18 21:49:14 +0100kojo5551(~kojo5551@fep.grid.pub.ro) (Remote host closed the connection)
2022-01-18 21:49:18 +0100Midjak(~Midjak@may53-1-78-226-116-92.fbx.proxad.net)
2022-01-18 21:50:49 +0100val-host(~val-host@2a02:2f0f:9108:b00:6891:37fc:a7bd:3738)
2022-01-18 21:50:59 +0100notzmv(~zmv@user/notzmv) (Ping timeout: 268 seconds)
2022-01-18 21:51:35 +0100kojo5551(~kojo5551@fep.grid.pub.ro)
2022-01-18 21:52:12 +0100hololeap(~hololeap@user/hololeap) (Ping timeout: 276 seconds)
2022-01-18 21:52:31 +0100val-host(~val-host@2a02:2f0f:9108:b00:6891:37fc:a7bd:3738) (Client Quit)
2022-01-18 21:55:28 +0100slac52114(~slack1256@191.125.99.76)
2022-01-18 21:57:09 +0100dut(~dut@user/dut) (Quit: Leaving)
2022-01-18 21:57:32 +0100slack1256(~slack1256@186.11.99.46) (Ping timeout: 240 seconds)
2022-01-18 22:00:13 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds)
2022-01-18 22:01:36 +0100ubert(~Thunderbi@p200300ecdf09949e91b35a252eb85141.dip0.t-ipconnect.de)
2022-01-18 22:02:15 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-01-18 22:03:03 +0100pavonia(~user@user/siracusa)
2022-01-18 22:03:10 +0100vysn(~vysn@user/vysn) (Ping timeout: 250 seconds)
2022-01-18 22:10:32 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 240 seconds)
2022-01-18 22:10:38 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-01-18 22:11:10 +0100ec(~ec@gateway/tor-sasl/ec)
2022-01-18 22:12:08 +0100slack1256(~slack1256@186.11.27.197)
2022-01-18 22:14:10 +0100Pickchea(~private@user/pickchea)
2022-01-18 22:14:33 +0100slac52114(~slack1256@191.125.99.76) (Ping timeout: 256 seconds)
2022-01-18 22:16:34 +0100_ht(~quassel@2a02:a468:b619:1:c1f2:a735:3541:23f8) (Remote host closed the connection)
2022-01-18 22:18:01 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl)
2022-01-18 22:23:19 +0100tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-01-18 22:25:21 +0100wyrd(~wyrd@gateway/tor-sasl/wyrd) (Ping timeout: 276 seconds)
2022-01-18 22:26:26 +0100ksqsf(~user@134.209.106.31)
2022-01-18 22:31:41 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 22:32:05 +0100mc47(~mc47@xmonad/TheMC47) (Remote host closed the connection)
2022-01-18 22:33:24 +0100dut(~dut@user/dut)
2022-01-18 22:36:43 +0100gehmehgeh(~user@user/gehmehgeh) (Quit: Leaving)
2022-01-18 22:37:57 +0100jgeerds(~jgeerds@55d4090e.access.ecotel.net)
2022-01-18 22:41:03 +0100xlei_(~akans@pool-71-125-19-142.nycmny.fios.verizon.net) (Quit: ZNC 1.9.x-git-167-81df4dec - https://znc.in)
2022-01-18 22:43:48 +0100Zugul(~Zugul@52.173.255.131)
2022-01-18 22:43:55 +0100MajorBiscuit(~MajorBisc@2a02:a461:129d:1:6d4c:38a4:18b7:4b48)
2022-01-18 22:44:10 +0100 <Zugul> !help
2022-01-18 22:44:24 +0100 <Zugul> ??
2022-01-18 22:52:21 +0100merijn(~merijn@c-001-001-018.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-01-18 22:52:51 +0100 <geekosaur> yes?
2022-01-18 22:54:04 +0100 <monochrom> We have not bots here.
2022-01-18 22:54:15 +0100 <monochrom> err I can't type. We have no bots here.
2022-01-18 22:54:32 +0100jle`(~jle`@cpe-23-240-75-236.socal.res.rr.com) (Ping timeout: 240 seconds)
2022-01-18 22:55:05 +0100smwhispers /msg lambdabot @help
2022-01-18 22:56:29 +0100jle`(~jle`@cpe-23-240-75-236.socal.res.rr.com)
2022-01-18 22:57:17 +0100 <monochrom> Ugh I just rediscovered that "@quote monochrom monad" is full of past wisdom I forgot. :)
2022-01-18 22:58:14 +0100geekosaursends monochrom a burrito
2022-01-18 23:02:43 +0100MajorBiscuit(~MajorBisc@2a02:a461:129d:1:6d4c:38a4:18b7:4b48) (Quit: WeeChat 3.3)
2022-01-18 23:05:11 +0100 <monochrom> I had a quote that's way more general than burrito!
2022-01-18 23:05:18 +0100 <monochrom> @quote monochrom monad.*dinner
2022-01-18 23:05:18 +0100 <lambdabot> monochrom says: We the haskell community should henceforth use "what is a monad" as our secret code for "dinner time!"
2022-01-18 23:06:22 +0100 <Rembane> That's a very good quote.
2022-01-18 23:06:28 +0100 <monochrom> :)
2022-01-18 23:07:17 +0100 <wombat875> kl
2022-01-18 23:07:25 +0100wombat875(~neilfulwi@pool-72-89-24-154.nycmny.fios.verizon.net) (Quit: WeeChat 2.2-dev)
2022-01-18 23:07:44 +0100wombat875(~neilfulwi@pool-72-89-24-154.nycmny.fios.verizon.net)
2022-01-18 23:08:06 +0100 <wombat875> lol sorry still trying to figure out weechat shortcuts
2022-01-18 23:10:00 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-01-18 23:11:15 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-01-18 23:12:08 +0100fendor(~fendor@178.115.55.2.wireless.dyn.drei.com) (Remote host closed the connection)
2022-01-18 23:13:37 +0100ystael(~ystael@user/ystael) (Ping timeout: 268 seconds)
2022-01-18 23:14:02 +0100wombat875(~neilfulwi@pool-72-89-24-154.nycmny.fios.verizon.net) (Ping timeout: 240 seconds)
2022-01-18 23:15:00 +0100wombat875(~neilfulwi@pool-72-89-24-154.nycmny.fios.verizon.net)
2022-01-18 23:15:01 +0100ystael(~ystael@user/ystael)
2022-01-18 23:17:17 +0100ystael(~ystael@user/ystael) (Read error: Connection reset by peer)
2022-01-18 23:17:28 +0100ystael(~ystael@user/ystael)
2022-01-18 23:20:33 +0100ksqsf(~user@134.209.106.31)
2022-01-18 23:23:30 +0100ksqsf(~user@134.209.106.31) (Remote host closed the connection)
2022-01-18 23:24:01 +0100 <d34df00d> Is there anything in quickcheck that'll give me a random partition of a list?
2022-01-18 23:24:16 +0100 <d34df00d> (that is, a list of sublists such that their concatenation is equal to the original list)
2022-01-18 23:25:17 +0100xb0o2(~xb0o2@user/xb0o2) (Quit: Client closed)
2022-01-18 23:27:38 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
2022-01-18 23:27:39 +0100wmacmil(~wmacmil@83-233-165-97.cust.bredband2.com) (Ping timeout: 256 seconds)
2022-01-18 23:27:41 +0100 <d34df00d> Ok, I think it's a three-liner and not worth a library.
2022-01-18 23:28:32 +0100`2jt(~jtomas@10.red-83-58-228.dynamicip.rima-tde.net) (Ping timeout: 240 seconds)
2022-01-18 23:28:39 +0100 <hpc> it's worth a library if you write javascript^W^Wbelieve in yourself :D
2022-01-18 23:28:45 +0100 <Rembane> d34df00d: How did you solve it? :)
2022-01-18 23:29:42 +0100 <d34df00d> Rembane: for an empty or singleton list, return the list containing of that list. Otherwise, pick a number between (1; length xs), `take` that many off the list, recur on the `drop`, append the result of the `take` to the recursive call result.
2022-01-18 23:29:59 +0100 <d34df00d> Not proven to give statistically meaningful results, but OK for my purposes.
2022-01-18 23:30:09 +0100 <monochrom> A library would need to parametrize a lot of things, e.g., the distribution of how many splittings, the distribution of each actual splitting point, etc etc...
2022-01-18 23:30:55 +0100 <Rembane> d34df00d: Nice solution! You can use splitAt if you want to have take and drop in the same function.
2022-01-18 23:31:13 +0100 <d34df00d> Yep, that's in fact what I'm doing :]
2022-01-18 23:31:16 +0100 <hpc> i wonder how many quick checks haven't been written because writing that partitioning code yourself is too annoying
2022-01-18 23:31:40 +0100 <d34df00d> splitAt is nice and handy!
2022-01-18 23:31:47 +0100 <Rembane> d34df00d: Sweet! :) You can also use partitionM and feed it a Bool generator, but I don't know if it's worth that extra library.
2022-01-18 23:31:57 +0100 <Rembane> hpc: Seven! At least!
2022-01-18 23:32:07 +0100 <d34df00d> Rembane: that'll mess up the ordering of the elements, I think?
2022-01-18 23:32:09 +0100ksqsf(~user@134.209.106.31)
2022-01-18 23:32:23 +0100 <hpc> maybe even eight!
2022-01-18 23:32:33 +0100 <monochrom> Hrm, what does partitionM do again?
2022-01-18 23:32:38 +0100 <Rembane> d34df00d: Yup, I totally missed that you wanted the ordering to be the same.
2022-01-18 23:33:03 +0100 <Rembane> monochrom: partition but with monads! https://hackage.haskell.org/package/extra-1.7.10/docs/Control-Monad-Extra.html#v:partitionM
2022-01-18 23:33:11 +0100Danishman(~Danishman@2-104-144-110-cable.dk.customer.tdc.net) (Quit: Leaving)
2022-01-18 23:33:38 +0100 <monochrom> Thanks.
2022-01-18 23:34:22 +0100 <Rembane> np!
2022-01-18 23:37:03 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 268 seconds)
2022-01-18 23:39:24 +0100ksqsf(~user@134.209.106.31)
2022-01-18 23:41:22 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
2022-01-18 23:42:46 +0100Swahili(~Swahili@a95-94-208-187.cpe.netcabo.pt)
2022-01-18 23:43:14 +0100 <Swahili> Q: In ghci, the commands :l or :r, what are these called? Can I say utility commands?
2022-01-18 23:43:26 +0100 <Swahili> or is there a name for it?
2022-01-18 23:43:59 +0100Sindai(~Sindai@2a01cb0583e8cd008d228a3c88136061.ipv6.abo.wanadoo.fr)
2022-01-18 23:44:05 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.4)
2022-01-18 23:44:50 +0100 <hpc> ghci's :help just calls them commands
2022-01-18 23:44:56 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
2022-01-18 23:45:05 +0100 <hpc> unless you mean those specifically?
2022-01-18 23:45:24 +0100 <geekosaur> the user's guide doesn't distinguish either
2022-01-18 23:45:39 +0100 <geekosaur> the only commands it treats specially are :set and :seti
2022-01-18 23:48:12 +0100 <monochrom> You can safely say "command". If you really like "utility command", I think it is also clear.
2022-01-18 23:49:17 +0100 <Swahili> hpc: thank you!
2022-01-18 23:49:36 +0100 <Swahili> geekosaur: monochrom thank you!
2022-01-18 23:50:00 +0100alp(~alp@user/alp) (Ping timeout: 268 seconds)
2022-01-18 23:50:47 +0100laslmtdbm^(~laslmtdbm@wsip-98-188-242-61.mc.at.cox.net) (Remote host closed the connection)
2022-01-18 23:54:36 +0100ubert(~Thunderbi@p200300ecdf09949e91b35a252eb85141.dip0.t-ipconnect.de) (Remote host closed the connection)
2022-01-18 23:57:08 +0100ksqsf(~user@134.209.106.31) (Ping timeout: 250 seconds)
2022-01-18 23:57:15 +0100burnsidesLlama(~burnsides@dhcp168-015.wadham.ox.ac.uk) (Remote host closed the connection)
2022-01-18 23:58:37 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-01-18 23:58:37 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-01-18 23:58:37 +0100wroathe(~wroathe@user/wroathe)