考虑从a's 到成对的b's 和c's,的函数类型a -> (b, c)。(我将使用 Haskell 表示法来表示类型和函数,但这不是关于 Haskell 本身的问题。)有许多这样的函数,包括那些同时、一个或不(b, c)依赖于输出的函数a。
假设,特别是,第一个输出取决于a,但第二个不依赖(例如在 中\a -> (a, ()))。是否可以在多态 lambda 演算或 Hindley-Milner 中编写一个类型来表征所有且仅此类函数 - 换句话说,其子空间与a -> (b, c)同构(a -> b, c)?换句话说,我们是否可以定义一个f :: d(对于某些类型d)使得f (\a -> (a, ())), f (\a -> (a, 1)), ... 都是正确类型的,但是f (\a -> (a, a)), f (\a -> (a, snd a)), ... 都不是?
或者,有什么方法可以静态地确保 的元素a -> (b, c)具有此属性?