2025/02/01

2025-02-01 00:01:07 +0100ubert(~Thunderbi@p200300ecdf4e63eb92aaad72729f1b5d.dip0.t-ipconnect.de) (Quit: ubert)
2025-02-01 00:01:42 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
2025-02-01 00:02:08 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 252 seconds)
2025-02-01 00:07:32 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 00:08:01 +0100ash3en(~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) ash3en
2025-02-01 00:08:02 +0100ash3en(~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Client Quit)
2025-02-01 00:11:39 +0100machinedgod(~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 265 seconds)
2025-02-01 00:11:45 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 00:12:40 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 00:14:08 +0100L29Ah(~L29Ah@wikipedia/L29Ah) L29Ah
2025-02-01 00:17:09 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 00:19:39 +0100ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2025-02-01 00:20:08 +0100ChaiTRex(~ChaiTRex@user/chaitrex) ChaiTRex
2025-02-01 00:22:24 +0100machinedgod(~machinedg@d108-173-18-100.abhsia.telus.net) machinedgod
2025-02-01 00:28:07 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 00:28:30 +0100machinedgod(~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 244 seconds)
2025-02-01 00:32:33 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 00:43:30 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 00:45:00 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 265 seconds)
2025-02-01 00:46:08 +0100jinsun(~jinsun@user/jinsun) jinsun
2025-02-01 00:46:50 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 00:47:58 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 00:51:22 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 272 seconds)
2025-02-01 00:52:04 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) ezzieyguywuf
2025-02-01 00:55:02 +0100 <Leary> kaol: Both ghcid and ghciwatch (given the right flags) allow you to effectively use the repl with `-- $> foo` comments in your code, though the latter is smarter about it---it actually loads the host module so its internals are in scope.
2025-02-01 00:55:16 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 01:00:04 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 01:01:22 +0100jinsun(~jinsun@user/jinsun) ()
2025-02-01 01:08:00 +0100ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 264 seconds)
2025-02-01 01:09:01 +0100 <haskellbridge> <sm> Leary: could you expand that a little ? $> foo comments ?
2025-02-01 01:10:40 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 01:12:09 +0100sawilagar(~sawilagar@user/sawilagar) (Ping timeout: 260 seconds)
2025-02-01 01:15:06 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 01:18:13 +0100 <Leary> sm: If you use the `--allow-eval` or `--enable-eval` flags in ghcid or ghciwatch respectively, they look for comments of the form `-- $> <code>` in your source to evaluate.
2025-02-01 01:19:22 +0100malte(~malte@mal.tc) (Remote host closed the connection)
2025-02-01 01:22:52 +0100ljdarj1(~Thunderbi@user/ljdarj) ljdarj
2025-02-01 01:23:12 +0100malte(~malte@mal.tc) malte
2025-02-01 01:23:17 +0100Guest96(~Guest96@81-207-104-14.fixed.kpn.net)
2025-02-01 01:23:59 +0100Guest96(~Guest96@81-207-104-14.fixed.kpn.net) (Client Quit)
2025-02-01 01:26:02 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 01:26:04 +0100ljdarj(~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds)
2025-02-01 01:26:05 +0100ljdarj1ljdarj
2025-02-01 01:28:13 +0100 <haskellbridge> <sm> good to know!
2025-02-01 01:30:44 +0100Tuplanolla(~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.)
2025-02-01 01:32:50 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2025-02-01 01:35:14 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 01:39:45 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 248 seconds)
2025-02-01 01:44:04 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 01:48:37 +0100alp(~alp@2001:861:8ca0:4940:291:464f:2c61:f1c2) (Remote host closed the connection)
2025-02-01 01:48:54 +0100alp(~alp@2001:861:8ca0:4940:be55:7820:aa2d:6e12)
2025-02-01 01:52:34 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 01:52:36 +0100gmg(~user@user/gehmehgeh) (Remote host closed the connection)
2025-02-01 01:53:11 +0100ec(~ec@gateway/tor-sasl/ec) ec
2025-02-01 01:53:44 +0100alp(~alp@2001:861:8ca0:4940:be55:7820:aa2d:6e12) (Ping timeout: 260 seconds)
2025-02-01 02:03:16 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 02:08:07 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2025-02-01 02:09:50 +0100sprotte24(~sprotte24@p200300d16f06b9001d5c2b08794be0ce.dip0.t-ipconnect.de) (Quit: Leaving)
2025-02-01 02:18:39 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 02:19:17 +0100otto_s(~user@p5de2fd05.dip0.t-ipconnect.de) (Ping timeout: 244 seconds)
2025-02-01 02:21:12 +0100otto_s(~user@p5b0448ee.dip0.t-ipconnect.de)
2025-02-01 02:24:20 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 02:24:29 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 02:28:54 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 252 seconds)
2025-02-01 02:35:03 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 02:39:21 +0100Guest22(~Guest62@c-73-217-79-154.hsd1.co.comcast.net)
2025-02-01 02:39:26 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 02:45:22 +0100acidjnk_new3(~acidjnk@p200300d6e7283f83f8f1a3a9ad07643b.dip0.t-ipconnect.de) (Ping timeout: 272 seconds)
2025-02-01 02:50:25 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 02:54:57 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
2025-02-01 02:58:41 +0100Guest22(~Guest62@c-73-217-79-154.hsd1.co.comcast.net) (Quit: Client closed)
2025-02-01 03:04:19 +0100xff0x(~xff0x@ai096095.d.east.v6connect.net) (Ping timeout: 260 seconds)
2025-02-01 03:06:07 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 03:10:36 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 03:13:06 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 03:13:38 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 03:15:32 +0100weary-traveler(~user@user/user363627) user363627
2025-02-01 03:16:01 +0100euleritian(~euleritia@ip4d17fae8.dynamic.kabel-deutschland.de) (Remote host closed the connection)
2025-02-01 03:16:19 +0100euleritian(~euleritia@77.23.250.232)
2025-02-01 03:16:50 +0100xff0x(~xff0x@2405:6580:b080:900:9526:2be3:6fc8:68b2)
2025-02-01 03:17:34 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 260 seconds)
2025-02-01 03:17:56 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 03:28:58 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 03:29:18 +0100vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
2025-02-01 03:30:09 +0100tavare(~tavare@user/tavare) tavare
2025-02-01 03:31:19 +0100vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2025-02-01 03:32:33 +0100euleritian(~euleritia@77.23.250.232) (Remote host closed the connection)
2025-02-01 03:32:51 +0100euleritian(~euleritia@77.23.250.232)
2025-02-01 03:33:02 +0100euouae(~euouae@user/euouae) euouae
2025-02-01 03:33:17 +0100 <euouae> Hello I was using Debug.Trace to check up on sharing
2025-02-01 03:33:34 +0100 <euouae> but e.g. `let y = trace "y-demanded" 1 in (y, y)` will print two y-demanded messages. Why? I thought 'y' would be shared in the pair expression
2025-02-01 03:33:42 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 03:33:48 +0100 <euouae> Is it just because sharing (for some reason) didn't happen there?
2025-02-01 03:34:10 +0100 <geekosaur> did you use optimization?
2025-02-01 03:34:19 +0100 <geekosaur> (if you were doing it in ghci, you weren't)
2025-02-01 03:34:24 +0100 <int-e> compare let y = trace "y-demanded" 1 :: Integer in (y, y)
2025-02-01 03:34:38 +0100 <int-e> then figure out why adding a type signature makes a difference
2025-02-01 03:34:45 +0100 <geekosaur> oh, right
2025-02-01 03:35:29 +0100 <int-e> the remark about optimizations is valid too of course
2025-02-01 03:36:07 +0100 <EvanR> that's so tricky
2025-02-01 03:36:23 +0100 <euouae> because the type inference prevents it from being shared?
2025-02-01 03:36:34 +0100 <geekosaur> type inference didn't happen
2025-02-01 03:36:38 +0100 <geekosaur> there's a piece missing
2025-02-01 03:36:50 +0100 <geekosaur> well, it did but it didn't reach a final result
2025-02-01 03:36:55 +0100 <int-e> :t 1
2025-02-01 03:36:56 +0100 <lambdabot> Num p => p
2025-02-01 03:37:09 +0100 <euouae> it being Num doesn't tell me much I don't know what to make of it
2025-02-01 03:37:13 +0100 <EvanR> 1 is like a function waiting to be given a Num instance
2025-02-01 03:37:24 +0100 <EvanR> rather than a number
2025-02-01 03:37:33 +0100 <geekosaur> :t let y = 1 in (y,y)
2025-02-01 03:37:34 +0100 <lambdabot> (Num a, Num b) => (a, b)
2025-02-01 03:37:57 +0100 <geekosaur> think about that one for a bit
2025-02-01 03:38:12 +0100 <euouae> well, so it is type inference right
2025-02-01 03:38:18 +0100 <euouae> because I can do :: (Int, Double)
2025-02-01 03:38:47 +0100 <EvanR> :t let y = 1 in (y,y) :: (Int, Double)
2025-02-01 03:38:48 +0100 <lambdabot> (Int, Double)
2025-02-01 03:38:53 +0100 <EvanR> now it's a pair of numbers
2025-02-01 03:38:54 +0100 <int-e> well sharing and lack thereof is firmly a runtime phenomenon
2025-02-01 03:39:03 +0100 <int-e> so it's not *just* type inference
2025-02-01 03:39:25 +0100 <euouae> Yeah, `let x = trace "foo" 1 in (x :: Int, x :: Int)` will still print two foos
2025-02-01 03:39:38 +0100 <EvanR> pair of numbers vs "like a function waiting for two different Num instances, that may or may not happen to be the same instance"
2025-02-01 03:39:40 +0100 <euouae> it's something more than that
2025-02-01 03:40:30 +0100 <euouae> when you say function do you mean type function
2025-02-01 03:40:37 +0100 <EvanR> no
2025-02-01 03:40:41 +0100 <euouae> the `p` argument in Num p => p?
2025-02-01 03:40:50 +0100 <EvanR> no the => in Num p => p
2025-02-01 03:41:07 +0100 <geekosaur> as long as it has a constraint, it's like a partially applied function. (=> looks like -> for a reason) the thing that needs to be applied is an instance dictionary
2025-02-01 03:41:16 +0100 <int-e> Concretely at runtime, the argument is a Num dictionary for p.
2025-02-01 03:41:18 +0100nitrix(~nitrix@user/meow/nitrix) (Quit: ZNC 1.8.2 - https://znc.in)
2025-02-01 03:41:31 +0100 <euouae> I haven't heard of dictionary before
2025-02-01 03:41:32 +0100 <geekosaur> by the time you apply it to the tuple, it's too late to go back and do sharing. if you specify it in the let, it can share
2025-02-01 03:42:03 +0100 <int-e> (Dictionaries are an implementation detail of type classes.)
2025-02-01 03:42:12 +0100 <geekosaur> have you reached typeclasses yet?
2025-02-01 03:42:26 +0100 <euouae> No I just roughly know they have to do with interfaces
2025-02-01 03:42:32 +0100 <EvanR> D:
2025-02-01 03:42:35 +0100 <int-e> (And there are alternatives... notably, JHC passed type descriptors instead.)
2025-02-01 03:42:37 +0100nitrix(~nitrix@user/meow/nitrix) nitrix
2025-02-01 03:42:39 +0100tabaqui1(~root@87.200.129.102) tabaqui
2025-02-01 03:43:24 +0100 <EvanR> is passing type descriptors tangibly different in practice
2025-02-01 03:43:27 +0100 <geekosaur> "interfaces" is a flawed attempt to understand typeclasses in terms of something better known, much like all the failed monad tutorials floating around the internet
2025-02-01 03:43:57 +0100 <euouae> failure does not worry me
2025-02-01 03:44:17 +0100 <EvanR> > fail "monad tutorial failed"
2025-02-01 03:44:18 +0100 <lambdabot> error:
2025-02-01 03:44:18 +0100 <lambdabot> • Ambiguous type variables ‘m0’,
2025-02-01 03:44:18 +0100 <lambdabot> ‘a0’ arising from a use of ‘show_M13899420735...
2025-02-01 03:44:20 +0100 <geekosaur> it should, you will have problems if you insist on "thats good enlugh isnt it?"
2025-02-01 03:44:28 +0100 <geekosaur> because it won't be good enough
2025-02-01 03:44:31 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 03:45:34 +0100 <euouae> so anyway, sharing happens in concrete types?
2025-02-01 03:45:40 +0100 <int-e> EvanR: Hmm I suspect it mostly affects optimization. But you can probably construct degenerate examples where type descriptors blow up (you construct an arbitrary sized type descriptor) but the functions associated with the class instances don't. (It's `coerce` all the way.) If you only worry about whether something is a function or not at runtime... no it makes no difference.
2025-02-01 03:46:08 +0100 <EvanR> euouae, for sharing to be possible, the two expressions would have to be known to evaluate to the same value
2025-02-01 03:46:11 +0100 <EvanR> then you can share the value
2025-02-01 03:46:33 +0100 <EvanR> in your example they very well may not be the same value
2025-02-01 03:46:35 +0100 <EvanR> or even the same type
2025-02-01 03:46:47 +0100 <euouae> so what happens with (x :: Int, x :: Int) that still prevents it from being shared?
2025-02-01 03:47:05 +0100 <euouae> that x::Int is unevaluated while x::Int evaluates to `x` (but Int now) and then _that_ thunk gets shared?
2025-02-01 03:47:08 +0100 <EvanR> x was a polymorphic thing waiting to be told what Num instance to use
2025-02-01 03:47:40 +0100 <EvanR> presumably a smart enough compiler could look at (x :: Int, x :: Int) and deduce they must evaluate to the same thing
2025-02-01 03:47:46 +0100 <EvanR> but doesn't?
2025-02-01 03:47:50 +0100 <geekosaur> as I said earlier, if you make them both Int when you are tupling them, it's too late; the decision was made that it couldn't share them
2025-02-01 03:48:09 +0100 <geekosaur> because they might not be the same type when applied
2025-02-01 03:48:12 +0100 <euouae> right but is there some deeper understanding to draw from that geekosaur ?
2025-02-01 03:48:24 +0100 <int-e> euouae: there's *no* CSE
2025-02-01 03:48:31 +0100 <EvanR> oh that's why
2025-02-01 03:48:39 +0100 <euouae> not sure what CSE is
2025-02-01 03:48:45 +0100 <int-e> in your context, which is GHCi (so unoptimized bytecode)
2025-02-01 03:48:50 +0100 <geekosaur> "common subexpression elimination"
2025-02-01 03:49:14 +0100 <EvanR> CSE could make let x = 1 in (x::Int,x::Int) into let x = 1 :: Int in (x,x)
2025-02-01 03:49:14 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 03:49:25 +0100 <euouae> ah I see. What is the subexpression? the x in the tuple?
2025-02-01 03:49:29 +0100 <EvanR> x::Int
2025-02-01 03:50:25 +0100 <EvanR> and then sharing would be an optimization on top of that
2025-02-01 03:50:59 +0100 <euouae> thank you
2025-02-01 03:52:23 +0100 <EvanR> you're in good shape if you don't care about sharing xD
2025-02-01 03:52:34 +0100 <EvanR> otherwise D:
2025-02-01 03:53:29 +0100 <EvanR> it's not represented in the semantics which is always fun
2025-02-01 03:57:35 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) (Quit: Lost terminal)
2025-02-01 03:59:55 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 04:01:19 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) ezzieyguywuf
2025-02-01 04:01:30 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 04:04:21 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 04:05:39 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 246 seconds)
2025-02-01 04:11:15 +0100 <euouae> <https://wiki.haskell.org/GHC_optimisations#Common_subexpression_elimination> "Long story short: "If you care about CSE, do it by hand." "
2025-02-01 04:11:34 +0100 <euouae> One would think `let x = 1 in (x, x)` is doing CSE by hand but... classes :D tricky stuff
2025-02-01 04:14:00 +0100 <euouae> what is a type that is not like that called?
2025-02-01 04:14:11 +0100 <euouae> because 1 as a type is .. a kind? not a type?
2025-02-01 04:14:38 +0100 <euouae> `Num a => a` versus `a`. Is it OK to call it concrete type (the latter) or do I call it something else? Wah is the former called?
2025-02-01 04:15:19 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 04:17:36 +0100 <ncf> a is all but concrete!
2025-02-01 04:17:38 +0100 <int-e> Cop-out: it's a value. (Functions are values.)
2025-02-01 04:18:04 +0100 <ncf> i suggest calling the former Num a => a and the latter a. don't make up words
2025-02-01 04:18:50 +0100 <int-e> You can cook up terminology like "instance-dependent value" but I don't think we have any standard terminology for this.
2025-02-01 04:19:54 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 04:26:51 +0100 <Leary> euouae: The question is somewhat confused. Perhaps you want to describe values, not types, with 'monomorphic' for `1 :: Int` and 'polymorphic' for `1 :: forall a. Num a => a`. That somewhat incidentally ends up capturing whether or not the value is expecting a constraint, since GHC ensures known constraints are supplied.
2025-02-01 04:29:14 +0100hughjfchen(~hughjfche@vmi556545.contaboserver.net) (Ping timeout: 272 seconds)
2025-02-01 04:30:42 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 04:33:15 +0100 <euouae> how come `forall` pops up in Haskell source code? is it legal haskell?
2025-02-01 04:33:20 +0100 <euouae> e.g. stuff in Base
2025-02-01 04:34:18 +0100 <euouae> Monomorphic value is fine; I'm just trying to say how I think CSE would be manually done if desired as an optimization (ensuring the value is monomorphic with type annotations)
2025-02-01 04:34:22 +0100 <int-e> What's your definition of "legal"? A lot of Haskell code only works with GHC.
2025-02-01 04:34:30 +0100 <Leary> All type variables are implicitly or explicitly introduced with `forall`, though you need to enable language extensions so GHC will accept it.
2025-02-01 04:34:45 +0100 <int-e> The `base` that comes with GHC in particular is tied to GHC.
2025-02-01 04:34:50 +0100 <euouae> I see
2025-02-01 04:35:33 +0100 <int-e> (There was a time when hugs and GHC shared most of the base libraries but that's in the distant past. Like, over 2 decades ago.)
2025-02-01 04:36:32 +0100 <euouae> Well, I do remember when Hugs was a thing
2025-02-01 04:36:41 +0100 <euouae> I had attempted to learn haskell around 18 years ago I think
2025-02-01 04:37:30 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 04:39:03 +0100 <int-e> Hmm. So you hit the brief window when there were half a dozen actively developed Haskell implementations? Maybe it was just four.
2025-02-01 04:39:17 +0100 <EvanR> forall is how you introduce type variables for polymorphism purposes
2025-02-01 04:39:36 +0100 <EvanR> normally it's understood and not written in a type sig
2025-02-01 04:39:45 +0100 <EvanR> map :: (a -> b) -> [a] -> [b]
2025-02-01 04:39:57 +0100 <EvanR> there's really a forall a b . at the beginning of that
2025-02-01 04:40:07 +0100 <int-e> or is that forall b a. :-)
2025-02-01 04:40:13 +0100 <euouae> yes I did
2025-02-01 04:40:19 +0100 <euouae> there was a lot of hype back then
2025-02-01 04:40:26 +0100 <EvanR> but with rank N types and ScopedTypeVariables you need explicit forall for reasons
2025-02-01 04:41:01 +0100 <euouae> I'm not super interested in the crazy type theory stuff; I already had some exposure with Coq so at least I saw it in action elsewhere
2025-02-01 04:41:18 +0100 <euouae> perhaps only interested as it pertains to my purposes of writing software
2025-02-01 04:41:28 +0100 <EvanR> type theory has to do with logic
2025-02-01 04:41:35 +0100 <EvanR> haskell is illogical so you're good
2025-02-01 04:41:41 +0100 <euouae> I'm good
2025-02-01 04:41:41 +0100 <euouae> :P
2025-02-01 04:43:13 +0100td_(~td@i5387092E.versanet.de) (Ping timeout: 248 seconds)
2025-02-01 04:48:48 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 04:50:13 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 04:54:25 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 248 seconds)
2025-02-01 04:57:05 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 04:57:43 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) bitdex
2025-02-01 05:08:15 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 05:10:08 +0100robobub(uid248673@id-248673.uxbridge.irccloud.com) robobub
2025-02-01 05:12:04 +0100ensyde(~ensyde@2601:5c6:c200:6dc0::64a2) ensyde
2025-02-01 05:13:04 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 05:23:38 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 05:25:14 +0100aforemny_(~aforemny@2001:9e8:6ce1:bc00:8ce8:3eef:6047:48a7) aforemny
2025-02-01 05:26:16 +0100aforemny(~aforemny@i577B135A.versanet.de) (Ping timeout: 252 seconds)
2025-02-01 05:28:10 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2025-02-01 05:35:07 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) peterbecich
2025-02-01 05:39:00 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 05:41:18 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 05:43:36 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 05:45:52 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 272 seconds)
2025-02-01 05:54:23 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 05:58:54 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 06:09:45 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 06:14:18 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 06:18:38 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2025-02-01 06:22:51 +0100prasad(~Thunderbi@2601:243:c001:3f07::fe) (Ping timeout: 246 seconds)
2025-02-01 06:25:07 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 06:28:54 +0100eL_Bart0(eL_Bart0@dietunichtguten.org) (Ping timeout: 260 seconds)
2025-02-01 06:29:42 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 06:30:14 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 06:30:32 +0100Lears(~Leary@user/Leary/x-0910699) Leary
2025-02-01 06:30:48 +0100Leary(~Leary@user/Leary/x-0910699) (Ping timeout: 252 seconds)
2025-02-01 06:30:51 +0100LearsLeary
2025-02-01 06:34:19 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 260 seconds)
2025-02-01 06:37:45 +0100machinedgod(~machinedg@d108-173-18-100.abhsia.telus.net) machinedgod
2025-02-01 06:40:38 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 06:44:53 +0100EvanR(~EvanR@user/evanr) (Ping timeout: 248 seconds)
2025-02-01 06:45:09 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2025-02-01 06:45:16 +0100EvanR(~EvanR@user/evanr) EvanR
2025-02-01 06:49:29 +0100Flow(~none@gentoo/developer/flow) (Ping timeout: 252 seconds)
2025-02-01 06:53:32 +0100Flow(~none@gentoo/developer/flow) flow
2025-02-01 06:56:01 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 06:56:33 +0100Guest93(~Guest62@c-73-217-79-154.hsd1.co.comcast.net)
2025-02-01 06:56:39 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2025-02-01 06:57:32 +0100takuan(~takuan@d8D86B601.access.telenet.be)
2025-02-01 07:00:30 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 07:01:06 +0100Sgeo(~Sgeo@user/sgeo) Sgeo
2025-02-01 07:05:41 +0100euphores(~SASL_euph@user/euphores) (Quit: Leaving.)
2025-02-01 07:07:44 +0100j1n37(~j1n37@user/j1n37) (Read error: Connection reset by peer)
2025-02-01 07:10:44 +0100j1n37(~j1n37@user/j1n37) j1n37
2025-02-01 07:11:23 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 07:13:04 +0100euphores(~SASL_euph@user/euphores) euphores
2025-02-01 07:16:19 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2025-02-01 07:18:26 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 07:22:36 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 252 seconds)
2025-02-01 07:24:21 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 248 seconds)
2025-02-01 07:26:46 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 07:33:53 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2025-02-01 07:35:30 +0100Guest93(~Guest62@c-73-217-79-154.hsd1.co.comcast.net) (Quit: Client closed)
2025-02-01 07:38:22 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2025-02-01 07:38:46 +0100ec(~ec@gateway/tor-sasl/ec) ec
2025-02-01 07:44:49 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 07:49:16 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2025-02-01 07:56:51 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 07:58:49 +0100target_i(~target_i@user/target-i/x-6023099) target_i
2025-02-01 08:00:13 +0100JamesMowery4395(~JamesMowe@ip68-228-212-232.ph.ph.cox.net) (Quit: Goodbye)
2025-02-01 08:00:30 +0100JamesMowery4395(~JamesMowe@ip68-228-212-232.ph.ph.cox.net) JamesMowery
2025-02-01 08:00:40 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) peterbecich
2025-02-01 08:01:06 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 08:07:11 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-02-01 08:11:17 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 248 seconds)
2025-02-01 08:12:13 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 08:16:37 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2025-02-01 08:17:56 +0100weary-traveler(~user@user/user363627) (Remote host closed the connection)
2025-02-01 08:27:36 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-02-01 08:32:23 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)