2023/11/06

2023-11-06 00:01:11 +0100[_](~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 260 seconds)
2023-11-06 00:03:23 +0100 <EvanR> ok Applicative has no way of doing that, I guess
2023-11-06 00:04:08 +0100gmg(~user@user/gehmehgeh) (Quit: Leaving)
2023-11-06 00:04:39 +0100ciiur^^(~cd@70-88-177-118-Atlanta.hfc.comcastbusiness.net) (Remote host closed the connection)
2023-11-06 00:07:56 +0100 <EvanR> if Coyoneda is a free functor factory, is Yoneda a forgetful functor factory?
2023-11-06 00:12:42 +0100 <ncf> nah
2023-11-06 00:16:03 +0100acidjnk(~acidjnk@p200300d6e72b93365d0d304e1b7de813.dip0.t-ipconnect.de) (Ping timeout: 258 seconds)
2023-11-06 00:16:43 +0100zetef(~quassel@5.2.182.98) (Ping timeout: 264 seconds)
2023-11-06 00:18:06 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 260 seconds)
2023-11-06 00:18:56 +0100target_i(~target_i@217.175.14.39) (Quit: leaving)
2023-11-06 00:19:25 +0100 <dolio> Yoneda is the cofree functor.
2023-11-06 00:21:17 +0100zetef(~quassel@5.2.182.98)
2023-11-06 00:21:19 +0100 <dolio> You can put anything in Coyoneda, but need it to be a functor to get it out. You can get anything out of Yoneda, but need it to be a functor to put it in.
2023-11-06 00:24:55 +0100 <ncf> Yoneda would be the right adjoint to my forgetful functor, i think
2023-11-06 00:25:02 +0100 <dolio> Right.
2023-11-06 00:25:03 +0100notzmv(~zmv@user/notzmv)
2023-11-06 00:25:54 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 00:25:55 +0100 <EvanR> I see they "got out" in the blog post by hoisting from the non-functor to a functor (the implementation monad transformer)
2023-11-06 00:26:21 +0100zetef(~quassel@5.2.182.98)
2023-11-06 00:26:39 +0100zetef(~quassel@5.2.182.98) (Read error: Connection reset by peer)
2023-11-06 00:27:07 +0100zetef(~quassel@5.2.182.98)
2023-11-06 00:27:26 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 00:27:32 +0100 <ncf> i'm actually confused about something now: if you put a functor through Coyoneda you're supposed to get the same functor you put in, i.e. Coyoneda (U F) ≅ F. but that would imply that functors are a full subcategory of object-mappings-and-natural-transformations, which they aren't since morphism mappings aren't unique
2023-11-06 00:27:54 +0100zetef(~quassel@5.2.182.98)
2023-11-06 00:27:57 +0100zetef(~quassel@5.2.182.98) (Read error: Connection reset by peer)
2023-11-06 00:28:23 +0100 <ncf> a reflective subcategory even
2023-11-06 00:29:26 +0100califax(~califax@user/califx) (Remote host closed the connection)
2023-11-06 00:29:45 +0100califax(~califax@user/califx)
2023-11-06 00:30:01 +0100 <dolio> I don't know if that's actually the right forgetful functor.
2023-11-06 00:30:35 +0100 <ncf> i should ask agda what it thinks
2023-11-06 00:31:39 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 00:31:59 +0100Square2(~Square4@user/square)
2023-11-06 00:37:09 +0100 <ncf> what am i even doing
2023-11-06 00:37:23 +0100 <ncf> Coyoneda is defined as a coend, so you can't apply it to something that's not in functor
2023-11-06 00:37:40 +0100 <ncf> you can only do that in haskell because the coend condition is not enforced
2023-11-06 00:37:55 +0100 <ncf> s/in/a/
2023-11-06 00:38:23 +0100Inst(~Inst@120.244.192.250) (Read error: Connection reset by peer)
2023-11-06 00:39:50 +0100xff0x(~xff0x@2405:6580:b080:900:6924:f1c7:f24d:2a0e) (Ping timeout: 255 seconds)
2023-11-06 00:40:43 +0100 <ncf> i think really what's going on is that every * → * in haskell is a functor even if you don't declare a Functor instance for it, because parametricity
2023-11-06 00:40:50 +0100xff0x(~xff0x@2405:6580:b080:900:9f61:b997:2a7f:e8b4)
2023-11-06 00:40:55 +0100 <dolio> No.
2023-11-06 00:41:05 +0100 <ncf> er
2023-11-06 00:41:12 +0100 <ncf> assuming the right variance
2023-11-06 00:41:19 +0100 <dolio> Okay, so, no.
2023-11-06 00:44:43 +0100Inst(~Inst@120.244.192.250)
2023-11-06 00:45:42 +0100 <EvanR> every * -> * is a functor in the category hask restricted to having only identity morphisms?
2023-11-06 00:45:59 +0100 <EvanR> am I doing category theory right? xD
2023-11-06 00:46:02 +0100 <dolio> Certainly that, at least.
2023-11-06 00:49:18 +0100L29Ah(~L29Ah@wikipedia/L29Ah) ()
2023-11-06 00:50:39 +0100 <ncf> on Core(Hask), even
2023-11-06 00:50:59 +0100 <ncf> ok but at least Functor is a property because of parametricity, so that solves the uniqueness mystery
2023-11-06 00:51:51 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2023-11-06 00:55:21 +0100 <monochrom> My favourite "newtype D a = D (D a -> a)" is not going to be a functor. >:)
2023-11-06 00:55:47 +0100 <monochrom> In fact, it's so contravariant to the extreme, it recovers fix.
2023-11-06 00:56:40 +0100Square2(~Square4@user/square) (Quit: Leaving)
2023-11-06 00:59:13 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 00:59:34 +0100 <EvanR> hold my beer
2023-11-06 01:03:20 +0100 <monochrom> :)
2023-11-06 01:05:37 +0100 <EvanR> fmap f (D h) = D g where g db = f (h (D h)) ?
2023-11-06 01:07:04 +0100Ram-Z(~Ram-Z@li1814-254.members.linode.com) (Ping timeout: 255 seconds)
2023-11-06 01:08:12 +0100 <ncf> wee woo this is the functor police
2023-11-06 01:08:53 +0100 <ncf> may i see your `id`
2023-11-06 01:08:55 +0100 <EvanR> fmap id (D h) = not obviously D h
2023-11-06 01:09:37 +0100 <geekosaur> pity lambdabot can't reasonably do multiline quotes 😛
2023-11-06 01:09:53 +0100 <EvanR> db isn't used so the chances of this working are low
2023-11-06 01:09:54 +0100 <Inst> how do you even make a value of type D a = D (D a -> a)?
2023-11-06 01:10:06 +0100 <Axman6> by being very careful
2023-11-06 01:10:25 +0100 <EvanR> D (\_ -> 'c') is cromulent
2023-11-06 01:13:40 +0100chiselfuse(~chiselfus@user/chiselfuse) (Ping timeout: 256 seconds)
2023-11-06 01:13:48 +0100 <EvanR> D (\(D h) -> h (\_ -> 'c'))
2023-11-06 01:14:04 +0100 <EvanR> blaw
2023-11-06 01:14:14 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 256 seconds)
2023-11-06 01:14:22 +0100 <EvanR> don't reinvent the wheel
2023-11-06 01:15:50 +0100 <Inst> is there a non const function that can be embedded into D a?
2023-11-06 01:15:56 +0100chiselfuse(~chiselfus@user/chiselfuse)
2023-11-06 01:17:01 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2023-11-06 01:18:41 +0100 <EvanR> D (\(D h) -> h (D (\_ -> 'c'))), not a const
2023-11-06 01:19:38 +0100ec(~ec@gateway/tor-sasl/ec)
2023-11-06 01:19:43 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 264 seconds)
2023-11-06 01:20:03 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df)
2023-11-06 01:20:40 +0100 <EvanR> I think the game theory thing would come in handy here
2023-11-06 01:23:34 +0100idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.1.1)
2023-11-06 01:30:37 +0100lg188(~lg188@82.18.98.230) (Ping timeout: 255 seconds)
2023-11-06 01:30:48 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:1052:6194:3db5:da7a) (Remote host closed the connection)
2023-11-06 01:30:49 +0100 <monochrom> Example value: D (\d@(D f) -> f d). Recall: \x -> x x
2023-11-06 01:32:23 +0100 <monochrom> In fact, recall what error you get if you ask Haskell about \x -> x x.
2023-11-06 01:32:25 +0100Ekho(~Ekho@user/ekho) (Quit: CORE ERROR, SYSTEM HALTED.)
2023-11-06 01:32:27 +0100 <monochrom> @type \x -> x x
2023-11-06 01:32:28 +0100 <lambdabot> error:
2023-11-06 01:32:28 +0100 <lambdabot> • Occurs check: cannot construct the infinite type: t ~ t -> t1
2023-11-06 01:32:28 +0100 <lambdabot> • In the first argument of ‘x’, namely ‘x’
2023-11-06 01:33:25 +0100 <monochrom> So just use a newtype to define T ~ T -> t1. Now just parametrize by t1: s/T/D t1/
2023-11-06 01:33:48 +0100tabemann(~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Quit: Leaving)
2023-11-06 01:33:59 +0100 <monochrom> I put this on the exam. >:)
2023-11-06 01:34:11 +0100 <EvanR> what's the question
2023-11-06 01:34:37 +0100 <EvanR> the answer is intriguing
2023-11-06 01:35:43 +0100notzmv(~zmv@user/notzmv) (Read error: Connection reset by peer)
2023-11-06 01:36:37 +0100 <probie> let thing = (\x -> x x) :: (forall a . (a -> a) -> (a -> a)) -> (b -> b) -> (b -> b) in thing (\f -> f . f) (*2) 5
2023-11-06 01:36:49 +0100 <probie> > let thing = (\x -> x x) :: (forall a . (a -> a) -> (a -> a)) -> (b -> b) -> (b -> b) in thing (\f -> f . f) (*2) 5
2023-11-06 01:36:50 +0100 <lambdabot> 80
2023-11-06 01:36:53 +0100 <ncf> you don't get that error on GHC 9, apparently :(
2023-11-06 01:37:09 +0100 <monochrom> Infer the types of (\f -> f (D f)) and (\w -> (unD w) w). (unD (D f) = f.)
2023-11-06 01:37:12 +0100 <geekosaur> % :t \x -> x x
2023-11-06 01:37:12 +0100 <yahb2> <interactive>:1:9: error: ; • Couldn't match expected type ‘t’ with actual type ‘t -> t1’ ; ‘t’ is a rigid type variable bound by ; the inferred type of it :: (t -> t1) -> t1 ; ...
2023-11-06 01:37:37 +0100 <monochrom> Yeah I miss the infinite type message. I need it for my course!
2023-11-06 01:38:43 +0100 <monochrom> Because I teach \x -> x x as an example of untyped lambda calculus, and I teach type inference, and why it has an occurs-check.
2023-11-06 01:39:33 +0100 <EvanR> error: you speak an infinite deal of type
2023-11-06 01:40:55 +0100 <ncf> looks like spj removed it in https://gitlab.haskell.org/ghc/ghc/-/commit/2b792facab46f7cdd09d12e79499f4e0dcd4293f
2023-11-06 01:41:13 +0100 <ncf> ...three years ago
2023-11-06 01:42:03 +0100 <geekosaur> presumably because the typechecker was now smart enouhg to catch it itself instead of going into an infinite loop
2023-11-06 01:43:07 +0100 <ncf> > One particular point: for occurs-check errors I now just say Can't match 'a' against '[a]' rather than using the intimidating language of "occurs check".
2023-11-06 01:43:09 +0100 <lambdabot> <hint>:1:88: error: parse error on input ‘a’
2023-11-06 01:43:23 +0100 <geekosaur> ah
2023-11-06 01:44:12 +0100 <ncf> cannot construct intimidating language
2023-11-06 01:44:48 +0100 <geekosaur> most newcomers seem to find "Couldn't match" pretty intimidating…
2023-11-06 01:44:51 +0100 <EvanR> can't match 'a' against '[a]' sounds reasonable
2023-11-06 01:45:06 +0100 <probie> :t let x = 42 in x x
2023-11-06 01:45:08 +0100 <lambdabot> (Num t1, Num (t1 -> t2)) => t2
2023-11-06 01:45:37 +0100 <geekosaur> don't make me install caleskell 😛
2023-11-06 01:45:48 +0100 <monochrom> Unpopular opinion: Slippery slope. :)
2023-11-06 01:45:49 +0100 <EvanR> that intimidates me, I demand an error message instead
2023-11-06 01:46:17 +0100 <Inst> ah, i understand, this is fix, the type, isn't it?
2023-11-06 01:47:00 +0100 <EvanR> D is a plausible domain for interpretation untyped lambda calculus functions
2023-11-06 01:47:07 +0100 <monochrom> There are many different kinds of fix. But yes.
2023-11-06 01:47:08 +0100 <EvanR> of
2023-11-06 01:47:12 +0100 <geekosaur> sort of. it's a recursive type, and without specific checks the typechecker would go into an infinite loop
2023-11-06 01:47:25 +0100 <ncf> is it? it doesn't satisfy D ≃ (D → D)
2023-11-06 01:47:40 +0100 <EvanR> you have to squint
2023-11-06 01:47:52 +0100 <ncf> seems like it can interpret *some* untyped λ terms
2023-11-06 01:48:05 +0100 <geekosaur> but indeed I wouldn't call it a fixpoint combinator, just recursion
2023-11-06 01:48:34 +0100 <Inst> sort of makes me ask what the mathematical underpinning of the Foldable typeclass is
2023-11-06 01:48:35 +0100notzmv(~zmv@user/notzmv)
2023-11-06 01:48:36 +0100Ekho(~Ekho@user/ekho)
2023-11-06 01:49:01 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Quit: ZNC - http://znc.in)
2023-11-06 01:49:09 +0100 <Inst> since I'm currently assuming every lawful typeclass in Haskell has a mathematical underpinning (I'm sure it's easy to find counterexamples)
2023-11-06 01:49:22 +0100Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 255 seconds)
2023-11-06 01:49:41 +0100 <EvanR> Inst, tree reduction strategies, there are many, but if a monoid is used the strategies all get the same answer (this is fold). foldl and foldr don't require monoid and can differ
2023-11-06 01:49:44 +0100 <monochrom> I wonder what if you then define newtype D1 = D1 (D D1). Then D1 ≅ D1 -> D1, I think.
2023-11-06 01:50:34 +0100 <Inst> thanks <EvanR3
2023-11-06 01:51:35 +0100 <EvanR> give or take encountering bottom too early
2023-11-06 01:52:07 +0100 <ncf> Foldable boils down to toList i think, i.e. a natural transformation to []
2023-11-06 01:52:09 +0100 <monochrom> Unpopular opinion: What people get backwards is that they look for practical underpinnings of Functor and mathematical underpinning of Foldable.
2023-11-06 01:52:22 +0100 <EvanR> toList is just one application of foldable
2023-11-06 01:52:26 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df)
2023-11-06 01:53:28 +0100 <Inst> fmap is actually adroitly named, isn't it?
2023-11-06 01:53:42 +0100 <Inst> because it's not a true "map" in the traditional programming sense, by including laws
2023-11-06 01:53:54 +0100 <EvanR> what is a true map
2023-11-06 01:53:54 +0100 <ncf> EvanR: but subsumes all others
2023-11-06 01:54:27 +0100 <EvanR> ncf, because taking seriously the idea that [] is "the free monoid", ...
2023-11-06 01:54:32 +0100 <Inst> return the object, with all its parameters having the function applied onto it
2023-11-06 01:54:48 +0100 <EvanR> fmap does that when that description makes sense
2023-11-06 01:55:12 +0100 <Inst> but would you say contramap is a map in a traditional programming sense?
2023-11-06 01:55:56 +0100 <monochrom> join is "not a true flat", and >>= is "not a true concatMap".
2023-11-06 01:56:19 +0100falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 264 seconds)
2023-11-06 01:56:20 +0100 <monochrom> But I don't care. Bart Jacobs has decided to call join "flat". That is good enough for me.
2023-11-06 01:56:37 +0100 <EvanR> flat is based
2023-11-06 01:56:46 +0100 <monochrom> In a recent talk, I introduce these 3 names for >>=: bind, then, flat-map. :)
2023-11-06 01:56:59 +0100 <Inst> >> is already called then :(
2023-11-06 01:57:03 +0100 <Inst> >> and *>
2023-11-06 01:57:24 +0100 <EvanR> >> is already called right shift
2023-11-06 01:57:57 +0100 <EvanR> pure is already called return
2023-11-06 01:58:15 +0100 <monochrom> I know another community (HOL theorem prover) who would call >>= "then".
2023-11-06 01:58:30 +0100 <talismanick> Say an API has several different available URLs, but some don't 24/7 work and I want to check which do before using that
2023-11-06 01:58:34 +0100 <talismanick> I could mapM wreq's "get" and asum the list of responses to pick the first one, but that would wait for all of them to 403, etc before I even starting picking one
2023-11-06 01:58:58 +0100 <EvanR> you could async race them all
2023-11-06 01:58:59 +0100 <talismanick> How might I lazily interleave them to halt on the first working URL?
2023-11-06 01:59:06 +0100 <monochrom> This is because they have a lot of CPSed functions, all named like "foo_then". And their "foo_then" just means our "(foo >>=)" left sections.
2023-11-06 01:59:30 +0100 <talismanick> EvanR: oh, that's not the worst idea I guess
2023-11-06 01:59:39 +0100 <EvanR> which will kill all remaining losers
2023-11-06 02:00:32 +0100talismanicklooks up if async has a pertinent Alternative instance
2023-11-06 02:01:24 +0100 <monochrom> Probably not, on the ground that there are multiple candidates racing for it. (pun!)
2023-11-06 02:01:41 +0100 <talismanick> Oh neat, it does
2023-11-06 02:01:52 +0100 <monochrom> :(
2023-11-06 02:02:05 +0100 <monochrom> Someone has to lose, I guess.
2023-11-06 02:02:30 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:1052:6194:3db5:da7a)
2023-11-06 02:02:36 +0100 <talismanick> Alternative is basically Prolog-style committed choice nondeterminism, after all
2023-11-06 02:02:43 +0100 <monochrom> Darn, my pun was not optimized.
2023-11-06 02:02:57 +0100 <monochrom> Optimized: There are multiple alternatives racing for it. >:)
2023-11-06 02:04:07 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 264 seconds)
2023-11-06 02:08:41 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 240 seconds)
2023-11-06 02:08:49 +0100Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2023-11-06 02:10:10 +0100Lord_of_Life_Lord_of_Life
2023-11-06 02:12:34 +0100 <Inst> btw, is there a way to hide reexports in a module?
2023-11-06 02:15:06 +0100 <geekosaur> the same way you hide anything else?
2023-11-06 02:15:23 +0100 <monochrom> Like this? module X(module Y) where import Y hiding (y)
2023-11-06 02:16:42 +0100 <geekosaur> if you want to use y yourself but not reexport it, import it a second time qualified
2023-11-06 02:17:10 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2023-11-06 02:17:20 +0100[_](~itchyjunk@user/itchyjunk/x-7353470)
2023-11-06 02:19:48 +0100 <Inst> erm, in importing
2023-11-06 02:20:06 +0100 <Inst> import SomeMod hiding (SomOtherMod)
2023-11-06 02:20:13 +0100tabemann(~tabemann@172-13-49-137.lightspeed.milwwi.sbcglobal.net)
2023-11-06 02:20:18 +0100 <Inst> i.e, if I want to import Vector unqualified but hide everything that conflicts with Data.Foldable
2023-11-06 02:20:49 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 02:23:13 +0100 <monochrom> I don't think there is syntax for that.
2023-11-06 02:23:42 +0100 <monochrom> Instead, people import Vector qualified. (Because it even clashes with Prelude.)
2023-11-06 02:24:06 +0100 <monochrom> (OK maybe not Prelude but Data.List etc.)
2023-11-06 02:25:21 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 240 seconds)
2023-11-06 02:26:54 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 02:27:30 +0100edilmedeiros(~user@2804:14c:658b:5993:414e:c397:748f:b8af)
2023-11-06 02:28:45 +0100 <EvanR> import qualified Data.Vector as V
2023-11-06 02:29:04 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:1052:6194:3db5:da7a) (Ping timeout: 258 seconds)
2023-11-06 02:30:31 +0100AssCrackBandit(~user@cust-west-par-46-193-2-167.cust.wifirst.net) (Quit: leaving)
2023-11-06 02:32:01 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Quit: ZNC - http://znc.in)
2023-11-06 02:34:07 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df)
2023-11-06 02:34:21 +0100L29Ah(~L29Ah@wikipedia/L29Ah) (Ping timeout: 240 seconds)
2023-11-06 02:34:58 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-11-06 02:36:03 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2023-11-06 02:39:21 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds)
2023-11-06 02:43:05 +0100dolio(~dolio@130.44.134.54) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 02:44:31 +0100dolio(~dolio@130.44.134.54)
2023-11-06 02:46:02 +0100stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 256 seconds)
2023-11-06 02:47:13 +0100dolio(~dolio@130.44.134.54) (Client Quit)
2023-11-06 02:47:55 +0100stiell_(~stiell@gateway/tor-sasl/stiell)
2023-11-06 02:48:45 +0100dolio(~dolio@130.44.134.54)
2023-11-06 03:05:42 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:1052:6194:3db5:da7a)
2023-11-06 03:07:16 +0100 <Inst> yeah I usually import it as
2023-11-06 03:07:22 +0100 <Inst> import Data.Vector qualified as V
2023-11-06 03:07:50 +0100 <EvanR> fancy
2023-11-06 03:07:51 +0100 <Inst> Haskell's import system, tbh, is the biggest wart on the language, and you'd think someone would have language-extensioned it until it worked by now
2023-11-06 03:08:01 +0100 <EvanR> you think haskell is bad
2023-11-06 03:08:10 +0100 <Inst> iirc Snoyman had a rant about it
2023-11-06 03:08:12 +0100 <EvanR> let me introduce you to every other module system (except ML)
2023-11-06 03:08:46 +0100 <jackdk> What are you talking about? The Num typeclass is a much worse wart
2023-11-06 03:08:54 +0100 <monochrom> Does backpack count? :)
2023-11-06 03:09:08 +0100 <EvanR> we do have our ways of coping with stockholm syndrome, like separating out the "private" stuff into an internal module that's not hidden
2023-11-06 03:09:20 +0100 <monochrom> heh
2023-11-06 03:10:27 +0100 <Inst> i wonder what would have happened if the original Haskell Committee
2023-11-06 03:10:29 +0100 <monochrom> I don't actually find Haskell's module system any different from Java's or Python's. You would have to say that theirs are warts, too.
2023-11-06 03:10:36 +0100 <Inst> hadn't decided first-class modules were too fancy
2023-11-06 03:10:48 +0100 <monochrom> Basically yeah only *MLs' are better.
2023-11-06 03:10:51 +0100 <jackdk> We'd probably have had first-class modules?
2023-11-06 03:11:16 +0100 <Inst> let me go find Michael Snoyman's rant about Haskell modules
2023-11-06 03:11:36 +0100 <monochrom> No, I am not interested in another Snoyman rant.
2023-11-06 03:11:59 +0100 <yushyin> few care about what that person says, lol
2023-11-06 03:12:10 +0100 <Inst> ugh, can't find it
2023-11-06 03:12:28 +0100 <Inst> I think if you want to rebuild the Haskell import system, Using is a great quasi-keyword
2023-11-06 03:12:55 +0100 <Inst> because using can be the name of a macro
2023-11-06 03:14:09 +0100 <Inst> but the overall design needs work, i.e, why am I typing qualified every time, why do I have 10 lines of imports (I've seen modules with 125 lines of imports)
2023-11-06 03:15:35 +0100anderson-(~anderson@user/anderson)
2023-11-06 03:15:49 +0100 <monochrom> I know it's a fallacy to argue that the other pasture is worse, but I couldn't resist.
2023-11-06 03:16:12 +0100 <monochrom> If you have 10 imports in Haskell, then it would be 50 imports in the Java equivalent.
2023-11-06 03:16:31 +0100 <EvanR> Inst, get original, post your own rant somewhere
2023-11-06 03:16:37 +0100 <yushyin> there are quite a few (some now closed or obsolete) ghc-proposals to improve (or worsen) the module system, you can work your way through them and read all about their merits and problems
2023-11-06 03:16:41 +0100 <Inst> compare Py, though, which to me, seems to have a much better import system
2023-11-06 03:16:43 +0100 <monochrom> Because over there the "best practice" is one import line per class, where each module have 5 classes.
2023-11-06 03:16:44 +0100 <yushyin> it's not like people didn't try
2023-11-06 03:17:15 +0100 <monochrom> How is Python's fewer import lines?
2023-11-06 03:17:27 +0100 <monochrom> They almost follow the Java convention.
2023-11-06 03:17:30 +0100 <Inst> multiple imports :)
2023-11-06 03:17:43 +0100 <EvanR> python is great, from * import *
2023-11-06 03:17:48 +0100 <EvanR> nothing bad happens
2023-11-06 03:17:58 +0100 <monochrom> Our "import Data.List" becomes their "import datalist.*" and over there they actually say don't do it.
2023-11-06 03:18:05 +0100 <jackdk> I wouldn't trust python's opinion on anything to do with software packaging.
2023-11-06 03:18:17 +0100 <monochrom> So once again if you have 10 imports in Haskell, it becomes 30 imports in Python.
2023-11-06 03:18:50 +0100 <EvanR> the premise is of course false, you have 50 something imports in haskell
2023-11-06 03:18:53 +0100 <monochrom> Are you living in an alternate universe?
2023-11-06 03:18:55 +0100 <EvanR> and extensions
2023-11-06 03:20:17 +0100 <Inst> I guess the big difference is that Haskell is functional, i.e, do things with functions most of the time
2023-11-06 03:20:40 +0100 <jackdk> I would rather write 50 lines of imports to write 10 lines of code than write 10 lines of imports and have to write 50 lines of code
2023-11-06 03:20:48 +0100 <Inst> so you need more imports, one, two, Haskell has a basic prelude whereas other languages have larger prelude-equivalents
2023-11-06 03:21:21 +0100 <Inst> extensions can also be obviated via cabal files
2023-11-06 03:21:22 +0100 <monochrom> Then use qualified imports.
2023-11-06 03:21:37 +0100 <Inst> qualified is ugly as sin, one good suggestion from NH was qualified by default
2023-11-06 03:21:44 +0100 <monochrom> "import Data.List qualified as L" now you write like "L.concat" just like Python.
2023-11-06 03:21:52 +0100 <monochrom> HOW IS THAT DIFFERENT
2023-11-06 03:22:16 +0100 <EvanR> yes V.fromList is terrible, you should do like hip languages and say Enumerable.Vector.fromList, much better
2023-11-06 03:22:37 +0100 <EvanR> haskell people always use 1 letter for everything, are they insane
2023-11-06 03:23:26 +0100 <Clint> sometimes i use 2 or 3 or 4
2023-11-06 03:23:40 +0100 <Inst> sort of, but w/e, wasn't meaning to offend, was just hoping for a brainstorm, but it's useless when I don't have GHC contrib capability, or much of Cabal contrib capability yet :(
2023-11-06 03:23:42 +0100 <EvanR> also, if qualified is terrible, how you seen the unreasonable effectiveness of OOP notation
2023-11-06 03:23:46 +0100 <monochrom> I use 2.71828 letters. :)
2023-11-06 03:23:59 +0100 <c_wraith> ah, so you name everything e
2023-11-06 03:23:59 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 03:23:59 +0100 <EvanR> 2.71828 is qualified, stop it
2023-11-06 03:24:04 +0100 <monochrom> haha
2023-11-06 03:24:11 +0100otto_s(~user@p4ff27c21.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2023-11-06 03:24:27 +0100 <monochrom> There is nothing to brainstorm in this case.
2023-11-06 03:24:34 +0100 <monochrom> Learn Haskell for real.
2023-11-06 03:24:39 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 258 seconds)
2023-11-06 03:24:55 +0100 <Inst> whoa, ghci is accepting numeric names for qualified
2023-11-06 03:24:56 +0100 <monochrom> Then show a real difference. Then there will be something to brainstorm about.
2023-11-06 03:25:09 +0100 <Inst> actually, it's not
2023-11-06 03:25:29 +0100otto_s(~user@p5de2ff30.dip0.t-ipconnect.de)
2023-11-06 03:26:53 +0100 <Inst> import Data.Time qualified vs import time, that's a real difference, no?
2023-11-06 03:27:15 +0100 <exarkun> not really?
2023-11-06 03:27:23 +0100 <Inst> You can actually get the Java names disaster
2023-11-06 03:27:31 +0100 <Inst> via import an arbitrary Haskell module with qualified only
2023-11-06 03:28:16 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 260 seconds)
2023-11-06 03:28:37 +0100 <monochrom> We used to call it Time, too.
2023-11-06 03:29:16 +0100 <monochrom> We used to say "import List" and "import Monad".
2023-11-06 03:29:17 +0100 <Inst> monochrom, I respect you a lot, and apologize for upsetting you :(
2023-11-06 03:29:41 +0100 <Inst> as I've said, it's useless unless I'm GHC contrib capable, and tbh, my first destination would be trying to propose named lambdas
2023-11-06 03:30:00 +0100yinblinks
2023-11-06 03:30:07 +0100 <exarkun> A simpler step might be to just make an actual argument for why something different would be better.
2023-11-06 03:30:09 +0100 <monochrom> I have no opinion on "Time" vs "Data.Time". The community switched to "Data.Time" a long time ago. Consider which direction the community considered "the fix".
2023-11-06 03:31:24 +0100 <c_wraith> was it Haskell98 that didn't allow nested module names?
2023-11-06 03:31:29 +0100 <monochrom> Right.
2023-11-06 03:31:29 +0100 <geekosaur> yes
2023-11-06 03:31:50 +0100 <geekosaur> an addendum was published shortly afterward adding them, though
2023-11-06 03:32:07 +0100 <Inst> exarkun: I mean, the reason I'm asking for a brainstorm is because it's hard to think of a better way to do it.
2023-11-06 03:32:09 +0100 <monochrom> Adding dots was the language extension for the module system.
2023-11-06 03:32:27 +0100 <Inst> Ah, wait, is there still an -XNo for module dots?
2023-11-06 03:32:37 +0100 <geekosaur> nope
2023-11-06 03:32:59 +0100 <monochrom> You turn it on and you have almost nothing to import.
2023-11-06 03:33:03 +0100xff0x(~xff0x@2405:6580:b080:900:9f61:b997:2a7f:e8b4) (Ping timeout: 240 seconds)
2023-11-06 03:33:18 +0100 <monochrom> more precisely, nothing left.
2023-11-06 03:33:39 +0100 <exarkun> Inst: I don't think you're asking for brainstorming. I think you're asking for other people to invent ideas that suit your personal taste.
2023-11-06 03:33:53 +0100 <geekosaur> not actually true, as the pendulum seems to be swinging back in the other direction with packages appearing that use unqualified modules
2023-11-06 03:33:53 +0100 <exarkun> Personal taste is fine, I don't fault you for having some.
2023-11-06 03:33:55 +0100 <Inst> I think you're right about that.
2023-11-06 03:34:01 +0100 <monochrom> module Monad no longer exists. module List no longer exists. You disallow yourself dotted notation, you can't import sh*t.
2023-11-06 03:34:05 +0100xff0x(~xff0x@2405:6580:b080:900:c81e:fd76:511a:4c08)
2023-11-06 03:34:06 +0100 <exarkun> But you're probably the best positioned to come up with ideas that suit it.
2023-11-06 03:34:14 +0100 <Inst> I was just surprised that there was so much pushback on "Haskell import system is bleh"
2023-11-06 03:34:39 +0100 <jackdk> Respectfully, your statement was a vibes-based assertion, not an argument.
2023-11-06 03:34:39 +0100 <exarkun> There are better module systems. Someone pointed out ml. There's also monte (much more obscure).
2023-11-06 03:35:02 +0100 <monochrom> No. I push back against the very flawed "Python's is better".
2023-11-06 03:35:12 +0100 <exarkun> Maybe it would be useful to brainstorm whether those module systems _could_ fit Haskell?
2023-11-06 03:35:19 +0100 <monochrom> Python's is not better. SML's is. Come back when you advocate SML's way.
2023-11-06 03:35:23 +0100 <exarkun> But then you're probably right - if they could, now you have a lot of work to do to make it real.
2023-11-06 03:35:34 +0100 <Inst> Actually, there are things Python objectively does better than Haskell, no? It's designed as an easy to learn scripting language.
2023-11-06 03:35:44 +0100 <Inst> Where it turns into a disaster is when you try to scale it beyond the minimal scale.
2023-11-06 03:35:53 +0100 <exarkun> Inst: Now youre goal-post moving, which is a classic troll move, watch out.
2023-11-06 03:36:02 +0100 <monochrom> I am just talking about the context: modules and imports.
2023-11-06 03:36:06 +0100 <exarkun> Are we talking about Haskell's module system or are we talking about Python being objectively better?
2023-11-06 03:36:09 +0100 <monochrom> Are you context-free?
2023-11-06 03:36:18 +0100 <monochrom> Are you even merely regular?
2023-11-06 03:36:37 +0100 <exarkun> (Also: monochrom is right, Python's module system is not better)
2023-11-06 03:36:40 +0100 <Inst> I guess in my particular context, where I'm interested in scripting with Haskell, the verbose Haskell import syntax is a problem.
2023-11-06 03:36:51 +0100 <exarkun> (Reference: Python programmer for 20 years and contributor to the implementation of Python's module system)
2023-11-06 03:37:29 +0100 <Inst> exarkun: Do you mean when you try to push it to a medium-scale application, or in the simple use case it was originally designed for?
2023-11-06 03:37:58 +0100 <exarkun> Inst: Do you have a link to the simple use case it was originally designed for?
2023-11-06 03:38:14 +0100 <jackdk> (Remark: Python is not easy to learn; to reliably predict the behaviour of a python program, one must imagine how a busy C programmer would have implemented the runtime. (More true in the 2.x era, but still.))
2023-11-06 03:38:25 +0100 <exarkun> The "scripting" solution is the same in Haskell or Python. Put most of your imports into one module, import that module from your "script".
2023-11-06 03:39:20 +0100 <Inst> Yeah, I guess I'm pretty out of my mind with cabal run on cabal scripts these days. :)
2023-11-06 03:39:38 +0100 <Inst> jackdk: it depends on your definition of learn, no?
2023-11-06 03:39:53 +0100 <Inst> I have an acquaintance who's getting into arguments on Python discord because of average skill levels
2023-11-06 03:40:09 +0100 <Inst> at the same time, I tell him: "You make money because they're bad", because his profession is cleaning up Python codebases
2023-11-06 03:40:37 +0100 <geekosaur> exarkun, actually I do, or would if the old Usenet archives were still online
2023-11-06 03:41:01 +0100 <jackdk> Sure. My definition of "easy to learn" includes something like "it does not take long for a new programmer to make correct predictions about whether a piece of text is a valid python program, what a given python program will do, etc."
2023-11-06 03:41:01 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 240 seconds)
2023-11-06 03:41:06 +0100 <exarkun> I remember comp.lang.python, but I only caught the tail end of it I think
2023-11-06 03:41:23 +0100 <exarkun> jackdk: probably a different definition than most python programmers use
2023-11-06 03:42:04 +0100 <Inst> That does into Haskeller culture, I guess, where there's a concern about correct, maintainable code, whereas in other cultures (even national programming cultures) you'll see programmers who just want to hack out code and rewrite when it goes wrong
2023-11-06 03:42:05 +0100 <exarkun> jackdk: "know enough syntax to type in characters that the compiler doesn't reject"!
2023-11-06 03:42:13 +0100 <Inst> ^^^
2023-11-06 03:42:44 +0100 <exarkun> But that's a long way removed from the module system of either language.
2023-11-06 03:46:26 +0100 <jackdk> I don't necessarily mean that formally, but I cannot fathom how you can call it "learning programming" if you don't have _some_ idea about what you want your program to achieve, and how rapidly your attempts to write that program converge on even a partial solution
2023-11-06 03:46:53 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-11-06 03:47:24 +0100BestSteve(~beststeve@220-135-3-239.hinet-ip.hinet.net) (Quit: WeeChat 4.1.1)
2023-11-06 03:48:14 +0100 <geekosaur> oh, programmers have some idea of what they want their program to achieve. they just ask google or stackoverflow for the pieces they think they need and copypasta them together
2023-11-06 03:48:36 +0100califax(~califax@user/califx) (Remote host closed the connection)
2023-11-06 03:48:50 +0100 <jackdk> Right, but if you don't see at least some of the gears when you look at a piece of code, how have you learned anything?
2023-11-06 03:48:52 +0100califax(~califax@user/califx)
2023-11-06 03:49:12 +0100 <exarkun> Most programs are much more complex than any programmer can hold in their head at once. It's easy, especially for inexperienced programmers (but also for very experienced programmers) to fool themselves into thinking they can do it.
2023-11-06 03:49:34 +0100 <geekosaur> "learning anything" is explicitl;y the opposite of what they want
2023-11-06 03:49:37 +0100 <exarkun> You might have a _lot_ of ideas about what you want your program to do and still only have a tiny fraction of an understanding of what the program you produced will actually do.
2023-11-06 03:50:24 +0100 <exarkun> It's true in Haskell, too. The ratio is maybe a little more favorable, that's all.
2023-11-06 03:51:02 +0100 <exarkun> If you want to be really righteous you better be writing Coq or something :)
2023-11-06 03:51:29 +0100 <monochrom> I am learning recursion in Lean, actually. :)
2023-11-06 03:52:10 +0100 <exarkun> Woo :) I got through a lot (but not all) of https://www.ma.imperial.ac.uk/~buzzard/xena/natural_number_game/
2023-11-06 03:52:39 +0100 <monochrom> I like the meme of "a suitable user-defined/definable data type gives you recursion" >:)
2023-11-06 03:52:42 +0100 <exarkun> (which I found to be very approachable)
2023-11-06 03:53:35 +0100 <Inst> iirc they're now complaining about people who know how to work with a proof language, but not with a manual, pen and paper proof
2023-11-06 03:53:43 +0100 <Inst> and yeah, I loved the natural number game
2023-11-06 03:55:01 +0100 <monochrom> We (humanity) are long past complaining about how people can code in an IDE but not with a manual, pen, and paper. (I still can, I grew up that way.)
2023-11-06 03:55:15 +0100 <exarkun> in my day we proved commutivity of multiplication on the reals uphill both ways, through the snow
2023-11-06 03:55:21 +0100 <monochrom> By the Curry-Howard isomorphism, I don't see why proofs have to be different. >:)
2023-11-06 03:55:32 +0100 <Inst> I deliberately coded in wordpad for a while :)
2023-11-06 03:55:47 +0100 <Inst> Just, VSC was so unergonomic :)
2023-11-06 03:58:13 +0100 <Inst> so how long until someone uses imperial college's software architecture to turn rudin and artin into games? :)
2023-11-06 04:03:01 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 04:03:02 +0100 <Inst> and I still code in KWrite now that I'm on Arch
2023-11-06 04:06:20 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Read error: Connection reset by peer)
2023-11-06 04:07:36 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2023-11-06 04:07:36 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2023-11-06 04:07:36 +0100finn_elijaFinnElija
2023-11-06 04:09:31 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 264 seconds)
2023-11-06 04:11:31 +0100emmanuelux(~emmanuelu@user/emmanuelux) (Quit: au revoir)
2023-11-06 04:14:31 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 04:15:35 +0100[Leary](~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
2023-11-06 04:15:49 +0100[Leary](~Leary]@user/Leary/x-0910699)
2023-11-06 04:17:47 +0100edilmedeiros(~user@2804:14c:658b:5993:414e:c397:748f:b8af) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.2))
2023-11-06 04:29:25 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
2023-11-06 04:30:05 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-11-06 04:31:33 +0100Shock_(~shOkEy@178-164-206-97.pool.digikabel.hu)
2023-11-06 04:35:07 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com)
2023-11-06 04:39:01 +0100td_(~td@i5387091C.versanet.de) (Ping timeout: 240 seconds)
2023-11-06 04:40:58 +0100Ascension(~Ascension@176.254.244.83) (Ping timeout: 255 seconds)
2023-11-06 04:40:59 +0100td_(~td@i53870928.versanet.de)
2023-11-06 04:49:01 +0100nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds)
2023-11-06 04:58:20 +0100trev(~trev@user/trev)
2023-11-06 05:01:44 +0100rosco(~rosco@yp-150-69.tm.net.my)
2023-11-06 05:11:31 +0100alphastate(~alphastat@176.254.244.83)
2023-11-06 05:16:21 +0100[_](~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
2023-11-06 05:16:47 +0100 <dsal> Usually when someone references Arch in here, it's "why don't things work." I've never used Arch, so I don't know anything about it.
2023-11-06 05:18:21 +0100waleee(~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 240 seconds)
2023-11-06 05:31:03 +0100 <Inst> I'm finally ready to take the plunge and switch to a Nix-based workflow with NixOS, but I don't have my password book with me and the moment I lose my cookies, I'm in trouble.
2023-11-06 05:45:33 +0100aforemny_(~aforemny@2001:9e8:6cd9:8900:f44b:90af:4c17:1875)
2023-11-06 05:46:15 +0100aforemny(~aforemny@2001:9e8:6cf3:8800:56a7:5281:8d04:8d56) (Ping timeout: 240 seconds)
2023-11-06 05:57:19 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-11-06 06:08:01 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-11-06 06:13:12 +0100michalz(~michalz@185.246.207.221)
2023-11-06 06:13:32 +0100Inst(~Inst@120.244.192.250) (Read error: Connection reset by peer)
2023-11-06 06:15:57 +0100Inst(~Inst@120.244.192.250)
2023-11-06 06:22:14 +0100 <EvanR> when I used arch way back when it was a constant stream of breakage followed by a questionable package management command to fix it
2023-11-06 06:22:44 +0100ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 255 seconds)
2023-11-06 06:23:23 +0100ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net)
2023-11-06 06:24:20 +0100 <EvanR> on disabling module dot, you can still import Numeric
2023-11-06 06:24:33 +0100rosco(~rosco@yp-150-69.tm.net.my) (Quit: Lost terminal)
2023-11-06 06:31:24 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-11-06 06:32:39 +0100xff0x(~xff0x@2405:6580:b080:900:c81e:fd76:511a:4c08) (Quit: xff0x)
2023-11-06 06:33:10 +0100trev(~trev@user/trev) (Quit: trev)
2023-11-06 06:34:09 +0100xff0x(~xff0x@2405:6580:b080:900:f3e:d321:f29c:28da)
2023-11-06 06:34:38 +0100trev(~trev@user/trev)
2023-11-06 06:41:55 +0100ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net) (Ping timeout: 264 seconds)
2023-11-06 06:42:43 +0100chiselfuse(~chiselfus@user/chiselfuse) (Remote host closed the connection)
2023-11-06 06:43:10 +0100chiselfuse(~chiselfus@user/chiselfuse)
2023-11-06 06:43:36 +0100ddellacosta(~ddellacos@ool-44c738de.dyn.optonline.net)
2023-11-06 06:44:55 +0100notzmv(~zmv@user/notzmv) (Ping timeout: 264 seconds)
2023-11-06 06:46:04 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 255 seconds)
2023-11-06 06:46:24 +0100hgolden(~hgolden@2603-8000-9d00-3ed1-dd4f-298a-9c49-a0ed.res6.spectrum.com)
2023-11-06 06:47:58 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-11-06 06:49:43 +0100xff0x(~xff0x@2405:6580:b080:900:f3e:d321:f29c:28da) (Ping timeout: 264 seconds)
2023-11-06 06:50:32 +0100xff0x(~xff0x@2405:6580:b080:900:e0ef:e9c5:9ef8:87cb)
2023-11-06 06:56:39 +0100xff0x(~xff0x@2405:6580:b080:900:e0ef:e9c5:9ef8:87cb) (Ping timeout: 240 seconds)
2023-11-06 06:57:44 +0100xff0x(~xff0x@2405:6580:b080:900:ffab:5b77:1199:ce6b)
2023-11-06 07:06:31 +0100pixelmonk(~pixelmonk@50.205.76.66) (Ping timeout: 264 seconds)
2023-11-06 07:09:10 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
2023-11-06 07:13:03 +0100pixelmonk(~pixelmonk@50.205.76.66)
2023-11-06 07:21:25 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2023-11-06 07:23:34 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2023-11-06 07:36:05 +0100foul_owl(~kerry@185.216.231.182) (Ping timeout: 240 seconds)
2023-11-06 07:39:13 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-11-06 07:39:37 +0100ACuriousMoose(~ACuriousM@142.166.18.53) (Quit: Ping timeout (120 seconds))
2023-11-06 07:39:59 +0100ACuriousMoose(~ACuriousM@142.166.18.53)
2023-11-06 07:40:53 +0100foul_owl(~kerry@174-21-66-189.tukw.qwest.net)
2023-11-06 07:44:21 +0100ACuriousMoose(~ACuriousM@142.166.18.53) (Ping timeout: 240 seconds)
2023-11-06 07:48:01 +0100foul_owl(~kerry@174-21-66-189.tukw.qwest.net) (Ping timeout: 240 seconds)
2023-11-06 07:51:36 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-11-06 07:52:15 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 240 seconds)
2023-11-06 07:55:52 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
2023-11-06 07:56:41 +0100hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
2023-11-06 07:56:55 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan)
2023-11-06 08:00:41 +0100foul_owl(~kerry@185.219.141.160)
2023-11-06 08:03:12 +0100ACuriousMoose(~ACuriousM@142.166.18.53)
2023-11-06 08:07:42 +0100thegman(~thegman@072-239-207-086.res.spectrum.com) (Quit: leaving)
2023-11-06 08:07:56 +0100lisbeths(uid135845@id-135845.lymington.irccloud.com)
2023-11-06 08:08:09 +0100thegman(~thegman@072-239-207-086.res.spectrum.com)
2023-11-06 08:08:16 +0100adanwan_(~adanwan@gateway/tor-sasl/adanwan)
2023-11-06 08:08:42 +0100thegman(~thegman@072-239-207-086.res.spectrum.com) (Client Quit)
2023-11-06 08:09:02 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 256 seconds)
2023-11-06 08:13:30 +0100Inst(~Inst@120.244.192.250) (Remote host closed the connection)
2023-11-06 08:13:49 +0100Inst(~Inst@120.244.192.250)
2023-11-06 08:15:14 +0100pixelmonk(~pixelmonk@50.205.76.66) (Quit: WeeChat 4.1.0)
2023-11-06 08:21:39 +0100acidjnk(~acidjnk@p200300d6e72b93215d0d304e1b7de813.dip0.t-ipconnect.de)
2023-11-06 08:28:52 +0100mmhat(~mmh@p200300f1c7445e0aee086bfffe095315.dip0.t-ipconnect.de)
2023-11-06 08:30:05 +0100mmhat(~mmh@p200300f1c7445e0aee086bfffe095315.dip0.t-ipconnect.de) (Client Quit)
2023-11-06 08:35:09 +0100Square(~Square@user/square) (Ping timeout: 258 seconds)
2023-11-06 08:37:27 +0100coot(~coot@89-69-206-216.dynamic.chello.pl)
2023-11-06 08:40:12 +0100tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net) (Quit: zzz)
2023-11-06 08:44:03 +0100fendor(~fendor@2a02:8388:1640:be00:cb6e:46f6:2fe6:1728)
2023-11-06 08:48:47 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2023-11-06 08:50:42 +0100Inst(~Inst@120.244.192.250) (Ping timeout: 255 seconds)
2023-11-06 08:52:21 +0100danza(~francesco@151.35.124.76)
2023-11-06 08:54:32 +0100notzmv(~zmv@user/notzmv)
2023-11-06 08:56:30 +0100elevenkb(elevenkb@thunix.net) (ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.1))
2023-11-06 08:56:51 +0100elevenkb(elevenkb@thunix.net)
2023-11-06 08:57:32 +0100gmg(~user@user/gehmehgeh)
2023-11-06 09:02:44 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:578c:5f9d:ee54:ec6a)
2023-11-06 09:14:30 +0100arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net)
2023-11-06 09:17:54 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection)
2023-11-06 09:18:20 +0100sord937(~sord937@gateway/tor-sasl/sord937)
2023-11-06 09:26:50 +0100arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net) (Quit: "Rebooting...")
2023-11-06 09:26:55 +0100danza(~francesco@151.35.124.76) (Ping timeout: 264 seconds)
2023-11-06 09:30:15 +0100misterfish(~misterfis@145.128.244.93)
2023-11-06 09:30:24 +0100 <tomsmeding> EvanR: my most interesting arch breakage was related to nvidia drivers
2023-11-06 09:30:29 +0100 <tomsmeding> and I'm not too sure I can blame that on arch
2023-11-06 09:30:58 +0100 <tomsmeding> sure, haskell on arch is broken, but ghcup exists, so I don't care
2023-11-06 09:32:06 +0100chele(~chele@user/chele)
2023-11-06 09:39:00 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-11-06 09:40:54 +0100gooba_(~gooba@90-231-13-185-no3430.tbcn.telia.com)
2023-11-06 09:41:11 +0100Jackneill_(~Jackneill@20014C4E1E058A00E81C5E515534C989.dsl.pool.telekom.hu)
2023-11-06 09:43:07 +0100gooba(~gooba@90-231-13-185-no3430.tbcn.telia.com) (Ping timeout: 264 seconds)
2023-11-06 09:45:01 +0100Athas(athas@sigkill.dk) (K-Lined)
2023-11-06 09:48:20 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264)
2023-11-06 09:49:45 +0100danse-nr3(~danse@151.35.124.76)
2023-11-06 09:51:05 +0100misterfish(~misterfis@145.128.244.93) (Ping timeout: 240 seconds)
2023-11-06 09:52:24 +0100arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net)
2023-11-06 09:59:12 +0100Inst(~Inst@120.244.192.250)
2023-11-06 10:02:29 +0100kenran(~user@user/kenran)
2023-11-06 10:07:34 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-11-06 10:11:36 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 10:11:47 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264)
2023-11-06 10:12:36 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Remote host closed the connection)
2023-11-06 10:12:54 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
2023-11-06 10:15:41 +0100econo_(uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2023-11-06 10:20:57 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com)
2023-11-06 10:21:35 +0100remexre(~remexre@user/remexre) (Ping timeout: 240 seconds)
2023-11-06 10:21:40 +0100remexre_(~remexre@user/remexre)
2023-11-06 10:22:47 +0100remexre_remexre
2023-11-06 10:25:03 +0100mal1lieven
2023-11-06 10:26:00 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2023-11-06 10:26:28 +0100misterfish(~misterfis@87.215.131.102)
2023-11-06 10:26:44 +0100 <danse-nr3> moin
2023-11-06 10:36:34 +0100 <Hecate> moin moin
2023-11-06 10:40:36 +0100 <Inst> https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkzod5qhcSoBGScr4knWrQ39Y07IXLkVqojQ&usqp=CAU
2023-11-06 10:42:03 +0100 <Inst> deutsch for hello, yoruba for a delicious looking bean pudding
2023-11-06 10:47:51 +0100 <Inst> huh, that's interesting
2023-11-06 10:47:55 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2023-11-06 10:48:21 +0100 <Inst> if you let and put in a bang on the definition within do (or presumably where as well), it'll be evaluated?
2023-11-06 10:55:17 +0100idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-11-06 11:01:30 +0100 <Inst> let !foo = undefined causes an exception within do notation
2023-11-06 11:02:48 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:1052:6194:3db5:da7a) (Remote host closed the connection)
2023-11-06 11:11:42 +0100 <tomsmeding> > let !foo = undefined in ()
2023-11-06 11:11:44 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 11:11:48 +0100 <tomsmeding> Inst: that's how bang patterns in let bindings work
2023-11-06 11:11:56 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 11:15:31 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2023-11-06 11:15:55 +0100Maxdamantus(~Maxdamant@user/maxdamantus) (Ping timeout: 255 seconds)
2023-11-06 11:17:04 +0100 <Inst> brought up by konsumlaam after i spammed CLC with a requset for base nto add pure'
2023-11-06 11:17:22 +0100 <Inst> konsumlamm
2023-11-06 11:17:44 +0100 <probie> Is `pure'` just `(pure $!)`?
2023-11-06 11:17:46 +0100Maxdamantus(~Maxdamant@user/maxdamantus)
2023-11-06 11:17:48 +0100 <Inst> yes
2023-11-06 11:18:13 +0100VioletJewel(~violet@user/violetjewel) (Server closed connection)
2023-11-06 11:18:27 +0100VioletJewel(violet@user/violetjewel)
2023-11-06 11:18:28 +0100 <Inst> wait, so let bindings actually actuate thunks?
2023-11-06 11:18:49 +0100__monty__(~toonn@user/toonn)
2023-11-06 11:19:25 +0100 <kuribas> Inst: why not?
2023-11-06 11:20:19 +0100 <Inst> since it's operational?
2023-11-06 11:21:01 +0100 <nullie> I thought that let is just substitution
2023-11-06 11:21:09 +0100 <tomsmeding> not when bang patterns are involved
2023-11-06 11:21:10 +0100 <kuribas> Only match is evaluating values.
2023-11-06 11:21:32 +0100 <tomsmeding> but bang patterns are additional syntax above Haskell2010, and new syntax introduces new semantics
2023-11-06 11:21:34 +0100 <opqdonut> nullie: even without bang patterns, let introduces sharing
2023-11-06 11:21:38 +0100 <kuribas> pattern matches.
2023-11-06 11:21:41 +0100 <nullie> opqdonut: yeah
2023-11-06 11:21:46 +0100 <kuribas> (without stricness annotations).
2023-11-06 11:22:47 +0100 <opqdonut> one can think of `let !foo = undefined in ()` as something like `let foo@(SomePattern _) = undefined in ()`
2023-11-06 11:22:52 +0100 <Inst> > do; putStrLn "Hello"; let !foo = undefined; pure ()
2023-11-06 11:22:53 +0100 <lambdabot> <hint>:1:52: error:
2023-11-06 11:22:53 +0100 <lambdabot> parse error (possibly incorrect indentation or mismatched brackets)
2023-11-06 11:23:12 +0100 <Inst> > do; putStrLn "Hello"; let !foo = undefined; pure ()
2023-11-06 11:23:13 +0100 <lambdabot> <hint>:1:64: error:
2023-11-06 11:23:14 +0100 <lambdabot> parse error (possibly incorrect indentation or mismatched brackets)
2023-11-06 11:23:15 +0100 <tomsmeding> % do putStrLn "hi"; let !foo = undefined; puer ()
2023-11-06 11:23:16 +0100 <yahb2> <interactive>:135:48: error: ; parse error (possibly incorrect indentation or mismatched brackets)
2023-11-06 11:23:22 +0100 <tomsmeding> % do { putStrLn "hi"; let !foo = undefined; pure () }
2023-11-06 11:23:22 +0100 <yahb2> <interactive>:137:51: error: parse error on input ‘}’
2023-11-06 11:23:23 +0100 <opqdonut> no wait, the foo@(SomePattern _) doesn't fail, I thought it would
2023-11-06 11:23:24 +0100 <tomsmeding> % do { putStrLn "hi"; let !foo = undefined; pure (); }
2023-11-06 11:23:25 +0100 <yahb2> <interactive>:139:50: error: parse error on input ‘;’
2023-11-06 11:23:28 +0100 <kuribas> > let x = undefined in (1, 2)
2023-11-06 11:23:30 +0100 <lambdabot> (1,2)
2023-11-06 11:23:30 +0100 <tomsmeding> % do { putStrLn "hi"; let {!foo = undefined}; pure (); }
2023-11-06 11:23:31 +0100 <yahb2> hi ; *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:141:33 in interact...
2023-11-06 11:23:38 +0100 <tomsmeding> I always do this wrong
2023-11-06 11:23:38 +0100 <kuribas> > let (x, y) = undefined in (1, 2)
2023-11-06 11:23:40 +0100 <lambdabot> (1,2)
2023-11-06 11:23:55 +0100 <kuribas> hmm, shouldn't that be bottom?
2023-11-06 11:24:01 +0100 <opqdonut> yeah that's what I was thinking as well
2023-11-06 11:24:05 +0100 <tomsmeding> kuribas: you example? no
2023-11-06 11:24:09 +0100 <tomsmeding> only when you use x or y
2023-11-06 11:24:10 +0100 <opqdonut> you'd need a ~ to not have it bottom
2023-11-06 11:24:12 +0100xff0x(~xff0x@2405:6580:b080:900:ffab:5b77:1199:ce6b) (Ping timeout: 248 seconds)
2023-11-06 11:24:14 +0100 <tomsmeding> > let (x, y) = undefined in (x, 2)
2023-11-06 11:24:16 +0100 <lambdabot> (*Exception: Prelude.undefined
2023-11-06 11:24:26 +0100 <tomsmeding> https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/strict.html#extension-BangPatterns
2023-11-06 11:24:43 +0100 <Inst> yeah but this is all of a sudden operational and I'm now thinking of let introducing thunks in a sequence ;_;
2023-11-06 11:24:51 +0100 <Inst> if I'm not bang patterning it
2023-11-06 11:24:52 +0100 <tomsmeding> Inst: it's new syntax
2023-11-06 11:25:02 +0100 <opqdonut> oh right even the spec says: let p = e1 in e0 = case e1 of ~p -> e0
2023-11-06 11:25:03 +0100 <tomsmeding> and also, evaluation is a semantical thing
2023-11-06 11:25:04 +0100xff0x(~xff0x@2405:6580:b080:900:1034:83b0:f1e0:db5e)
2023-11-06 11:25:05 +0100 <Inst> so let is still "virtual", but bang-patterned let isn't?
2023-11-06 11:25:16 +0100 <tomsmeding> if it's bottom, that happens _then_, not later
2023-11-06 11:25:27 +0100 <kuribas> > let ~(x, y) = undefined in (1, 2)
2023-11-06 11:25:29 +0100 <lambdabot> (1,2)
2023-11-06 11:25:57 +0100 <tomsmeding> > case undefined of ~(x, y) -> (1, 2)
2023-11-06 11:25:58 +0100 <lambdabot> (1,2)
2023-11-06 11:26:00 +0100 <tomsmeding> > case undefined of (x, y) -> (1, 2)
2023-11-06 11:26:02 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 11:26:06 +0100 <tomsmeding> it's case that is strict
2023-11-06 11:26:09 +0100 <opqdonut> yeah
2023-11-06 11:26:20 +0100 <tomsmeding> '~' on a let binding doesn't do anything
2023-11-06 11:26:38 +0100 <tomsmeding> just like '!' on a case pattern :p
2023-11-06 11:26:53 +0100 <tomsmeding> (not counting nested uses of '!', those of course do have meaning)
2023-11-06 11:27:09 +0100 <opqdonut> interesting duality
2023-11-06 11:27:14 +0100 <Inst> the nice thing i liked about Haskell is that I don't have to think in terms of memory allocation much of the time
2023-11-06 11:27:16 +0100 <opqdonut> hadn't thought of it that way, thanks
2023-11-06 11:27:28 +0100 <tomsmeding> Inst: this is not about memory allocation, it's about bottoms and exceptions
2023-11-06 11:27:40 +0100 <tomsmeding> it only becomes about memory allocation or performance or stuff when you think operationally
2023-11-06 11:27:47 +0100 <tomsmeding> and you seem to not want to do that, so don't :p
2023-11-06 11:27:52 +0100 <tomsmeding> (I do)
2023-11-06 11:27:52 +0100 <Inst> the point of pure $! / pure' is to force evaluation of a term without using evaluate
2023-11-06 11:28:10 +0100 <Inst> without IO, you have (pure $!) . force
2023-11-06 11:28:41 +0100 <Inst> but the implication is that a non-strict let expression is going to create thunks
2023-11-06 11:28:54 +0100 <tomsmeding> everything creates thunks
2023-11-06 11:29:01 +0100 <tomsmeding> a let expression creates sharing
2023-11-06 11:29:16 +0100 <tomsmeding> if I write `pure (expensive 1 2 3)`, then that'll be a thunk, no need for 'let'
2023-11-06 11:29:41 +0100 <Inst> how many thunks is that?
2023-11-06 11:29:45 +0100 <tomsmeding> many :p
2023-11-06 11:29:50 +0100 <mauke> > case undefined of !_ -> ()
2023-11-06 11:29:52 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 11:30:10 +0100 <tomsmeding> :t case undefined of x -> x
2023-11-06 11:30:11 +0100 <lambdabot> a
2023-11-06 11:30:16 +0100 <Inst> bleh, it's my fault, I should just go watch Alexis King on laziness instead
2023-11-06 11:30:32 +0100 <Inst> i default to accumulating parameter because I do care about operational semantics
2023-11-06 11:30:39 +0100 <mauke> > case undefined of _ -> ()
2023-11-06 11:30:41 +0100 <lambdabot> ()
2023-11-06 11:30:54 +0100 <tomsmeding> Inst: if you care about operational semantics, don't complain that things have operational semantics :p
2023-11-06 11:31:29 +0100rosco(~rosco@yp-150-69.tm.net.my)
2023-11-06 11:31:37 +0100 <Inst> i'd rather be able to assume that a let expression just gets optimized away if it isn't used
2023-11-06 11:31:46 +0100 <Inst> whereas let !foo completely blows this intuition out of the water
2023-11-06 11:31:54 +0100 <tomsmeding> but I haven't watched the video you're referring to, but Alexis knows what she's talking about, so probably a good source
2023-11-06 11:32:15 +0100 <Inst> let !foo = seq (expensive computation) () in 3
2023-11-06 11:32:20 +0100 <tomsmeding> I mean, that's what BangPatterns are for :p
2023-11-06 11:32:23 +0100 <tomsmeding> that's redundant
2023-11-06 11:32:44 +0100 <tomsmeding> `let !foo = a in b` can be desugared to `let foo = a in a `seq` b`
2023-11-06 11:33:02 +0100 <tomsmeding> oh wait different thing
2023-11-06 11:33:15 +0100 <int-e> foo `seq` b
2023-11-06 11:33:18 +0100 <tomsmeding> your thing is the same as "expensive computation `seq` b"
2023-11-06 11:33:19 +0100 <tomsmeding> yeah
2023-11-06 11:33:32 +0100 <tomsmeding> er, 3, not b
2023-11-06 11:33:34 +0100 <Inst> and no one `foo <- pure bar`s anyways, right?
2023-11-06 11:33:51 +0100 <tomsmeding> can be useful if "foo" is a more interesting pattern
2023-11-06 11:33:53 +0100 <Inst> So why the left identity? Is it simply because of the adaptation of the monad concept?
2023-11-06 11:34:12 +0100 <tomsmeding> either to trigger MonadFail, or for GADT-specific type inference reasons
2023-11-06 11:34:27 +0100 <tomsmeding> the monad laws are all necessary to pin down what you expect of a monad
2023-11-06 11:34:46 +0100 <tomsmeding> sure, nobody literally writes "foo <- pure bar", but you'd sure want that to do the obvious thing if you did it
2023-11-06 11:34:52 +0100pruiz(~user@user/pruiz)
2023-11-06 11:35:06 +0100 <tomsmeding> and furthermore, you might do "foo <- something bar" where "something x" eventually evaluates to "pure x"
2023-11-06 11:35:14 +0100 <tomsmeding> and you'd want that to do the obvious thing
2023-11-06 11:35:15 +0100 <Inst> yeah, thanks
2023-11-06 11:35:22 +0100 <Inst> I like the purescript justification of monad laws
2023-11-06 11:35:50 +0100 <Inst> left identity -> pure foo resolves correctly, right identity, pure (some value at the end) resolves correctly
2023-11-06 11:36:00 +0100 <Inst> they use do blocks that are binded into to justify associativity
2023-11-06 11:36:25 +0100 <Inst> but unless I'm wrong, a better argument is that it guarantees that you don't get weird behavior from inlining of monadic code
2023-11-06 11:36:27 +0100 <tomsmeding> Inst: have you ever seen the monad laws formulated using return and >=> instead of using return and >>= ?
2023-11-06 11:37:07 +0100 <Inst> it's on the wiki
2023-11-06 11:37:15 +0100 <tomsmeding> probably :p
2023-11-06 11:37:16 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8)
2023-11-06 11:37:28 +0100 <Inst> i prefer the ones based off pure and join
2023-11-06 11:37:30 +0100 <tomsmeding> "monad is a monoid" vibe
2023-11-06 11:37:32 +0100 <Inst> because that's easier to understand
2023-11-06 11:37:49 +0100chomwitt(~chomwitt@2a02:587:7a2d:bc00:1ac0:4dff:fedb:a3f1)
2023-11-06 11:38:09 +0100 <tomsmeding> then it's good that there are multiple ways to formulate them, because 'join' is _not_ easier to understand to me :)
2023-11-06 11:39:28 +0100 <mauke> oh, are they like associativity of >=> and return=identity?
2023-11-06 11:39:40 +0100 <mauke> or neutral element
2023-11-06 11:40:00 +0100 <ncf> the laws make Kleisli into a category
2023-11-06 11:40:02 +0100ft(~ft@p4fc2a529.dip0.t-ipconnect.de) (Quit: leaving)
2023-11-06 11:40:31 +0100 <ncf> (where Kleisli a b = a -> m b)
2023-11-06 11:41:06 +0100 <[exa]> Inst: you mean the 4 from here? https://en.wikibooks.org/wiki/Haskell/Category_theory#The_monad_laws_and_their_importance
2023-11-06 11:41:10 +0100 <Inst> join . pure = join . fmap pure = (id :: m a -> m a)
2023-11-06 11:41:53 +0100 <Inst> join . fmap join = join . join
2023-11-06 11:42:21 +0100 <tomsmeding> mauke: yeah, return >=> m = m, m >=> return = m, a >=> (b >=> c) = (a >=> b) >=> c
2023-11-06 11:42:29 +0100 <[exa]> I find these slightly inconvenient because I can't see how the ruleset is complete. With monoids it's super clear.
2023-11-06 11:43:26 +0100 <tomsmeding> I mean, the second one encodes "associativity" of join
2023-11-06 11:43:58 +0100 <tomsmeding> the first one says that you can pure in one level, or pure in the other level, and after join they both disappear
2023-11-06 11:44:02 +0100 <tomsmeding> which is the identity laws
2023-11-06 11:44:15 +0100 <tomsmeding> but surely (?!) one would not consider those more intuitive :p
2023-11-06 11:44:30 +0100 <Inst> pure >=> m = m = m >=> pure
2023-11-06 11:44:33 +0100target_i(~target_i@217.175.14.39)
2023-11-06 11:45:04 +0100 <Inst> a >=> (b >=> c) = (a >=> b) >=> c
2023-11-06 11:45:07 +0100 <tomsmeding> (see, I check that the pure/join laws are complete by releating them to the monoid laws -- a procedure that's much easier with the pure/>=> laws which literally look like monoid laws)
2023-11-06 11:45:16 +0100 <tomsmeding> *relating
2023-11-06 11:45:59 +0100stiell(~stiell@gateway/tor-sasl/stiell)
2023-11-06 11:46:24 +0100 <Inst> yeah, this is more succinct than the join version, but I understand it better via join and (>>=) = (join .). fmap
2023-11-06 11:47:01 +0100 <tomsmeding> to each their own -- that's why I said, it's good that there are multiple formulations, so that you can choose the one that's most intuitive to you :)
2023-11-06 11:47:57 +0100 <Inst> i think join club is smallest
2023-11-06 11:48:16 +0100 <Inst> kleisli arrows explanation is more common
2023-11-06 11:48:28 +0100 <tomsmeding> well, it's prettier
2023-11-06 11:48:35 +0100 <tomsmeding> which is not necessarily a good criterion for understandability
2023-11-06 11:48:41 +0100 <tomsmeding> but it works for me /shrug/
2023-11-06 11:49:28 +0100stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 256 seconds)
2023-11-06 11:49:30 +0100 <Inst> join . pure = id = join . fmap pure
2023-11-06 11:50:33 +0100td_(~td@i53870928.versanet.de) (Quit: waking up from the american dream ...)
2023-11-06 11:51:26 +0100 <dminuoso> Regarding the laws, I think associativity of monad is still quite intuitive but in ways most programmers dont think about.
2023-11-06 11:52:13 +0100 <dminuoso> For IO, associativity is equvialent to "You can extract any region of IO code into a separate binding"
2023-11-06 11:52:29 +0100 <dminuoso> Or as you would say in C "You can move any chunk of code into a separate function"
2023-11-06 11:52:39 +0100 <dminuoso> It seems so silly and obvious that one does not really think about it
2023-11-06 11:53:09 +0100 <tomsmeding> in that sense the identity laws are like "if you don't have side effects, you don't have side effects even if you're put in a larger program"
2023-11-06 11:53:13 +0100 <dminuoso> While the Kleisli expression looks much simpler, I think its not necessarily more intuitive
2023-11-06 11:53:37 +0100pruiz(~user@user/pruiz) (Remote host closed the connection)
2023-11-06 11:53:54 +0100pruiz(~user@user/pruiz)
2023-11-06 11:54:05 +0100 <tomsmeding> I can remember it, and that's a big pro for me personally
2023-11-06 11:54:12 +0100 <tomsmeding> but good points
2023-11-06 11:56:08 +0100 <opqdonut> dminuoso: I just bumped into the fact the other week that js react hooks don't obey that law. You need to invoke the hook direcly in your component, you can't invoke it inside a helper function!
2023-11-06 11:57:06 +0100pruiz(~user@user/pruiz) (Remote host closed the connection)
2023-11-06 11:57:23 +0100pruiz(~user@user/pruiz)
2023-11-06 12:00:43 +0100 <Inst> dminuoso: ummm, I think I brought up something similar
2023-11-06 12:00:57 +0100 <Inst> actually, i misunderstood, you go way broader than I do
2023-11-06 12:01:06 +0100 <Inst> like you're implying the compiler can optimize in such a way
2023-11-06 12:01:37 +0100pruiz(~user@user/pruiz) (Client Quit)
2023-11-06 12:01:38 +0100 <Inst> opqdonut: isn't that because promises are a quasi-monad?
2023-11-06 12:02:07 +0100 <tomsmeding> wasn't it true that with JS promises, there is an implicit join at the end of .then?
2023-11-06 12:02:09 +0100pruiz(~user@213.4.200.211)
2023-11-06 12:02:24 +0100 <tomsmeding> so a Promise (Promise a) gets auto-flattened to Promise a
2023-11-06 12:02:53 +0100 <int-e> tomsmeding: you can always write it like this: https://paste.tomsmeding.com/aobXsiHf
2023-11-06 12:02:58 +0100 <Inst> i mean that Promise I'm told breaks one of the monad laws
2023-11-06 12:03:53 +0100 <int-e> which corresponds to the idea of pulling out fragment of monadic code and turning it into a separate function
2023-11-06 12:04:18 +0100 <tomsmeding> int-e: I think that's what Inst referred to as what purescript uses to justify the laws (which I understood only after Inst related it to what dminuoso said :D)
2023-11-06 12:04:26 +0100 <mauke> there's an implicit pure at the end of >>=
2023-11-06 12:04:59 +0100 <tomsmeding> ah that might be it
2023-11-06 12:05:03 +0100 <int-e> tomsmeding: sorry, I'm half ignoring Inst
2023-11-06 12:05:25 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) (Ping timeout: 255 seconds)
2023-11-06 12:06:13 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf)
2023-11-06 12:07:37 +0100pruiz(~user@213.4.200.211) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.1))
2023-11-06 12:09:07 +0100anon1123_(~anon1123@2a02:ab88:282:b00:da3a:ddff:fe3a:947c)
2023-11-06 12:09:20 +0100idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.1.1)
2023-11-06 12:10:39 +0100 <Inst> here's some weirdness, though
2023-11-06 12:10:41 +0100 <anon1123_> today ive found this wiki page, i found it real funny how its no way useful and on point, but rather a sea of seething over a 25 years old language design decision: https://wiki.haskell.org/If-then-else
2023-11-06 12:11:19 +0100 <Inst> > let !foo = 3 + undefined in 4
2023-11-06 12:11:21 +0100 <lambdabot> 4
2023-11-06 12:11:41 +0100 <Inst> > let !foo = 3 + undefined `seq` 4 in 4
2023-11-06 12:11:42 +0100 <lambdabot> 4
2023-11-06 12:11:53 +0100 <Inst> > let !foo = (3 + undefined) `seq` 4 in 4
2023-11-06 12:11:55 +0100 <lambdabot> 4
2023-11-06 12:12:18 +0100 <probie> > let !foo = (3 :: Int + undefined) in 4
2023-11-06 12:12:20 +0100 <lambdabot> error:
2023-11-06 12:12:20 +0100 <lambdabot> Not in scope: type constructor or class ‘+’
2023-11-06 12:12:31 +0100 <probie> > let !foo = ((3 :: Int) + undefined) in 4
2023-11-06 12:12:32 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:15:39 +0100 <kuribas> > let (!x, !y) = undefined in 1
2023-11-06 12:15:41 +0100 <lambdabot> 1
2023-11-06 12:15:56 +0100 <kuribas> > let !(x, y) = undefined in 1
2023-11-06 12:15:58 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:16:08 +0100 <probie> The type of `3 + undefined` is `forall a . Num a => a`, which is a lambda abstraction, and a lambda abstraction is already in whnf
2023-11-06 12:16:29 +0100 <ncf> anon1123_: perhaps the "see also" section should link to https://wiki.haskell.org/Wadler%27s_Law
2023-11-06 12:17:25 +0100billchenchina(~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe)
2023-11-06 12:18:03 +0100 <Inst> it's some weirdness with typeclasses, isn't it?
2023-11-06 12:18:55 +0100 <Inst> the way I understand it, (3 :: Int) + undefined routes to +# (iirc), which is a strict primitive
2023-11-06 12:20:15 +0100 <anon1123_> ncf: haha, yeah.
2023-11-06 12:20:22 +0100td_(~td@i53870926.versanet.de)
2023-11-06 12:21:11 +0100 <probie> > let !foo = (undefined :: forall a . Num a => a) in 4
2023-11-06 12:21:12 +0100 <lambdabot> 4
2023-11-06 12:21:45 +0100 <ncf> > let !foo = (undefined :: Int) in 4
2023-11-06 12:21:46 +0100 <int-e> ncf: you could also link the if-then-else page from that one :P
2023-11-06 12:21:47 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:22:07 +0100 <probie> > let !foo = (undefined :: Int -> Int) in 4
2023-11-06 12:22:08 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:22:31 +0100 <int-e> . o O ( "Examples" )
2023-11-06 12:22:59 +0100 <kuribas> In idris: "{a:Type} -> {auto _ : Num a} -> a", shows, that this is actually a function.
2023-11-06 12:23:31 +0100 <ncf> > let !foo = (undefined :: forall a . a) in 4
2023-11-06 12:23:32 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:23:48 +0100 <ncf> hm, so the constraint is messing with it
2023-11-06 12:23:52 +0100 <probie> % :set -XTypeApplications
2023-11-06 12:23:52 +0100 <yahb2> <no output>
2023-11-06 12:23:56 +0100 <Inst> > let !foo = (undefined :: forall a . Show a => a) in 4
2023-11-06 12:23:58 +0100 <lambdabot> 4
2023-11-06 12:23:59 +0100 <probie> % let !foo = (undefined :: forall a . Num a => a) @Int in 4
2023-11-06 12:23:59 +0100 <yahb2> *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:145:13 in interactive:G...
2023-11-06 12:24:22 +0100 <Inst> > let !foo = (undefined :: forall a . Read a => a) in 4
2023-11-06 12:24:24 +0100 <lambdabot> 4
2023-11-06 12:24:34 +0100 <Inst> > let !foo = (undefined :: String) in 4
2023-11-06 12:24:36 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:24:47 +0100 <Inst> so it looks like it's the typeclass mechanism :)
2023-11-06 12:24:48 +0100 <kuribas> "3" is a function, where the instance is passed implicitly by the compiler.
2023-11-06 12:24:57 +0100 <kuribas> :t 3
2023-11-06 12:24:58 +0100 <lambdabot> Num p => p
2023-11-06 12:25:32 +0100 <Inst> > let !foo = (mempty <> undefined :: String) in 4
2023-11-06 12:25:33 +0100 <lambdabot> *Exception: Prelude.undefined
2023-11-06 12:25:40 +0100 <kuribas> In idris you can actually pass an instance explicitly.
2023-11-06 12:25:40 +0100 <Inst> > let !foo = (mempty <> undefined) in 4
2023-11-06 12:25:42 +0100 <lambdabot> 4
2023-11-06 12:26:02 +0100 <kuribas> In haskell you can only apply the type, which will cause the instance to be resolved.
2023-11-06 12:26:12 +0100 <kuribas> (with XTypeApplications)
2023-11-06 12:26:48 +0100 <Inst> > :set -XTypeApplications
2023-11-06 12:26:49 +0100 <kuribas> tomsmeding: Things like this is why I find it often easier to reason about idris2.
2023-11-06 12:26:50 +0100 <lambdabot> <hint>:1:1: error: parse error on input ‘:’
2023-11-06 12:27:09 +0100 <Inst> % :set -XTypeApplications
2023-11-06 12:27:09 +0100 <yahb2> <no output>
2023-11-06 12:27:24 +0100 <Inst> % let !foo = (mempty <> undefined) in 4
2023-11-06 12:27:24 +0100 <yahb2> 4
2023-11-06 12:27:26 +0100 <tomsmeding> one way to see that the "function-ness" of `Num a => a` is essential and a bang pattern will not, cannot, evaluate the "body" of that function: at what type should it evaluate the function?
2023-11-06 12:27:37 +0100 <Inst> % let !foo = (mempty <> undefined) @String in 4
2023-11-06 12:27:37 +0100 <yahb2> <interactive>:151:12: error: ; • Cannot apply expression of type ‘a0’ ; to a visible type argument ‘String’ ; • In the expression: (mempty <> undefined) @String ; In an equation...
2023-11-06 12:27:53 +0100 <Inst> % let !foo = (mempty @String <> undefined) in 4
2023-11-06 12:27:54 +0100 <yahb2> *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:153:31 in interactive:G...
2023-11-06 12:28:04 +0100 <probie> Wasn't this whole hidden lambda thing one of the driving motivators of simplified subsumption in ghc 9?
2023-11-06 12:28:11 +0100 <tomsmeding> kuribas: yeah I see
2023-11-06 12:29:45 +0100rosco(~rosco@yp-150-69.tm.net.my) (Quit: Lost terminal)
2023-11-06 12:31:51 +0100stiell(~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
2023-11-06 12:32:12 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2023-11-06 12:32:14 +0100stiell(~stiell@gateway/tor-sasl/stiell)
2023-11-06 12:43:58 +0100kenran(~user@user/kenran) (Remote host closed the connection)
2023-11-06 12:45:00 +0100billchenchina(~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe) (Remote host closed the connection)
2023-11-06 12:53:09 +0100danse-nr3(~danse@151.35.124.76) (Read error: Connection reset by peer)
2023-11-06 12:53:26 +0100danse-nr3(~danse@151.35.114.112)
2023-11-06 13:01:13 +0100danse-nr3(~danse@151.35.114.112) (Ping timeout: 260 seconds)
2023-11-06 13:04:27 +0100doyougnu(~doyougnu@45.46.170.68)
2023-11-06 13:10:55 +0100stiell_(~stiell@gateway/tor-sasl/stiell)
2023-11-06 13:11:03 +0100stiell(~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
2023-11-06 13:17:14 +0100riatre(~quassel@2001:310:6000:f::5198:1) (Server closed connection)
2023-11-06 13:17:23 +0100riatre(~quassel@2001:310:6000:f::5198:1)
2023-11-06 13:20:09 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 13:21:32 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8) (Ping timeout: 248 seconds)
2023-11-06 13:29:41 +0100misterfish(~misterfis@87.215.131.102) (Ping timeout: 240 seconds)
2023-11-06 13:32:57 +0100danse-nr3(~danse@151.35.114.112)
2023-11-06 13:37:52 +0100Lycurgus(~georg@user/Lycurgus)
2023-11-06 13:44:02 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 13:44:15 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264)
2023-11-06 13:44:47 +0100anon1123(~anon1123@2a02:ab88:282:b00:da3a:ddff:fe3a:947c)
2023-11-06 13:45:46 +0100anon1123(~anon1123@2a02:ab88:282:b00:da3a:ddff:fe3a:947c) (Client Quit)
2023-11-06 13:47:56 +0100tom__(~tom@2a00:23c8:970c:4801:5b6a:e81b:79dc:f684) (Remote host closed the connection)
2023-11-06 13:50:55 +0100arahael(~arahael@119-18-2-212.771202.syd.nbn.aussiebb.net) (Ping timeout: 264 seconds)
2023-11-06 14:01:00 +0100seeg123456(~seeg12345@64.176.64.83) (Quit: Gateway shutdown)
2023-11-06 14:02:57 +0100seeg123456(~seeg12345@64.176.64.83)
2023-11-06 14:11:49 +0100misterfish(~misterfis@145.128.244.93)
2023-11-06 14:12:01 +0100edr(~edr@user/edr)
2023-11-06 14:22:59 +0100Lycurgus(~georg@user/Lycurgus) (Quit: leaving)
2023-11-06 14:23:55 +0100rosco(~rosco@yp-150-69.tm.net.my)
2023-11-06 14:25:13 +0100idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-11-06 14:41:51 +0100falafel(~falafel@62.175.113.194.dyn.user.ono.com)
2023-11-06 14:46:20 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:578c:5f9d:ee54:ec6a) (Ping timeout: 248 seconds)
2023-11-06 14:47:05 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:9468:20ae:8f18:260b)
2023-11-06 14:49:40 +0100falafel(~falafel@62.175.113.194.dyn.user.ono.com) (Ping timeout: 258 seconds)
2023-11-06 14:55:58 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2023-11-06 15:00:45 +0100 <EvanR> Inst, bang patterns desugar to something using seq, so whether it's "operational" gets kicked down the road to the meaning of seq
2023-11-06 15:01:37 +0100captnemo(~captnemo@193.32.127.239)
2023-11-06 15:01:48 +0100captnemo(~captnemo@193.32.127.239) (Remote host closed the connection)
2023-11-06 15:02:20 +0100 <dminuoso> > let !foo = (undefined :: forall a . Show a => a) in 4
2023-11-06 15:02:22 +0100 <lambdabot> 4
2023-11-06 15:02:29 +0100 <dminuoso> % let !foo = (undefined :: forall a . Num a => a) @Int in 4
2023-11-06 15:02:29 +0100 <yahb2> *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:155:13 in interactive:G...
2023-11-06 15:02:31 +0100 <dminuoso> I quite like this.
2023-11-06 15:03:22 +0100 <dminuoso> tomsmeding: I guess conversely, this is all why we have monomorphism restriction, so the function-ness doesnt stab you in the back unexpectedly.
2023-11-06 15:03:36 +0100 <EvanR> Inst, and if you want to puzzle that out, look up imprecise exceptions
2023-11-06 15:06:39 +0100 <Inst> yeha i need to go over the Haskell exceptions system again
2023-11-06 15:07:15 +0100 <Inst> i criticize dynamically typed programmers for not understanding how to go through all the cases, because they can't, but it's similarly reckless of me not to understand Haskell's exception system
2023-11-06 15:07:26 +0100 <EvanR> also it's interesting when you get to STG, the let there explicitly has operational semantics
2023-11-06 15:07:42 +0100 <Inst> and avoid GHCX- Pro Edition
2023-11-06 15:07:43 +0100 <EvanR> so you're not far off
2023-11-06 15:08:33 +0100 <EvanR> STG is a functional language with all these similar elements, but they mean something else there
2023-11-06 15:08:39 +0100 <EvanR> similar to haskell
2023-11-06 15:10:29 +0100Athas(athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 15:11:17 +0100Athas(~athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264)
2023-11-06 15:25:40 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 15:26:10 +0100 <dminuoso> Inst: Haskells exception system is worse than most other exception systems.
2023-11-06 15:26:26 +0100 <dminuoso> We have exception hierarchies, except poorly adopted and not well documented.
2023-11-06 15:26:46 +0100 <dminuoso> And, whether its ignored or adopted - nobody really documents what exceptions can be thrown.
2023-11-06 15:27:03 +0100 <dminuoso> And then there's the issue of IO exceptions, Either and the various effect systems. Every library does something else
2023-11-06 15:27:25 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:9468:20ae:8f18:260b) (Quit: WeeChat 3.5)
2023-11-06 15:27:42 +0100 <dminuoso> While golang is extremely frustrating to work with explicitly testing return codes, at least the error mechanism is very uniform,
2023-11-06 15:27:45 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-11-06 15:27:46 +0100 <Inst> in practice people just go to simulated exceptions to avoid throwing exceptions, no?
2023-11-06 15:27:55 +0100 <dminuoso> Inst: Depends on the library, really.
2023-11-06 15:28:19 +0100 <dminuoso> As soon as you enter IO, you have a wealth of IO exceptions that are thrown to you, often by transitive use.
2023-11-06 15:28:30 +0100 <dminuoso> They rarely get caught/repacked.
2023-11-06 15:30:38 +0100thegeekinside(~thegeekin@189.141.80.123)
2023-11-06 15:31:34 +0100 <danse-nr3> huh you mean go encodes failures in the result?
2023-11-06 15:31:47 +0100hgolden(~hgolden@2603-8000-9d00-3ed1-dd4f-298a-9c49-a0ed.res6.spectrum.com) (Remote host closed the connection)
2023-11-06 15:32:03 +0100 <danse-nr3> like we could with Either?
2023-11-06 15:33:30 +0100hgolden(~hgolden@2603-8000-9d00-3ed1-dd4f-298a-9c49-a0ed.res6.spectrum.com)
2023-11-06 15:34:08 +0100ystael(~ystael@user/ystael)
2023-11-06 15:35:03 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:6ae1:edee:a8c:cfb9)
2023-11-06 15:36:36 +0100 <exarkun> The trouble with IO is that too many things can go wrong.
2023-11-06 15:37:09 +0100 <exarkun> Has anyone explored splitting IO into more fine-grained pieces where you could conceivably do something sensible for each of the things that could possibly go wrong?
2023-11-06 15:37:41 +0100 <exarkun> Otherwise, it's hardly practical do more than check one or two specific things you can deal with and let everything else blow up the program.
2023-11-06 15:38:01 +0100 <tomsmeding> danse-nr3: go code looks like this https://stackoverflow.com/questions/70509411/should-return-err-be-put-in-else-for-if-statement-wit…
2023-11-06 15:38:05 +0100 <tomsmeding> that's manual Eithering
2023-11-06 15:38:11 +0100 <tomsmeding> in a language without sum types, no less
2023-11-06 15:38:29 +0100 <danse-nr3> yeah i came to the same conclusion from https://go.dev/doc/tutorial/handle-errors
2023-11-06 15:39:10 +0100Shock_(~shOkEy@178-164-206-97.pool.digikabel.hu) (Ping timeout: 255 seconds)
2023-11-06 15:40:58 +0100Shock_(~shOkEy@77-234-80-134.pool.digikabel.hu)
2023-11-06 15:42:18 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 15:43:27 +0100pavonia_(~user@user/siracusa)
2023-11-06 15:43:43 +0100pavonia(~user@user/siracusa) (Ping timeout: 264 seconds)
2023-11-06 15:43:44 +0100Guest420(~Guest420@2607:fb91:f85:4d2:3d7e:6749:7ae0:78be)
2023-11-06 15:43:56 +0100pavonia_pavonia
2023-11-06 15:46:26 +0100bsima(~bsima@2604:a880:400:d0::19f1:7001) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 15:47:09 +0100bsima(~bsima@143.198.118.179)
2023-11-06 15:47:59 +0100Guest420(~Guest420@2607:fb91:f85:4d2:3d7e:6749:7ae0:78be) (Client Quit)
2023-11-06 15:49:39 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1))
2023-11-06 15:49:57 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2023-11-06 15:50:47 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8)
2023-11-06 15:54:12 +0100dtman34(~dtman34@2601:447:d000:93c9:1930:f752:99bd:543d) (Ping timeout: 240 seconds)
2023-11-06 15:55:59 +0100dtman34(~dtman34@c-76-156-89-180.hsd1.mn.comcast.net)
2023-11-06 15:59:08 +0100 <pounce> it has 'some' types
2023-11-06 16:01:00 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8) (Ping timeout: 248 seconds)
2023-11-06 16:03:05 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2023-11-06 16:04:36 +0100apache2(apache2@anubis.0x90.dk) (K-Lined)
2023-11-06 16:07:55 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2023-11-06 16:10:04 +0100misterfish(~misterfis@145.128.244.93) (Ping timeout: 248 seconds)
2023-11-06 16:19:20 +0100billchenchina(~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe)
2023-11-06 16:24:06 +0100 <dminuoso> │15:36:36 exarkun │ The trouble with IO is that too many things can go wrong. │ Ankhers
2023-11-06 16:24:12 +0100 <dminuoso> I dont believe this to be a fundamental problem.
2023-11-06 16:24:39 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 245 seconds)
2023-11-06 16:24:46 +0100 <dminuoso> What maybe feels annoying about Java checked exceptions is just a call to reality.
2023-11-06 16:25:23 +0100 <dminuoso> It's one of those things I wish we had in Haskell.
2023-11-06 16:26:32 +0100 <danse-nr3> what is the advantage over Either?
2023-11-06 16:28:05 +0100Logio(em@kapsi.fi) (Server closed connection)
2023-11-06 16:28:13 +0100Logio(em@kapsi.fi)
2023-11-06 16:29:01 +0100 <exarkun> danse-nr3: Well, you can't leave Either polymorphic and do anything very useful with the value
2023-11-06 16:29:23 +0100 <exarkun> Oh or maybe you meant the advance of Java checked exceptions.
2023-11-06 16:29:52 +0100 <exarkun> dminuoso: Yea I don't know if it is a fundamental problem. Or arguably must not be, since many Haskell programs prove useful in the real world. :)
2023-11-06 16:30:11 +0100 <EvanR> extensible records with scoped labels contains a tangent discussion of extensible variants and its application to the Either way of dealing with untold number of kinds of exceptions at once
2023-11-06 16:31:01 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2023-11-06 16:31:02 +0100 <EvanR> meanwhile the language zig decided on an uberpragmatic single global error type that everything uses
2023-11-06 16:31:15 +0100 <EvanR> that type is... an integer from 0 to 200 or so
2023-11-06 16:31:34 +0100 <danse-nr3> ugh that's extreme
2023-11-06 16:31:43 +0100 <EvanR> haha
2023-11-06 16:32:09 +0100 <danse-nr3> not sure what is the polymorphism problem with Either, but if extensible records solve that, it is promising
2023-11-06 16:33:22 +0100 <EvanR> extensible variants would let you combine an Either E1 a and an Either E2 a to get an Either <E1|E2> a. Solves it? good question
2023-11-06 16:33:38 +0100waleee(~waleee@h-176-10-144-38.NA.cust.bahnhof.se)
2023-11-06 16:33:55 +0100 <exarkun> And then you can combine an `Either <E1|E2> a` with an `Either E3 a` to get an `Either <<E1|E2>|E3> a`!
2023-11-06 16:34:12 +0100 <EvanR> yeah
2023-11-06 16:34:14 +0100 <exarkun> It seems like it just automates the mess you can already make if you try to have a lot of exception types and merge them up?
2023-11-06 16:35:07 +0100 <EvanR> there is some quality of life features possible for <<E1|E2>|E3> to make it easier to manage but the main thing is you didn't define any new types
2023-11-06 16:35:21 +0100 <EvanR> similar to extensible records
2023-11-06 16:35:48 +0100 <danse-nr3> "extensible records" ... i would call that an anonymous sum type
2023-11-06 16:36:24 +0100 <exarkun> EvanR: ah
2023-11-06 16:36:28 +0100 <EvanR> also there is the dual to row polymorphism
2023-11-06 16:36:32 +0100 <EvanR> involved
2023-11-06 16:36:59 +0100 <danse-nr3> i think i have read from Gabriella Gonzales that haskell is "heavily nominal"? Maybe i get that, since anonymous sum types seem so hard to reach
2023-11-06 16:37:05 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-11-06 16:37:10 +0100 <EvanR> this function could throw an E or some other unknown type of error
2023-11-06 16:37:40 +0100 <EvanR> according to a type signature
2023-11-06 16:39:13 +0100 <EvanR> and yeah record types are anonymous product types with fields
2023-11-06 16:39:55 +0100 <EvanR> the extensible records with scoped labels paper uses labels for the extensible variants, which is why it even comes up
2023-11-06 16:43:18 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2023-11-06 16:43:21 +0100Square(~Square@user/square)
2023-11-06 16:43:42 +0100ChaiTRex(~ChaiTRex@user/chaitrex)
2023-11-06 16:53:29 +0100danse-nr3(~danse@151.35.114.112) (Read error: Connection reset by peer)
2023-11-06 16:54:22 +0100danse-nr3(~danse@151.37.110.121)
2023-11-06 16:55:43 +0100 <EvanR> liftA2 is a method in the Applicative class now, mind blown
2023-11-06 16:57:51 +0100 <danse-nr3> what was it before?
2023-11-06 16:58:06 +0100 <mauke> freestanding
2023-11-06 16:58:08 +0100 <EvanR> just a library function defined in terms of pure and <*>
2023-11-06 16:58:25 +0100 <EvanR> @src liftA2
2023-11-06 16:58:25 +0100 <lambdabot> liftA2 f a b = f <$> a <*> b
2023-11-06 16:58:37 +0100 <EvanR> or that
2023-11-06 16:58:38 +0100 <ddellacosta> does that mean it existed before Applicative was a thing?
2023-11-06 16:58:40 +0100 <danse-nr3> "This became a typeclass method in 4.10.0.0"
2023-11-06 16:58:44 +0100 <ddellacosta> huh
2023-11-06 16:58:46 +0100 <ddellacosta> TIL
2023-11-06 16:59:10 +0100 <mauke> @src liftM2
2023-11-06 16:59:10 +0100 <lambdabot> liftM2 f m1 m2 = do
2023-11-06 16:59:10 +0100 <lambdabot> x1 <- m1
2023-11-06 16:59:10 +0100 <lambdabot> x2 <- m2
2023-11-06 16:59:10 +0100 <lambdabot> return (f x1 x2)
2023-11-06 16:59:36 +0100 <danse-nr3> i find `f <$> a <*> b` more readable most of the times anyways
2023-11-06 16:59:38 +0100 <c_wraith> oh no! don't compile that with -XApplicativeDo!
2023-11-06 16:59:49 +0100 <EvanR> so yeah it existed in the form of a monad routine
2023-11-06 17:00:11 +0100 <ddellacosta> danse-nr3: yeah same
2023-11-06 17:00:39 +0100 <danse-nr3> but probably there are usages for when one wants to pass the lifted on
2023-11-06 17:00:43 +0100 <EvanR> liftA2 f is handy if you need to pass someone a (binary) function
2023-11-06 17:05:36 +0100 <EvanR>
2023-11-06 17:05:44 +0100 <EvanR> it is written somewhere in a haddock for a well known package that Functor provides substitution and Monad provides, on top of that, "renormalization". What pithy thing could you say Applicative provides?
2023-11-06 17:06:47 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-11-06 17:06:51 +0100gmg(~user@user/gehmehgeh) (Remote host closed the connection)
2023-11-06 17:07:10 +0100 <danse-nr3> just to expand on the nonsense?
2023-11-06 17:07:17 +0100Athas(~athas@2a01:7c8:aaac:1cf:6044:bd15:3f5b:9264) (Quit: ZNC 1.8.2 - https://znc.in)
2023-11-06 17:07:32 +0100gmg(~user@user/gehmehgeh)
2023-11-06 17:07:40 +0100 <EvanR> is it nonsense
2023-11-06 17:09:06 +0100 <danse-nr3> the definitions given above do not sound particularly enlightening to me, but maybe i ignore the context where those terms make more sense
2023-11-06 17:09:09 +0100 <ddellacosta> it's hard, I feel like it's basically about letting you execute operations in a context, without as much power as Monad, but that's not pithy
2023-11-06 17:09:25 +0100 <ddellacosta> and depends on talking about other concepts
2023-11-06 17:09:48 +0100 <exarkun> who benefits from such pithy descriptions
2023-11-06 17:09:49 +0100 <int-e> eww, they made abstract burritos
2023-11-06 17:10:02 +0100 <exarkun> either you already know what it is, in which case you don't, or you don't already know what it is, in which case you don't
2023-11-06 17:10:02 +0100 <ddellacosta> exarkun: yeah good point
2023-11-06 17:10:03 +0100 <EvanR> it's a big pith conspiracy
2023-11-06 17:10:37 +0100 <danse-nr3> pithy is good for business
2023-11-06 17:11:06 +0100 <exarkun> not sure pithy replaces a nice $900 suit
2023-11-06 17:14:59 +0100 <isekaijin> EvanR: I thought that, for an expression type “data Expr a = Var a | ...”, the “instance Monad Expr where ...” was the one that gave you the ability to substitute a variable with another subexpression?
2023-11-06 17:16:40 +0100 <EvanR> Functor lets you substitute to get an Expr (Expr a) then the monad lets you flatten that to get a Expr a again
2023-11-06 17:17:20 +0100 <EvanR> for instance by throwing away the Var wrapper
2023-11-06 17:17:27 +0100 <danse-nr3> :t join
2023-11-06 17:17:28 +0100 <lambdabot> Monad m => m (m a) -> m a
2023-11-06 17:19:29 +0100 <EvanR> fmap :: (String -> Expr String) -> Expr String -> Expr (Expr String)
2023-11-06 17:20:47 +0100lortabac(~lorenzo@2a01:e0a:541:b8f0:6ae1:edee:a8c:cfb9) (Quit: WeeChat 3.5)
2023-11-06 17:26:20 +0100qqq(~qqq@92.43.167.61) (Remote host closed the connection)
2023-11-06 17:32:41 +0100Square(~Square@user/square) (Ping timeout: 240 seconds)
2023-11-06 17:35:38 +0100Athas(athas@2a01:7c8:aaac:1cf:d300:623e:69e4:545f)
2023-11-06 17:37:33 +0100 <kiriakos> Is it possible to ask hoogle about typeclasses that require a specific signature to be implemented?
2023-11-06 17:37:47 +0100targetdisk(~daemonchi@45-33-4-162.ip.linodeusercontent.com) (Server closed connection)
2023-11-06 17:37:56 +0100targetdisk(~daemonchi@45-33-4-162.ip.linodeusercontent.com)
2023-11-06 17:39:07 +0100 <Athas> If you search for the method type, won't you find any relevant classes?
2023-11-06 17:39:10 +0100 <danse-nr3> well, `(a -> b) -> f a -> f b` gives me `<$>` among the results
2023-11-06 17:43:54 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8)
2023-11-06 17:45:43 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-11-06 17:47:30 +0100lisbeths(uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-11-06 17:52:14 +0100erty(~user@user/aeroplane)
2023-11-06 17:54:07 +0100[exa](~exa@user/exa/x-3587197) (Remote host closed the connection)
2023-11-06 17:54:47 +0100Lycurgus(~georg@li1192-118.members.linode.com)
2023-11-06 17:54:47 +0100Lycurgus(~georg@li1192-118.members.linode.com) (Changing host)
2023-11-06 17:54:47 +0100Lycurgus(~georg@user/Lycurgus)
2023-11-06 18:01:01 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 240 seconds)
2023-11-06 18:05:08 +0100 <monochrom> EvanR: Perhaps Functor provides unary substitution, Applicative provides 0-ary and 2-ary substitution?
2023-11-06 18:06:55 +0100 <EvanR> applicative is sort of monoiding things together, you start with two "applicatives" and end up with one
2023-11-06 18:07:32 +0100 <monochrom> There is also that. Applicative is found to be lax monoidal something.
2023-11-06 18:08:10 +0100 <EvanR> also I only just realized the preponderance of this language: value of type f x is "a functor", or "an applicative", in one case it's "a traversable", instead of "a whateveric value"
2023-11-06 18:08:23 +0100 <EvanR> it's all over the blogosphere
2023-11-06 18:08:34 +0100Lycurgus(~georg@user/Lycurgus) (Quit: leaving)
2023-11-06 18:09:01 +0100 <EvanR> an m a is even "a monad" sometimes D:
2023-11-06 18:09:07 +0100 <monochrom> Yeah natural languages and COBOL are hard. :)
2023-11-06 18:09:47 +0100 <monochrom> Logic and axiomatic systems are so much easier.
2023-11-06 18:10:41 +0100waleee(~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 240 seconds)
2023-11-06 18:11:00 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-11-06 18:11:06 +0100 <EvanR> in another universe this one really threw me into a spin, a struct value / record value / or dumb object with just fields was referred to as "a type" D:
2023-11-06 18:11:36 +0100 <EvanR> clojure universe
2023-11-06 18:11:43 +0100 <monochrom> haha
2023-11-06 18:12:03 +0100 <dolio> Records are the values.
2023-11-06 18:12:07 +0100 <int-e> . o O ( typewriter )
2023-11-06 18:15:08 +0100 <ddellacosta> I suppose to give them the benefit of the doubt, they may be thinking of prototypal inheritance? 😅 https://en.wikipedia.org/wiki/Prototype-based_programming
2023-11-06 18:15:51 +0100 <monochrom> It is tough. If you have "x :: Num a => a", what do you call x? It is reasonable to say "x is a number". Now "number" is spelt slightly different from "Num", there seems to be no clash. But in another time line it is also very plausible that the other committee names the type class "Number". So now if "x :: Number a => a", then x is a lowercase("Number") too. I bet people are reasoning along the same line for Monad etc.
2023-11-06 18:16:31 +0100 <kuribas> x could be a function
2023-11-06 18:16:37 +0100 <exarkun> "x is a value of a type with a Num instance" is quite a mouthful.
2023-11-06 18:16:48 +0100 <exarkun> "x is a number" is a desire path
2023-11-06 18:17:02 +0100 <EvanR> x is "a Num" ? xD
2023-11-06 18:17:32 +0100 <EvanR> this is a bit outside the pattern above since there's no * -> * type constructor
2023-11-06 18:18:01 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 240 seconds)
2023-11-06 18:18:23 +0100 <monochrom> If "Monad" were spelled "MonadClass" instead, then there would be no clash between "the value is a monad" and "the type is a MonadClass". But we didn't go there. (And I support not going there. Type-level hungarian notation?! Thanks but no thanks.)
2023-11-06 18:18:51 +0100 <EvanR> IsString a, "x is an IsString"
2023-11-06 18:19:09 +0100 <monochrom> Then again "the value is a monad" is wrong mathematically. Yeah, about the * -> * kind.
2023-11-06 18:20:45 +0100 <dolio> ncf: BTW, I think the (co)yoneda lemma from that (co)free angle is basically that there is a correspondence between functors and isomorphisms F ≅ (Co)Yoneda F. Does that resolve your issue?
2023-11-06 18:21:05 +0100 <EvanR> also we're being inconsistent with the declensions, you got your Applicative (functor) you got your Traversable (functor) you got your Representable (functor) etc but not your Monadic (functor)
2023-11-06 18:21:24 +0100chele(~chele@user/chele) (Remote host closed the connection)
2023-11-06 18:21:56 +0100 <monochrom> Yeah OOP may also have biased people. If x ∈ C1 ⊆ C2, then both of "x is a C1" and "x is a C2" are acceptable. And OOP uses ⊆ to emulate our type classes.
2023-11-06 18:22:21 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1))
2023-11-06 18:22:31 +0100 <monochrom> The extra fun being "C1 is a C2" is also acceptable. >:)
2023-11-06 18:22:41 +0100 <dolio> The arrow mappings correspond to (co)algebra structures, and that is the missing part of an isomorphism like that in general, I think.
2023-11-06 18:23:27 +0100 <EvanR> C1 is a C2 can't be right
2023-11-06 18:23:44 +0100 <danse-nr3> why?
2023-11-06 18:24:00 +0100 <EvanR> kind mismatch!
2023-11-06 18:24:07 +0100 <danse-nr3> XD i knew!
2023-11-06 18:24:50 +0100 <monochrom> I think mathematicians also have their share of defining "monadic functor" to be different from "monad".
2023-11-06 18:26:34 +0100 <erty> Sorry to bump in but I just have a simple question. If I have a class, [class SomeNumbers a where...] and an instance [instance SomeNumbers a where...], here I want to apply 'Num' constraint to 'a'. Where can I specify that? Thanks
2023-11-06 18:27:28 +0100 <exarkun> You want to make an instance for all a where there is a Num instance for a?
2023-11-06 18:27:49 +0100 <erty> I expect 'a' to always be a number
2023-11-06 18:27:59 +0100 <EvanR> instance SomeNumbers a where -- would be defining the instance for all types ever?
2023-11-06 18:28:06 +0100 <exarkun> `instance Num a => SomeNumbers a where ...`?
2023-11-06 18:28:18 +0100 <EvanR> and that Num a constraint won't help
2023-11-06 18:28:52 +0100 <danse-nr3> so probably it is for the class... strange question though
2023-11-06 18:29:07 +0100zetef(~quassel@5.2.182.98)
2023-11-06 18:29:11 +0100 <danse-nr3> usually the constraint comes up naturally where you need a class' functions
2023-11-06 18:29:23 +0100 <EvanR> sounds like you just want to define some functions that work on any Num
2023-11-06 18:29:55 +0100 <EvanR> instead of a new class
2023-11-06 18:30:48 +0100 <monochrom> You should not. Use a newtype wrapper. See for example Sum and Product.
2023-11-06 18:31:00 +0100rosco(~rosco@yp-150-69.tm.net.my) (Quit: Lost terminal)
2023-11-06 18:31:01 +0100 <danse-nr3> :t Sum
2023-11-06 18:31:03 +0100 <lambdabot> a -> Sum a
2023-11-06 18:31:04 +0100 <erty> :EvanR yes
2023-11-06 18:31:37 +0100 <danse-nr3> :i Sum
2023-11-06 18:31:38 +0100 <monochrom> "instance Num a => Monoid (Sum a)" not "instance Num a => Monoid a".
2023-11-06 18:31:54 +0100 <danse-nr3> > :i Sum
2023-11-06 18:31:56 +0100 <lambdabot> <hint>:1:1: error: parse error on input ‘:’
2023-11-06 18:32:02 +0100 <danse-nr3> % :i Sum
2023-11-06 18:32:03 +0100 <yahb2> <interactive>:1:1: error: Not in scope: ‘Sum’
2023-11-06 18:32:28 +0100 <geekosaur> % import Data.Monoid
2023-11-06 18:32:28 +0100 <yahb2> <no output>
2023-11-06 18:32:33 +0100 <geekosaur> % :i Sum
2023-11-06 18:32:33 +0100 <yahb2> type Sum :: * -> * ; newtype Sum a = Sum {getSum :: a} ; -- Defined in ‘base-4.16.4.0:Data.Semigroup.Internal’ ; instance Applicative Sum ; -- Defined in ‘base-4.16.4.0:Data.Semigroup.Internal...
2023-11-06 18:32:44 +0100 <danse-nr3> cheers geekosaur ^^;
2023-11-06 18:32:58 +0100 <erty> :t Product
2023-11-06 18:32:59 +0100 <lambdabot> a -> Product a
2023-11-06 18:33:15 +0100 <danse-nr3> % :i Product
2023-11-06 18:33:16 +0100 <yahb2> type Product :: * -> * ; newtype Product a = Product {getProduct :: a} ; -- Defined in ‘base-4.16.4.0:Data.Semigroup.Internal’ ; instance Applicative Product ; -- Defined in ‘base-4.16.4.0:Dat...
2023-11-06 18:33:32 +0100Putonlalla(~Putonlall@it-cyan.it.jyu.fi) (Server closed connection)
2023-11-06 18:33:54 +0100Putonlalla(~Putonlall@it-cyan.it.jyu.fi)
2023-11-06 18:34:18 +0100 <EvanR> ok then, erty what is in the SomeNumbers class
2023-11-06 18:34:22 +0100 <ncf> dolio: not seeing it. coalgebras for what functor?
2023-11-06 18:34:42 +0100ph88(~ph88@2a02:8109:9e26:c800::302a) (Quit: Leaving)
2023-11-06 18:35:24 +0100 <erty> EvanR: I just randomly came up with that name. I just want to create a set of functions which would only accept numbers (float,int etc.)
2023-11-06 18:35:51 +0100 <EvanR> well just for that you don't need a class
2023-11-06 18:35:54 +0100 <geekosaur> that sounds like a Num constraint on the function
2023-11-06 18:35:57 +0100 <geekosaur> (s)
2023-11-06 18:36:28 +0100AlexZenon(~alzenon@178.34.161.199) (Ping timeout: 272 seconds)
2023-11-06 18:36:50 +0100 <geekosaur> beware, thinking like OOP won't get you very far in Haskell, the types don't work that way
2023-11-06 18:36:52 +0100 <erty> ok, i got it. Its better to use newType in this case.
2023-11-06 18:37:19 +0100 <EvanR> what is the newtype for
2023-11-06 18:37:30 +0100 <exarkun> erty: no, if you want a function that works on a Num, then `f :: Num a => a -> whatever`
2023-11-06 18:38:38 +0100gdown(~gavin@h69-11-149-109.kndrid.broadband.dynamic.tds.net)
2023-11-06 18:39:32 +0100 <danse-nr3> coming from object oriented one feels too loose this way. At least a newtype provides some idea of encapsulation =D
2023-11-06 18:39:59 +0100 <EvanR> you can encapsulate your set of functions in a module
2023-11-06 18:40:17 +0100 <exarkun> But of course the feeling will lead you astray, because Haskell is not a class-oriented OO language.
2023-11-06 18:40:21 +0100tzh(~tzh@c-71-193-181-0.hsd1.or.comcast.net)
2023-11-06 18:40:41 +0100econo_(uid147250@id-147250.tinside.irccloud.com)
2023-11-06 18:41:13 +0100 <dolio> ncf: Coalgebras of Yoneda, or algebras of Coyoneda.
2023-11-06 18:41:53 +0100 <EvanR> or is it? Haskell's overlooked object system
2023-11-06 18:42:04 +0100 <EvanR> 2005
2023-11-06 18:42:30 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 18:42:52 +0100 <geekosaur> most of those miss one or more points of OOP, don't they? similarly the modeling of (some) OOP features using comonads
2023-11-06 18:43:09 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 18:44:05 +0100 <erty> Ok, This is a very minimal example that I've created, 'a' is always a String. THis is giving me errors. How can I correct it?
2023-11-06 18:44:09 +0100 <erty> http://ix.io/4KR7/haskell
2023-11-06 18:44:12 +0100iteratee_(~kyle@162.218.222.207) (Quit: leaving)
2023-11-06 18:44:23 +0100AlexZenon(~alzenon@178.34.161.199)
2023-11-06 18:44:34 +0100 <exarkun> You don't _know_ a is always String
2023-11-06 18:44:41 +0100zetef(~quassel@5.2.182.98) (Read error: Connection reset by peer)
2023-11-06 18:44:57 +0100 <geekosaur> that's not how typeclasses work. `instance Eyes a where` declares the instance to be for every type
2023-11-06 18:45:10 +0100jrm(~jrm@user/jrm) (Quit: ciao)
2023-11-06 18:45:23 +0100 <geekosaur> `instance Eyes String where` declares an instance for Strings
2023-11-06 18:45:46 +0100 <danse-nr3> recently i realised existential types are a great resource for object-oriented thinking, check them out erty: wiki.haskell.org/Existential_type
2023-11-06 18:46:12 +0100 <tomsmeding> danse-nr3: someone who doesn't grok instances yet is _not_ going to be a good person to throw existential types at
2023-11-06 18:46:31 +0100 <geekosaur> ^
2023-11-06 18:46:42 +0100 <danse-nr3> hum ... yeah you are probably right
2023-11-06 18:46:48 +0100jrm(~jrm@user/jrm)
2023-11-06 18:47:28 +0100 <danse-nr3> but then people like to jump at monad transformers without much understanding of other aspects... everyone is different
2023-11-06 18:48:15 +0100 <EvanR> sympathy to those who get a job at a haskell shop and the first thing they need to learn is lens xD
2023-11-06 18:48:31 +0100 <exarkun> could be worse
2023-11-06 18:48:33 +0100koolazer(~koo@user/koolazer) (Server closed connection)
2023-11-06 18:48:50 +0100 <tomsmeding> exarkun: could also be servant, you mean?
2023-11-06 18:48:51 +0100thegman(~thegman@072-239-207-086.res.spectrum.com)
2023-11-06 18:48:53 +0100 <exarkun> :)
2023-11-06 18:48:55 +0100koolazer(~koo@user/koolazer)
2023-11-06 18:49:05 +0100 <erty> geekosaur: Sorry for that mistake, But what if I expect 'a' to be anyof the Num instanes
2023-11-06 18:49:08 +0100 <tomsmeding> (disclaimer, I haven't ever actually used servant)
2023-11-06 18:49:09 +0100 <exarkun> actually I was going to say something about profunctors but then I remembered they are a dependency of lens, so.
2023-11-06 18:49:20 +0100 <mauke> EvanR: lens was the second thing. the first thing was streaming
2023-11-06 18:49:22 +0100 <mauke> also pipes
2023-11-06 18:49:25 +0100 <exarkun> (servant was one of the first serious haskell libraries I used while learning haskell, though)
2023-11-06 18:49:51 +0100 <danse-nr3> where by "serious" we can freely interpret "painful"
2023-11-06 18:50:10 +0100 <exarkun> pain is just weakness leaving the body, etc
2023-11-06 18:50:11 +0100 <geekosaur> `instance Num a => Cat a where` — with the caveat that this locks you out of all other possible types, because `Num a` has to be checked at the use site
2023-11-06 18:50:57 +0100 <geekosaur> (every possible `a` has to carry around proof that it is a `Num` instance)
2023-11-06 18:51:52 +0100 <danse-nr3> see, problem missing with existentials! :P
2023-11-06 18:52:39 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 18:52:44 +0100 <tomsmeding> erty: in other words, you can only make instances for "types with a particular shape". An instance for 'a' is "all types"; 'String' is "just String". You can also make an instance for 'Maybe a', which is Maybe Int, Maybe String, Maybe Bool, etc.
2023-11-06 18:53:16 +0100 <tomsmeding> Within those shapes, you can also add further _constraints_ for which types of that shape are _actually_ valid; this is the 'Num a =>' that geekosaur suggested
2023-11-06 18:53:44 +0100 <tomsmeding> but you can't give one instance for "all types satisfying Num", another instance for "all types satisfying Ord", etc.
2023-11-06 18:53:51 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 18:53:59 +0100 <tomsmeding> that's a result of the design of haskell typeclasses
2023-11-06 18:53:59 +0100 <EvanR> .oO( if the Eyes class defines stuff eyes-supporting types, and cats and dogs are types... then instance Eyes Cat where, and instance Eyes Dog where seems cromulent. Of course that's super vague )
2023-11-06 18:54:08 +0100 <EvanR> stuff for
2023-11-06 18:54:43 +0100 <tomsmeding> erty: the underlying idea is that if someone writes make a new instance of some typeclass, then code that worked should continue working
2023-11-06 18:55:01 +0100 <tomsmeding> (this is a certain form of "monotonicity", if you're a mathematician)
2023-11-06 18:56:00 +0100 <tomsmeding> if you could do what I described, one instance for all types satisfying Num, one instance for all types satisfying Ord, etc., then you'd break that monotonicity property: once someone makes a type _both_ an instance of Num and of Ord, your code breaks because which instance is to be used?
2023-11-06 18:56:08 +0100 <tomsmeding> so we don't allow that at all
2023-11-06 18:56:54 +0100 <tomsmeding> (if anyone brings up -XIncoherentInstances now they can fuck off, that's explicitly breaking the rules)
2023-11-06 18:57:20 +0100 <EvanR> you just told yourself to fuck off
2023-11-06 18:57:20 +0100 <tomsmeding> (and may not even help here)
2023-11-06 18:57:21 +0100 <geekosaur> I think it's still rejected even then
2023-11-06 18:57:23 +0100 <tomsmeding> yes
2023-11-06 18:57:29 +0100 <danse-nr3> interesting i do not see monotonicity there. That is what makes a function reversable most of the times?
2023-11-06 18:57:31 +0100 <tomsmeding> yeah, just realised
2023-11-06 18:57:40 +0100 <erty> tomsmeding: Thanks for all those points, I will take some time and analyze
2023-11-06 18:57:50 +0100 <tomsmeding> danse-nr3: monotonicity in that given more information about types (more instances), things only become more defined, not less
2023-11-06 18:58:02 +0100 <danse-nr3> oh, i see
2023-11-06 18:58:09 +0100 <tomsmeding> erty: good luck! This is probably unfamiliar terrain for you, but it's cool stuff once you get used to it :)
2023-11-06 18:58:29 +0100 <danse-nr3> more instances do not change class information much though
2023-11-06 18:58:52 +0100 <tomsmeding> danse-nr3: hm?
2023-11-06 18:59:20 +0100 <tomsmeding> if the described situation (overlapping Num a => a and Ord a => a instances) would be allowed, more instances could make programs ill-defined because it could become ambiguous which instance to use
2023-11-06 18:59:56 +0100 <danse-nr3> nevermind, i did not follow carefully enough
2023-11-06 19:00:01 +0100 <danse-nr3> thanks anyway
2023-11-06 19:00:10 +0100 <tomsmeding> :)
2023-11-06 19:00:12 +0100 <geekosaur> worse, if the instances are defined in different modules then which one is used depende on what you have imported
2023-11-06 19:00:21 +0100 <tomsmeding> right, also that
2023-11-06 19:00:43 +0100 <tomsmeding> but that's not quite the same consistency property that's being preserved there
2023-11-06 19:00:44 +0100 <EvanR> isn't that the case anyway
2023-11-06 19:01:00 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:01:07 +0100 <EvanR> without overlapping
2023-11-06 19:01:16 +0100 <tomsmeding> EvanR: the rules for instances, absent OverlappingInstances stuff, imply that that cannot happen -- or importing the two modules together would error
2023-11-06 19:01:33 +0100 <tomsmeding> I guess that's not quite monotone, true
2023-11-06 19:01:40 +0100 <tomsmeding> importing more stuff makes the program less defined
2023-11-06 19:01:41 +0100 <EvanR> oh oh, orphan instances not allowed
2023-11-06 19:01:48 +0100 <tomsmeding> oh!
2023-11-06 19:01:50 +0100 <tomsmeding> yes
2023-11-06 19:01:51 +0100 <tomsmeding> thank you
2023-11-06 19:01:51 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:02:59 +0100pixelmonk2(~pixelmonk@173.46.79.26)
2023-11-06 19:03:30 +0100pixelmonk2(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:03:30 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2023-11-06 19:03:45 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:04:01 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 240 seconds)
2023-11-06 19:05:23 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:05:37 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:09:12 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:09:31 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:09:46 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 19:10:59 +0100 <ddellacosta> erty: I think Wadler's original paper is really great for understanding type classes in a straightforward way, not to pile on too much https://people.csail.mit.edu/dnj/teaching/6898/papers/wadler88.pdf
2023-11-06 19:13:43 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 19:14:33 +0100pixelmonk(~pixelmonk@173.46.79.26) (Quit: WeeChat 4.1.0)
2023-11-06 19:14:52 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:14:54 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:15:00 +0100danse-nr3adds that to the reading list that monotonically increases...
2023-11-06 19:15:08 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:15:44 +0100zetef(~quassel@5.2.182.98)
2023-11-06 19:17:53 +0100pixelmonk(~pixelmonk@173.46.79.26) (Client Quit)
2023-11-06 19:18:34 +0100ggranberry(sid267884@id-267884.uxbridge.irccloud.com) (Server closed connection)
2023-11-06 19:18:35 +0100Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
2023-11-06 19:18:42 +0100ggranberry(sid267884@id-267884.uxbridge.irccloud.com)
2023-11-06 19:18:44 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 19:19:13 +0100Lycurgus(~georg@user/Lycurgus)
2023-11-06 19:23:23 +0100f-a(ff2a@drunk.24-7.ro)
2023-11-06 19:26:50 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-11-06 19:27:29 +0100 <EvanR> the concept of a monotone function is hugely abstractable. x <= y implies f(x) <= f(y), i.e. it's a functor where <= denotes arrows in a category
2023-11-06 19:28:33 +0100zetef(~quassel@5.2.182.98) (Ping timeout: 260 seconds)
2023-11-06 19:29:03 +0100 <tomsmeding> EvanR: typically the (<=) indicates some kind of ordering; arrows in a category don't quite make an ordering
2023-11-06 19:29:18 +0100neceve(~neceve@user/neceve)
2023-11-06 19:29:21 +0100 <tomsmeding> if (<=) is not an ordering any more in any sense, then I'm not sure you can still call it "monotone"
2023-11-06 19:29:22 +0100 <EvanR> in this example, it's an ordering
2023-11-06 19:29:52 +0100 <tomsmeding> a category with two objects X and Y, with four arrows: id_X, id_Y, X->Y and Y->X, is a category
2023-11-06 19:29:58 +0100 <tomsmeding> but it doesn't define an order
2023-11-06 19:30:11 +0100 <tomsmeding> because (->) is not antisymmetric
2023-11-06 19:31:14 +0100 <danse-nr3> i get what EvanR means, but i was not sure about the domain and codomain in the conversation above
2023-11-06 19:31:27 +0100 <EvanR> the formula as is still makes sense the more you forget about the example until you are left with a category and the functor
2023-11-06 19:31:31 +0100 <EvanR> two categories
2023-11-06 19:31:31 +0100Lycurgus(~georg@user/Lycurgus) (Quit: leaving)
2023-11-06 19:31:54 +0100 <danse-nr3> monotonicity and categories .... it gets trickier
2023-11-06 19:31:57 +0100 <tomsmeding> EvanR: oh for sure
2023-11-06 19:32:07 +0100 <tomsmeding> I'm just not sure you can still call it "monotonicity" at that point :p
2023-11-06 19:32:17 +0100 <EvanR> that's where the abstractable comes in
2023-11-06 19:32:40 +0100 <tomsmeding> is f then not just an endofunctor
2023-11-06 19:32:51 +0100 <EvanR> not talking about endofunctors
2023-11-06 19:32:55 +0100Inst(~Inst@120.244.192.250) (Ping timeout: 264 seconds)
2023-11-06 19:33:07 +0100 <EvanR> it could be two different categories
2023-11-06 19:33:07 +0100 <tomsmeding> well your f _is_ an endofunctor, right
2023-11-06 19:33:12 +0100 <tomsmeding> ah
2023-11-06 19:33:13 +0100 <EvanR> no not necessarily
2023-11-06 19:33:14 +0100 <tomsmeding> functor, then
2023-11-06 19:33:33 +0100 <danse-nr3> EvanR's is just the simplest definition of monotonicity ... i am confused
2023-11-06 19:33:42 +0100 <EvanR> it's so simple it hurts
2023-11-06 19:33:53 +0100 <tomsmeding> danse-nr3: we've abstracted the order to a preorder https://en.wikipedia.org/wiki/Preorder
2023-11-06 19:34:03 +0100 <tomsmeding> and at that point f is just a functor
2023-11-06 19:34:03 +0100 <EvanR> functors are super generalized monotone functions xD
2023-11-06 19:34:06 +0100 <tomsmeding> :p
2023-11-06 19:34:14 +0100 <tomsmeding> everything is traverse vibes
2023-11-06 19:34:22 +0100 <danse-nr3> ^^;
2023-11-06 19:34:44 +0100apache2(apache2@anubis.0x90.dk)
2023-11-06 19:36:07 +0100 <EvanR> in the haskell semantics you call the denotation of functions monotone functions because they preserve the definedness ordering... which isn't a total order
2023-11-06 19:36:53 +0100 <EvanR> the semantic functions can't make your results less defined as you keep computing
2023-11-06 19:37:21 +0100 <EvanR> but the universe of values isn't laid out in a 1D line either
2023-11-06 19:37:46 +0100 <tomsmeding> fair
2023-11-06 19:37:57 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-11-06 19:37:58 +0100waleee(~waleee@h-176-10-144-38.na.cust.bahnhof.se)
2023-11-06 19:38:04 +0100 <tomsmeding> can't I have some double standards here?
2023-11-06 19:38:18 +0100 <tomsmeding> I can use "monotone" with vaguely defined not-even-preorders, you can't
2023-11-06 19:41:57 +0100 <EvanR> in some languages the universe of values does seem to be laid out in a 1D line, because you can compare any thing with anything. I wonder what this means for their semantics xD
2023-11-06 19:45:40 +0100 <erty> tomsmeding: I think I need to practice a bit more to understand the haskell way of writing code, and then only I would be able to understand what I am doing wrong. But nevertheless, thanks for all the help to you and everyone.
2023-11-06 19:46:16 +0100 <erty> ddellacosta: Thanks for the paper. I like the paper is from 1988 and it still valid today
2023-11-06 19:46:30 +0100 <erty> *how
2023-11-06 19:46:36 +0100Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se) (Ping timeout: 248 seconds)
2023-11-06 19:47:08 +0100jumper(~jumper@mobile-access-2e8413-105.dhcp.inet.fi)
2023-11-06 19:47:55 +0100Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se)
2023-11-06 19:48:34 +0100 <tomsmeding> erty: again, good luck and hopefully have fun :)
2023-11-06 19:49:35 +0100neceve(~neceve@user/neceve) (Ping timeout: 255 seconds)
2023-11-06 19:51:37 +0100 <monochrom> EvanR: I think it means that their values can only be finite data structures, never functions or even infinite data. Then it is simple but boring.
2023-11-06 19:52:46 +0100 <monochrom> Well, that's a sane way to do it.
2023-11-06 19:53:16 +0100 <monochrom> The insane way is, for example, compare function pointers and denounce extensional equality...
2023-11-06 19:53:18 +0100 <EvanR> you could encode functions as data structures
2023-11-06 19:53:38 +0100 <EvanR> yeah I'm kidding, they all just compare pointers xD
2023-11-06 19:54:00 +0100 <EvanR> values has not caught on much in 2023
2023-11-06 19:57:20 +0100hgolden(~hgolden@2603-8000-9d00-3ed1-dd4f-298a-9c49-a0ed.res6.spectrum.com) (Remote host closed the connection)
2023-11-06 19:57:40 +0100hgolden(~hgolden@2603-8000-9d00-3ed1-a6e3-3ba3-0107-8cff.res6.spectrum.com)
2023-11-06 20:00:13 +0100szkl(uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
2023-11-06 20:06:36 +0100[exa](~exa@user/exa/x-3587197)
2023-11-06 20:09:20 +0100jumper(~jumper@mobile-access-2e8413-105.dhcp.inet.fi) (Quit: leaving)
2023-11-06 20:09:21 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 240 seconds)
2023-11-06 20:12:02 +0100billchenchina(~billchenc@2a0d:2580:ff0c:1:e3c9:c52b:a429:5bfe) (Remote host closed the connection)
2023-11-06 20:13:25 +0100xstill_9(xstill@fimu/xstill)
2023-11-06 20:13:43 +0100MironZ6(~MironZ@nat-infra.ehlab.uk)
2023-11-06 20:13:44 +0100qhong(~qhong@rescomp-21-400677.stanford.edu)
2023-11-06 20:14:04 +0100henrytill_(e0180937c3@2604:bf00:561:2000::e8c)
2023-11-06 20:14:05 +0100fgaz__(1ff9197ed6@2604:bf00:561:2000::11ea)
2023-11-06 20:14:09 +0100sus_(1b7af6299f@user/zeromomentum)
2023-11-06 20:14:10 +0100bsima1_(9d7e39c8ad@2604:bf00:561:2000::dd)
2023-11-06 20:14:17 +0100fn_lumi_(3d621153a5@2604:bf00:561:2000::df7)
2023-11-06 20:14:18 +0100raghavgururajan_(ea769b8000@2604:bf00:561:2000::242)
2023-11-06 20:14:23 +0100chaitlatte0_(ea29c0bb16@2604:bf00:561:2000::1124)
2023-11-06 20:14:30 +0100jmcantrell_(644f1bed9a@user/jmcantrell)
2023-11-06 20:14:31 +0100bgamari_(~bgamari@64.223.173.10)
2023-11-06 20:14:32 +0100ymherklotz_(cb2c9cfbdd@2604:bf00:561:2000::29a)
2023-11-06 20:14:32 +0100shreyasminocha_(51fdc93eda@user/shreyasminocha)
2023-11-06 20:14:33 +0100theesm_(2cbdf4b38a@2604:bf00:561:2000::11c8)
2023-11-06 20:14:33 +0100_0xa_(~user@2001:19f0:5001:2ba8:5400:1ff:feda:88fc)
2023-11-06 20:14:34 +0100whereiseveryone_(206ba86c98@2604:bf00:561:2000::2e4)
2023-11-06 20:14:35 +0100b0o_(0e4a0bf4c9@2604:bf00:561:2000::1bf)
2023-11-06 20:14:35 +0100rselim_(ce261f06ff@user/milesrout)
2023-11-06 20:14:36 +0100acertain__(sid470584@id-470584.hampstead.irccloud.com)
2023-11-06 20:14:36 +0100jleightcap_(7bc4014b62@user/jleightcap)
2023-11-06 20:14:38 +0100liyang_(sid322268@id-322268.uxbridge.irccloud.com)
2023-11-06 20:14:38 +0100jmct_(sid160793@id-160793.tinside.irccloud.com)
2023-11-06 20:14:39 +0100liyang(sid322268@id-322268.uxbridge.irccloud.com) (Killed (zinc.libera.chat (Nickname regained by services)))
2023-11-06 20:14:39 +0100liyang_liyang
2023-11-06 20:15:16 +0100Unode_(~Unode@fg-ext-220.embl.de)
2023-11-06 20:16:13 +0100xnbya(~xnbya@2a01:4f8:c17:cbdd::1)
2023-11-06 20:16:22 +0100it__(~quassel@v2202212189510211193.supersrv.de)
2023-11-06 20:16:53 +0100mjrosenb_(~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net)
2023-11-06 20:17:34 +0100dexter2(dexter@2a01:7e00::f03c:91ff:fe86:59ec)
2023-11-06 20:17:45 +0100PHO`_(~pho@akari.cielonegro.org)
2023-11-06 20:18:14 +0100CAT_S_(apic@brezn3.muc.ccc.de)
2023-11-06 20:18:21 +0100shreyasminocha(51fdc93eda@user/shreyasminocha) (Ping timeout: 246 seconds)
2023-11-06 20:18:21 +0100qhong_(~qhong@rescomp-21-400677.stanford.edu) (Ping timeout: 246 seconds)
2023-11-06 20:18:21 +0100theesm(2cbdf4b38a@2604:bf00:561:2000::11c8) (Ping timeout: 246 seconds)
2023-11-06 20:18:21 +0100jmcantrell(644f1bed9a@user/jmcantrell) (Ping timeout: 246 seconds)
2023-11-06 20:18:21 +0100jmct(sid160793@id-160793.tinside.irccloud.com) (Ping timeout: 246 seconds)
2023-11-06 20:18:21 +0100fn_lumi(3d621153a5@2604:bf00:561:2000::df7) (Ping timeout: 246 seconds)
2023-11-06 20:18:22 +0100fgaz_(1ff9197ed6@2604:bf00:561:2000::11ea) (Ping timeout: 246 seconds)
2023-11-06 20:18:22 +0100adamCS(~adamCS@ec2-34-207-160-255.compute-1.amazonaws.com) (Ping timeout: 246 seconds)
2023-11-06 20:18:22 +0100_0xa(~user@user/0xa/x-3134607) (Ping timeout: 246 seconds)
2023-11-06 20:18:22 +0100rselim(ce261f06ff@user/milesrout) (Ping timeout: 246 seconds)
2023-11-06 20:18:22 +0100whereiseveryone(206ba86c98@2604:bf00:561:2000::2e4) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100jleightcap(7bc4014b62@user/jleightcap) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100b0o(0e4a0bf4c9@2604:bf00:561:2000::1bf) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100ymherklotz(cb2c9cfbdd@2604:bf00:561:2000::29a) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100chaitlatte0(ea29c0bb16@user/chaitlatte0) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100sus(1b7af6299f@user/zeromomentum) (Ping timeout: 246 seconds)
2023-11-06 20:18:23 +0100raghavgururajan(ea769b8000@user/raghavgururajan) (Ping timeout: 246 seconds)
2023-11-06 20:18:24 +0100bgamari(~bgamari@64.223.173.10) (Ping timeout: 246 seconds)
2023-11-06 20:18:24 +0100Raito_Bezarius(~Raito@wireguard/tunneler/raito-bezarius) (Ping timeout: 246 seconds)
2023-11-06 20:18:24 +0100acertain_(sid470584@id-470584.hampstead.irccloud.com) (Ping timeout: 246 seconds)
2023-11-06 20:18:24 +0100Unode(~Unode@fg-ext-220.embl.de) (Ping timeout: 246 seconds)
2023-11-06 20:18:24 +0100mjrosenb(~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net) (Ping timeout: 246 seconds)
2023-11-06 20:18:25 +0100Adran(~adran@botters/adran) (Ping timeout: 246 seconds)
2023-11-06 20:18:25 +0100CAT_S(apic@brezn3.muc.ccc.de) (Ping timeout: 246 seconds)
2023-11-06 20:18:25 +0100nullie(~nullie@2a01:4f8:c2c:6177::1) (Ping timeout: 246 seconds)
2023-11-06 20:18:25 +0100bsima1(9d7e39c8ad@2604:bf00:561:2000::dd) (Ping timeout: 246 seconds)
2023-11-06 20:18:26 +0100dexter1(dexter@2a01:7e00::f03c:91ff:fe86:59ec) (Ping timeout: 246 seconds)
2023-11-06 20:18:26 +0100henrytill(e0180937c3@2604:bf00:561:2000::e8c) (Ping timeout: 246 seconds)
2023-11-06 20:18:26 +0100xnbya2(~xnbya@2a01:4f8:c17:cbdd::1) (Ping timeout: 246 seconds)
2023-11-06 20:18:26 +0100MironZ(~MironZ@nat-infra.ehlab.uk) (Ping timeout: 246 seconds)
2023-11-06 20:18:26 +0100xstill_(xstill@fimu/xstill) (Ping timeout: 246 seconds)
2023-11-06 20:18:27 +0100PHO`(~pho@akari.cielonegro.org) (Ping timeout: 246 seconds)
2023-11-06 20:18:28 +0100it_(~quassel@v2202212189510211193.supersrv.de) (Ping timeout: 246 seconds)
2023-11-06 20:18:28 +0100jmct_jmct
2023-11-06 20:18:28 +0100theesm_theesm
2023-11-06 20:18:28 +0100fn_lumi_fn_lumi
2023-11-06 20:18:28 +0100acertain__acertain_
2023-11-06 20:18:29 +0100sus_sus
2023-11-06 20:18:29 +0100MironZ6MironZ
2023-11-06 20:18:29 +0100ymherklotz_ymherklotz
2023-11-06 20:18:29 +0100rselim_rselim
2023-11-06 20:18:29 +0100chaitlatte0_chaitlatte0
2023-11-06 20:18:29 +0100jmcantrell_jmcantrell
2023-11-06 20:18:29 +0100b0o_b0o
2023-11-06 20:18:30 +0100bsima1_bsima1
2023-11-06 20:18:30 +0100henrytill_henrytill
2023-11-06 20:18:30 +0100fgaz__fgaz_
2023-11-06 20:18:30 +0100whereiseveryone_whereiseveryone
2023-11-06 20:18:30 +0100jleightcap_jleightcap
2023-11-06 20:18:30 +0100shreyasminocha_shreyasminocha
2023-11-06 20:18:31 +0100Unode_Unode
2023-11-06 20:18:31 +0100xstill_9xstill_
2023-11-06 20:18:34 +0100nullie(~nullie@2a01:4f8:c2c:6177::1)
2023-11-06 20:18:45 +0100ggb(a62ffbaf4f@2604:bf00:561:2000::3ac) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100rselim(ce261f06ff@user/milesrout) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100jakzale(6291399afa@user/jakzale) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100evanrelf(3addc196af@2604:bf00:561:2000::f0) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100fluffyballoon(45ce440a48@2604:bf00:561:2000::e2) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100theesm(2cbdf4b38a@2604:bf00:561:2000::11c8) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100shreyasminocha(51fdc93eda@user/shreyasminocha) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100ymherklotz(cb2c9cfbdd@2604:bf00:561:2000::29a) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100cpli(77fc530071@2604:bf00:561:2000::252) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100probie(cc0b34050a@user/probie) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100jmcantrell(644f1bed9a@user/jmcantrell) (Read error: Connection reset by peer)
2023-11-06 20:18:45 +0100MonsoonSecrecy(f78c86e960@2604:bf00:561:2000::f99) (Read error: Connection reset by peer)
2023-11-06 20:18:46 +0100sus(1b7af6299f@user/zeromomentum) (Read error: Connection reset by peer)
2023-11-06 20:18:46 +0100raghavgururajan_(ea769b8000@2604:bf00:561:2000::242) (Read error: Connection reset by peer)
2023-11-06 20:18:46 +0100b0o(0e4a0bf4c9@2604:bf00:561:2000::1bf) (Write error: Connection reset by peer)
2023-11-06 20:18:46 +0100henrytill(e0180937c3@2604:bf00:561:2000::e8c) (Read error: Connection reset by peer)
2023-11-06 20:18:46 +0100brettgilio(a35ba67324@2604:bf00:561:2000::260) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100whereiseveryone(206ba86c98@2604:bf00:561:2000::2e4) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100fn_lumi(3d621153a5@2604:bf00:561:2000::df7) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100bsima1(9d7e39c8ad@2604:bf00:561:2000::dd) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100fgaz_(1ff9197ed6@2604:bf00:561:2000::11ea) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100jleightcap(7bc4014b62@user/jleightcap) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100chaitlatte0(ea29c0bb16@2604:bf00:561:2000::1124) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100akspecs(00cc8321af@sourcehut/user/akspecs) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100Ankhers(e99e97ef8e@2604:bf00:561:2000::2a2) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100arcadewise(52968ed80d@2604:bf00:561:2000::3df) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100fvr(ef3e56ca8b@2604:bf00:561:2000::3c4) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100samhh(7569f027cf@2604:bf00:561:2000::e4) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100jkoshy(99b9359beb@user/jkoshy) (Read error: Connection reset by peer)
2023-11-06 20:18:47 +0100JoelMcCracken(5ea8252fbb@2604:bf00:561:2000::10e3) (Read error: Connection reset by peer)
2023-11-06 20:18:48 +0100aniketd(32aa4844cd@2604:bf00:561:2000::dcb) (Read error: Connection reset by peer)
2023-11-06 20:18:48 +0100filwisher(2e6936c793@2604:bf00:561:2000::170) (Read error: Connection reset by peer)
2023-11-06 20:18:48 +0100lukec(9dfd4d094e@2604:bf00:561:2000::10e) (Read error: Connection reset by peer)
2023-11-06 20:18:48 +0100sm2n(ae95cb1267@user/sm2n) (Read error: Connection reset by peer)
2023-11-06 20:18:48 +0100samhh_(7569f027cf@2604:bf00:561:2000::e4) (Write error: Connection reset by peer)
2023-11-06 20:18:58 +0100fvr(ef3e56ca8b@2604:bf00:561:2000::3c4)
2023-11-06 20:18:59 +0100theesm(2cbdf4b38a@2604:bf00:561:2000::11c8)
2023-11-06 20:18:59 +0100filwisher(2e6936c793@2604:bf00:561:2000::170)
2023-11-06 20:19:00 +0100fgaz_(1ff9197ed6@2604:bf00:561:2000::11ea)
2023-11-06 20:19:01 +0100ggb(a62ffbaf4f@2604:bf00:561:2000::3ac)
2023-11-06 20:19:01 +0100raghavgururajan(ea769b8000@user/raghavgururajan)
2023-11-06 20:19:01 +0100bsima1(9d7e39c8ad@2604:bf00:561:2000::dd)
2023-11-06 20:19:01 +0100lukec(9dfd4d094e@2604:bf00:561:2000::10e)
2023-11-06 20:19:02 +0100samhh(7569f027cf@2604:bf00:561:2000::e4)
2023-11-06 20:19:12 +0100jleightcap(7bc4014b62@user/jleightcap)
2023-11-06 20:19:12 +0100shreyasminocha(51fdc93eda@user/shreyasminocha)
2023-11-06 20:19:21 +0100jakzale(6291399afa@user/jakzale)
2023-11-06 20:19:21 +0100jmcantrell(644f1bed9a@user/jmcantrell)
2023-11-06 20:19:23 +0100Raito_Bezarius(~Raito@82-65-118-1.subs.proxad.net)
2023-11-06 20:19:28 +0100evanrelf(3addc196af@2604:bf00:561:2000::f0)
2023-11-06 20:19:28 +0100sus(1b7af6299f@user/zeromomentum)
2023-11-06 20:19:32 +0100fluffyballoon(45ce440a48@2604:bf00:561:2000::e2)
2023-11-06 20:19:32 +0100aniketd(32aa4844cd@2604:bf00:561:2000::dcb)
2023-11-06 20:19:42 +0100brettgilio(a35ba67324@2604:bf00:561:2000::260)
2023-11-06 20:19:42 +0100whereiseveryone(206ba86c98@2604:bf00:561:2000::2e4)
2023-11-06 20:19:42 +0100probie(cc0b34050a@user/probie)
2023-11-06 20:19:42 +0100sm2n(ae95cb1267@user/sm2n)
2023-11-06 20:20:01 +0100adamCS(~adamCS@ec2-34-207-160-255.compute-1.amazonaws.com)
2023-11-06 20:20:05 +0100henrytill(e0180937c3@2604:bf00:561:2000::e8c)
2023-11-06 20:20:08 +0100MonsoonSecrecy(f78c86e960@2604:bf00:561:2000::f99)
2023-11-06 20:20:11 +0100Ankhers(e99e97ef8e@2604:bf00:561:2000::2a2)
2023-11-06 20:20:13 +0100rselim(ce261f06ff@user/milesrout)
2023-11-06 20:20:21 +0100doyougnu(~doyougnu@45.46.170.68) (Ping timeout: 240 seconds)
2023-11-06 20:20:22 +0100arcadewise(52968ed80d@2604:bf00:561:2000::3df)
2023-11-06 20:20:30 +0100cpli(77fc530071@2604:bf00:561:2000::252)
2023-11-06 20:20:37 +0100ymherklotz(cb2c9cfbdd@2604:bf00:561:2000::29a)
2023-11-06 20:20:38 +0100samhh_(7569f027cf@2604:bf00:561:2000::e4)
2023-11-06 20:20:39 +0100akspecs(00cc8321af@sourcehut/user/akspecs)
2023-11-06 20:20:39 +0100b0o(0e4a0bf4c9@2604:bf00:561:2000::1bf)
2023-11-06 20:20:46 +0100chaitlatte0(ea29c0bb16@user/chaitlatte0)
2023-11-06 20:20:52 +0100CO2(CO2@gateway/vpn/protonvpn/co2) (Quit: WeeChat 4.1.1)
2023-11-06 20:20:57 +0100jkoshy(99b9359beb@user/jkoshy)
2023-11-06 20:20:57 +0100fn_lumi(3d621153a5@2604:bf00:561:2000::df7)
2023-11-06 20:20:59 +0100JoelMcCracken(5ea8252fbb@2604:bf00:561:2000::10e3)
2023-11-06 20:21:25 +0100f-a(ff2a@drunk.24-7.ro) ()
2023-11-06 20:21:55 +0100Adran(~adran@botters/adran)
2023-11-06 20:28:41 +0100AlexZenon(~alzenon@178.34.161.199) (Quit: ;-)
2023-11-06 20:30:32 +0100doyougnu(~doyougnu@45.46.170.68)
2023-11-06 20:34:30 +0100sord937(~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
2023-11-06 20:44:35 +0100misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-11-06 20:45:20 +0100AlexZenon(~alzenon@178.34.161.199)
2023-11-06 20:46:41 +0100erty(~user@user/aeroplane) (Ping timeout: 240 seconds)
2023-11-06 20:53:11 +0100CO2(CO2@gateway/vpn/protonvpn/co2)
2023-11-06 20:56:03 +0100danse-nr3(~danse@151.37.110.121) (Ping timeout: 260 seconds)
2023-11-06 20:56:22 +0100danse-nr3(~danse@151.43.123.164)
2023-11-06 20:57:01 +0100pixelmonk(~pixelmonk@173.46.79.26) (Ping timeout: 240 seconds)
2023-11-06 20:59:19 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2023-11-06 20:59:41 +0100Pickchea(~private@user/pickchea)
2023-11-06 21:01:42 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 21:06:35 +0100fendor(~fendor@2a02:8388:1640:be00:cb6e:46f6:2fe6:1728) (Remote host closed the connection)
2023-11-06 21:08:35 +0100pixelmonk(~pixelmonk@173.46.79.26) (Ping timeout: 240 seconds)
2023-11-06 21:09:28 +0100CAT_S_(apic@brezn3.muc.ccc.de) (Quit: Reconnecting)
2023-11-06 21:09:40 +0100CATS(apic@brezn3.muc.ccc.de)
2023-11-06 21:15:09 +0100trev(~trev@user/trev) (Quit: trev)
2023-11-06 21:15:54 +0100CATSCAT_S
2023-11-06 21:20:51 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8) (Remote host closed the connection)
2023-11-06 21:21:22 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 21:24:34 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-11-06 21:25:35 +0100 <EvanR> what's up with this documentation, other than the exmaple typo, it says under virtual record fields you could access something with "#fullname", but I have not seen a way to get ghc to accept syntax #fullname
2023-11-06 21:25:40 +0100 <EvanR> https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/hasfield.html
2023-11-06 21:26:04 +0100 <EvanR> getField @"fullname" whatever does work as mentioned elsewhere on the page
2023-11-06 21:26:49 +0100 <int-e> > let (#) = id in id#4
2023-11-06 21:26:50 +0100 <lambdabot> error:
2023-11-06 21:26:50 +0100 <lambdabot> • Variable not in scope: id# :: t0 -> t
2023-11-06 21:26:51 +0100 <lambdabot> • Perhaps you meant one of these:
2023-11-06 21:26:56 +0100 <int-e> > let (#) = id in id #4
2023-11-06 21:26:58 +0100 <lambdabot> 4
2023-11-06 21:27:09 +0100 <int-e> (whoops, MagicHash is enabled in lambdabot)
2023-11-06 21:28:07 +0100pixelmonk(~pixelmonk@173.46.79.26) (Ping timeout: 264 seconds)
2023-11-06 21:30:33 +0100 <danse-nr3> someone should invent documentation bug reports, so that documentations can be improved
2023-11-06 21:30:49 +0100 <tomsmeding> EvanR: -XOverloadedLabels
2023-11-06 21:31:32 +0100 <EvanR> oooooh
2023-11-06 21:32:55 +0100pixelmonk(~pixelmonk@173.46.79.26)
2023-11-06 21:33:09 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-11-06 21:33:40 +0100hovsater(sid499516@id-499516.lymington.irccloud.com) (Server closed connection)
2023-11-06 21:33:49 +0100hovsater(sid499516@id-499516.lymington.irccloud.com)
2023-11-06 21:36:53 +0100sa1(sid7690@id-7690.ilkley.irccloud.com) (Server closed connection)
2023-11-06 21:37:03 +0100sa1(sid7690@id-7690.ilkley.irccloud.com)
2023-11-06 21:40:28 +0100ft(~ft@p4fc2a529.dip0.t-ipconnect.de)
2023-11-06 21:43:46 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 260 seconds)
2023-11-06 21:46:49 +0100danse-nr3(~danse@151.43.123.164) (Ping timeout: 255 seconds)
2023-11-06 21:48:11 +0100danse-nr3(~danse@151.43.123.164)
2023-11-06 21:49:40 +0100zetef(~quassel@5.2.182.98)
2023-11-06 21:49:45 +0100tritlo_(sid58727@id-58727.hampstead.irccloud.com) (Server closed connection)
2023-11-06 21:49:59 +0100tritlo_(sid58727@id-58727.hampstead.irccloud.com)
2023-11-06 21:50:39 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 21:50:58 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 21:52:24 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 21:53:00 +0100zetef(~quassel@5.2.182.98)
2023-11-06 21:55:20 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8)
2023-11-06 21:58:04 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 256 seconds)
2023-11-06 21:59:08 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 21:59:31 +0100eggplant_(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2023-11-06 21:59:38 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:718b:eff8:b2d7:bbc8) (Ping timeout: 255 seconds)
2023-11-06 21:59:44 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:02:53 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-11-06 22:03:08 +0100qeef(~qeef@138-169-143-94.cust.centrio.cz)
2023-11-06 22:04:04 +0100eggplant_(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 255 seconds)
2023-11-06 22:05:11 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-11-06 22:05:44 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:06:40 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:06:58 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2023-11-06 22:08:07 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:08:32 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:09:20 +0100__monty__(~toonn@user/toonn) (Quit: leaving)
2023-11-06 22:09:51 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:10:38 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:13:35 +0100Jackneill_(~Jackneill@20014C4E1E058A00E81C5E515534C989.dsl.pool.telekom.hu) (Ping timeout: 255 seconds)
2023-11-06 22:14:51 +0100zmt01(~zmt00@user/zmt00)
2023-11-06 22:15:52 +0100danse-nr3(~danse@151.43.123.164) (Ping timeout: 258 seconds)
2023-11-06 22:18:04 +0100pavonia(~user@user/siracusa)
2023-11-06 22:18:12 +0100doyougnu-(~doyougnu@45.46.170.68)
2023-11-06 22:18:55 +0100zmt00(~zmt00@user/zmt00) (Ping timeout: 252 seconds)
2023-11-06 22:19:14 +0100doyougnu(~doyougnu@45.46.170.68) (Ping timeout: 245 seconds)
2023-11-06 22:20:15 +0100oo_miguel(~Thunderbi@78-11-179-96.static.ip.netia.com.pl) (Ping timeout: 240 seconds)
2023-11-06 22:28:00 +0100target_i(~target_i@217.175.14.39) (Quit: leaving)
2023-11-06 22:29:00 +0100dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
2023-11-06 22:34:31 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:34:39 +0100ThePenguin(~ThePengui@cust-95-80-24-166.csbnet.se) (Ping timeout: 245 seconds)
2023-11-06 22:35:12 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:35:54 +0100justachejustThanks
2023-11-06 22:38:07 +0100ThePenguin(~ThePengui@cust-95-80-24-166.csbnet.se)
2023-11-06 22:41:26 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:42:20 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:42:23 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 22:43:07 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 22:45:57 +0100zetef(~quassel@5.2.182.98) (Read error: Connection reset by peer)
2023-11-06 22:46:07 +0100notzmv(~zmv@user/notzmv) (Ping timeout: 264 seconds)
2023-11-06 22:46:26 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 22:46:43 +0100zetef(~quassel@5.2.182.98)
2023-11-06 22:47:40 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 22:52:32 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 22:52:44 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 22:54:11 +0100end`(end@user/end/x-0094621)
2023-11-06 22:54:18 +0100Lycurgus(~georg@user/Lycurgus)
2023-11-06 22:56:31 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 22:57:46 +0100zetef(~quassel@5.2.182.98) (Remote host closed the connection)
2023-11-06 22:57:52 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:6dde:4903:7d59:6a8d)
2023-11-06 22:58:36 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:01:54 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 23:02:00 +0100zetef(~quassel@5.2.182.98)
2023-11-06 23:02:21 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:02:41 +0100stiell_(~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection)
2023-11-06 23:03:11 +0100zetef(~quassel@5.2.182.98) (Read error: Connection reset by peer)
2023-11-06 23:03:20 +0100stiell_(~stiell@gateway/tor-sasl/stiell)
2023-11-06 23:06:07 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 23:06:07 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:09:18 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 23:09:48 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:11:18 +0100Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-11-06 23:14:38 +0100danza(~francesco@151.47.97.80)
2023-11-06 23:14:55 +0100takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2023-11-06 23:15:43 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 23:17:12 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:20:18 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de)
2023-11-06 23:20:53 +0100todi(~todi@p4fd1a3e6.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2023-11-06 23:22:52 +0100ubert(~Thunderbi@91.141.42.10.wireless.dyn.drei.com)
2023-11-06 23:34:49 +0100coot(~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
2023-11-06 23:45:33 +0100rubin55(sid175221@id-175221.hampstead.irccloud.com) (Server closed connection)
2023-11-06 23:45:52 +0100rubin55(sid175221@id-175221.hampstead.irccloud.com)
2023-11-06 23:49:26 +0100danza(~francesco@151.47.97.80) (Ping timeout: 255 seconds)
2023-11-06 23:51:01 +0100pixelmonk(~pixelmonk@173.46.79.26) (Ping timeout: 240 seconds)
2023-11-06 23:52:28 +0100chomwitt(~chomwitt@2a02:587:7a2d:bc00:1ac0:4dff:fedb:a3f1) (Ping timeout: 258 seconds)
2023-11-06 23:53:27 +0100acidjnk(~acidjnk@p200300d6e72b93215d0d304e1b7de813.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2023-11-06 23:54:59 +0100gmg(~user@user/gehmehgeh) (Quit: Leaving)
2023-11-06 23:58:58 +0100end`end
2023-11-06 23:59:13 +0100endend`