考虑从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)
具有此属性?