【发布时间】:2019-12-28 05:42:01
【问题描述】:
假设你有一个函数 f,它的用法如下:
(f f (x-1))
你能推断出 f 的类型吗?
好像是递归的,即f :: (ftype) -> int -> int。
【问题讨论】:
-
对,我认为该表达式在当前的 Haskell 中不可能有效。
-
@Ry 为什么不呢?对我来说似乎有效。
-
@RobinZigmond 除非
f是多态的,并且编译器隐式添加了一些类型参数,否则您不能将f应用于自身并具有要键入的表达式。你需要类似递归类型的东西来包装f,比如newtype。否则你会得到f :: T -> U和f f触发T ~ T -> U被拒绝,因为在“发生检查”步骤中统一失败,因为它会产生无限类型。 (同样,像f = id这样的多态函数可以使f f被键入,因为每个f实际上是一个不同的实例化。) -
@chi - 公平点,我认为出于某种原因我将表达式误读为 f (f (x - 1)) ,这当然是非常不同的。但即使如您自己指出的那样,它也适用于某些多态函数
f,所以我仍然会质疑“该表达式在当前 Haskell 中(不可能)有效”的说法。