今天我在尝试使用 Haskell,考虑到根据类型自动生成函数定义。例如,该函数的定义如下:
这就引出了我的问题。鉴于“与...具有相同类型”的关系符号“=::=”,是否可以唯一确定x的类型,从语句“x =::= x x($)”中推测?x必须等于“¢”,还是说存在其他可能的类型?我试图从“x =::= x x($)”开始反向推导出“x :: a -> (a -> b) -> b”,但卡住了。
twoply :: (a -> b, a -> c) -> a -> (b, c)
如果我排除使用 undefined :: a
,那么给定类型对我来说是显而易见的。
于是我想出了以下内容:
¢ :: a -> (a ->b) -> b
¢ = flip ($)
具有有趣的特性,即
(¢) ¢ ($) :: a -> (a -> b) -> b
这就引出了我的问题。鉴于“与...具有相同类型”的关系符号“=::=”,是否可以唯一确定x的类型,从语句“x =::= x x($)”中推测?x必须等于“¢”,还是说存在其他可能的类型?我试图从“x =::= x x($)”开始反向推导出“x :: a -> (a -> b) -> b”,但卡住了。
flip id
是你的¢
的等效定义,这使得你所指出的属性的原因更加明显(至少对我来说是这样)。 - Travis Brownid :: a -> a
在函数上的特殊化等价于($) :: (a -> b) -> (a -> b)
。泛型编程真是太棒了! - C. A. McCann