2026/05/20

Newest at the top

2026-05-20 11:27:28 +0000 <ski> (of course, you could, if you wanted to, imagine an analysis which tracked each call, to figure out the actual concrete types, and perhaps specialize the code for `map' wrt that. however, this can't be done, in general, in Haskell, due to "polymorphic recursion", and also (if you enable that extensions) existentials)
2026-05-20 11:27:26 +0000 <mesaoptimizer> that's a very lucid answer (given my current understanding of things), thanks
2026-05-20 11:27:15 +0000puke(~puke@user/puke) (Read error: error:0A000139:SSL routines::record layer failure)
2026-05-20 11:26:02 +0000 <ski> still, they *are* assigned this abstract type (and the input list to have the partially abstract type `[a]'), which is their compile-time type, it's just that it omits some information (generalizes over it, in order to be able to call `map' from different contexts, with different types)
2026-05-20 11:24:41 +0000 <ski> callback results) will have, in a particular call to `map'
2026-05-20 11:24:35 +0000 <ski> e.g. in `map :: (a -> b) -> [a] -> [b]', it is not determined what type the individual input elements (nor the results of calling the callback) "really" has, at compile-time, in the sense that the input elements are determined to have type `a' (and the callback results to have type `b'), but these are abstract/opaque/hidden/forgotten/skolem, only a placeholder name for whichever type the actual elements (and
2026-05-20 11:22:07 +0000 <ski> mesaoptimizer : yes (upto things like polymorphism / existentials. that does not mean they're really determined (as in actually found out) at run-time, though)
2026-05-20 11:17:53 +0000 <dutchie> https://paste.tomsmeding.com/vXIxg2HR
2026-05-20 11:13:43 +0000vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-05-20 11:10:59 +0000 <dutchie> and then the compiler has proven that a value can only be True or False so it knows all cases are covered
2026-05-20 11:10:25 +0000 <dutchie> hmm. my interpretation was that e.g. Bool doesn't exist, but True and False do
2026-05-20 11:10:06 +0000wickedjargon(~user@64.114.24.74) wickedjargon
2026-05-20 11:09:53 +0000wickedjargon(~user@64.114.24.74) (Read error: Connection reset by peer)
2026-05-20 11:09:52 +0000 <gentauro> however, the `newtype` "wrapper" gets abstracted away (less memory usage per element)
2026-05-20 11:09:01 +0000 <gentauro> dutchie: they are. How would you handle the cases for sum types (tagged unions) otherwise?
2026-05-20 11:05:10 +0000danza(~danza@user/danza) (Remote host closed the connection)
2026-05-20 11:04:32 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-05-20 11:04:02 +0000fun-safe-math(~fun-safe-@97-120-35-225.ptld.qwest.net) fun-safe-math
2026-05-20 11:01:53 +0000fun-safe-math(~fun-safe-@97-120-35-225.ptld.qwest.net) ()
2026-05-20 10:58:57 +0000nhar(~noah@76.33.110.8) (Ping timeout: 245 seconds)
2026-05-20 10:54:29 +0000nhar(~noah@76.33.110.8)
2026-05-20 10:40:37 +0000nhar(~noah@76.33.110.8) (Ping timeout: 245 seconds)
2026-05-20 10:39:51 +0000wickedjargon(~user@64.114.24.74) wickedjargon
2026-05-20 10:38:48 +0000Square2(~Square4@user/square) Square
2026-05-20 10:36:20 +0000nhar(~noah@76.33.110.8)
2026-05-20 10:29:56 +0000bggd_(~bgg@2a01:e0a:fd5:f510:8bd7:8b66:ece0:ae9f) (Remote host closed the connection)
2026-05-20 10:25:53 +0000 <dutchie> it's all just passing around instance dictionaries at most
2026-05-20 10:25:47 +0000 <dutchie> Haskell types don't even exist at runtime, do they?
2026-05-20 10:16:50 +0000fun-safe-math(~fun-safe-@97-120-35-225.ptld.qwest.net) fun-safe-math
2026-05-20 10:16:34 +0000fun-safe-math(~fun-safe-@97-120-35-225.ptld.qwest.net) (Server closed connection)
2026-05-20 10:08:55 +0000Pixi(~Pixi@user/pixi) (Ping timeout: 272 seconds)
2026-05-20 10:08:47 +0000yin_yin
2026-05-20 10:08:22 +0000yin(~zero@user/zero) (Ping timeout: 265 seconds)
2026-05-20 10:08:10 +0000yin_(~zero@user/zero) zero
2026-05-20 10:07:28 +0000nhar(~noah@76.33.110.8) (Ping timeout: 256 seconds)
2026-05-20 10:07:00 +0000Pixi`(~Pixi@user/pixi) Pixi
2026-05-20 10:06:02 +0000 <mesaoptimizer> merijn: I agree with that sentiment, but I still am unsure as to whether this holds for Haskell or not
2026-05-20 10:06:00 +0000tremon(~tremon@83.80.159.219) tremon
2026-05-20 10:02:49 +0000nhar(~noah@76.33.110.8)
2026-05-20 09:48:32 +0000peterbecich(~Thunderbi@71.84.33.135) (Ping timeout: 245 seconds)
2026-05-20 09:44:47 +0000nhar(~noah@76.33.110.8) (Ping timeout: 245 seconds)
2026-05-20 09:44:20 +0000peterbecich(~Thunderbi@71.84.33.135) peterbecich
2026-05-20 09:44:02 +0000peterbecich(~Thunderbi@71.84.33.135) (Quit: peterbecich)
2026-05-20 09:43:57 +0000Guest54(~Guest54@2600:1700:4c00:68f0:c786:9a89:b897:4427) (Ping timeout: 245 seconds)
2026-05-20 09:40:32 +0000 <merijn> mesaoptimizer: As opposed to what the dynamic languages have popularized as "types", which is merely a runtime tag indicated what kind of data a value has
2026-05-20 09:40:13 +0000nhar(~noah@76.33.110.8)
2026-05-20 09:39:36 +0000 <merijn> mesaoptimizer: As a type theory pedantist it's impossible for "type of every expression is determined at compile time", because the entire definition of types is that they're static derived properties of source code, meaning that they're static derivability at compile time is a hard required of types
2026-05-20 09:37:53 +0000 <merijn> If you're using lookup you should probably be using lookup of a different datatype
2026-05-20 09:37:25 +0000 <merijn> zip, min, max, fst, and snd are all used all the time. curry/uncurry less frequently but still a lot
2026-05-20 09:32:07 +0000CiaoSen(~Jura@dynamic-046-114-156-027.46.114.pool.telefonica.de) (Ping timeout: 264 seconds)