2026/01/18

Newest at the top

2026-01-18 02:03:30 +0100Zemy(~Zemy@72.178.108.235)
2026-01-18 02:03:18 +0100Zemy(~Zemy@72.178.108.235) (Ping timeout: 252 seconds)
2026-01-18 02:03:18 +0100vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
2026-01-18 02:00:09 +0100Zemy_(~Zemy@2600:100c:b04a:cc3c:1015:34ff:fe46:86ce)
2026-01-18 01:57:12 +0100 <monochrom> OK OK s/unusable/indistinguishable from ()/ :)
2026-01-18 01:55:30 +0100 <monochrom> or at least a pointer to the struct of Show methods.
2026-01-18 01:54:07 +0100 <monochrom> A concrete example being: If you give me an existential value and want me to be able to use Show methods on it, then you must also give me the Show methods, lest how do I even know that I'm allowed to.
2026-01-18 01:53:52 +0100 <EvanR> sounds useful
2026-01-18 01:53:34 +0100 <EvanR> a value can have zero cost if the only possibility is that it exists i.e. ()
2026-01-18 01:53:15 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
2026-01-18 01:51:58 +0100 <monochrom> an easy corollary of information theory. For a value to be usable, you must pass around sufficient information, thus the non-zero cost.
2026-01-18 01:50:11 +0100 <monochrom> Existentials are zero-cost iff unusable.
2026-01-18 01:48:43 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-01-18 01:47:16 +0100Core4452(~Zemy@2600:100c:b04a:cc3c:ac56:f4ff:fe3c:1c26) (Ping timeout: 246 seconds)
2026-01-18 01:44:59 +0100vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2026-01-18 01:43:25 +0100Zemy(~Zemy@72.178.108.235)
2026-01-18 01:43:05 +0100droideqa(uid499291@user/droideqa) (Quit: Connection closed for inactivity)
2026-01-18 01:43:04 +0100vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 246 seconds)
2026-01-18 01:38:48 +0100machinedgod(~machinedg@d75-159-126-101.abhsia.telus.net) machinedgod
2026-01-18 01:38:19 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
2026-01-18 01:32:56 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-01-18 01:31:08 +0100trickard_trickard
2026-01-18 01:27:33 +0100poscat(~poscat@user/poscat) poscat
2026-01-18 01:25:43 +0100mhatta(~mhatta@www21123ui.sakura.ne.jp)
2026-01-18 01:24:23 +0100poscat(~poscat@user/poscat) (Remote host closed the connection)
2026-01-18 01:22:14 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-01-18 01:21:35 +0100takuan(~takuan@d8D86B9E9.access.telenet.be) (Ping timeout: 245 seconds)
2026-01-18 01:20:19 +0100 <haskellbridge> <Man of Letters (Mikolaj)> falls more into the category of "ways to make existential-like things zero-cost" than the category "an alternative but similarly handy abstraction mechanism"
2026-01-18 01:20:00 +0100mhatta(~mhatta@www21123ui.sakura.ne.jp) (Quit: ZNC 1.10.1+deb1 - https://znc.in)
2026-01-18 01:18:32 +0100 <haskellbridge> <Man of Letters (Mikolaj)> oh wow, thank you, that's interesting
2026-01-18 01:17:09 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-01-18 01:14:31 +0100qqq(~qqq@185.54.21.105) (Quit: Lost terminal)
2026-01-18 01:10:55 +0100ljdarj(~Thunderbi@user/ljdarj) (Ping timeout: 244 seconds)
2026-01-18 01:08:00 +0100 <Leary> Man of Letters (Mikolaj): Re the heterogeneous types, it's basically just a matter of building a home for your discarded types to live in. In the simplest case where all those types have the same kind, you could literally just add a type level list to your AST: `AstCastS :: (NumScalar r1, RealFrac r1, NumScalar r2, RealFrac r2) => AstTensor discarded ms s (TKS sh r1) -> AstTensor (r1:discarded) ms s (TKS sh r2)`
2026-01-18 01:07:19 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
2026-01-18 01:02:47 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-01-18 00:58:18 +0100__monty__(~toonn@user/toonn) (Quit: leaving)
2026-01-18 00:58:10 +0100 <geekosaur> (GADT-style, at least)
2026-01-18 00:57:37 +0100trickard_(~trickard@cpe-82-98-47-163.wireline.com.au)
2026-01-18 00:57:23 +0100trickard_(~trickard@cpe-82-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
2026-01-18 00:56:30 +0100 <haskellbridge> <Man of Letters (Mikolaj)> ;<
2026-01-18 00:55:27 +0100 <geekosaur> I think the only other alternative isn't here yet: dependent type witnesses of some kind. Which are also not zero cost, and I suspect end up being just a different way to encode existentials
2026-01-18 00:55:03 +0100cattieskitties
2026-01-18 00:53:47 +0100 <haskellbridge> <Man of Letters (Mikolaj)> and being so handy, they easily pollute the performance-sensitive parts of the application
2026-01-18 00:52:51 +0100 <haskellbridge> <Man of Letters (Mikolaj)> well, the point is, they are not a zero-cost abstraction unlike, in principle, most of other abstractions Haskell provides
2026-01-18 00:51:37 +0100merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
2026-01-18 00:50:59 +0100ethantwardy(~user@user/ethantwardy) ethantwardy
2026-01-18 00:50:23 +0100humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-01-18 00:49:30 +0100 <haskellbridge> <Man of Letters (Mikolaj)> :D
2026-01-18 00:49:25 +0100 <EvanR> (and what's the point)