【发布时间】:2014-07-08 02:33:17
【问题描述】:
我想写这样的东西:
f :: (a -> b) -> a -> c -> b
f g =
let inner :: a -> c -> b
inner x y = g x
in inner
但这给了我一个错误。因为它无法识别我正在尝试引用与声明中相同的“a”和“b”类型作为 f
我怎样才能明确地为内部指定正确的类型?
【问题讨论】:
-
您需要扩展名
ScopedTypeVariables,并且您可能还需要在您的签名中添加明确的forall a b c .。 -
在这种特殊情况下,您实际上不需要内部类型签名,您甚至可以选择以
f g = const . g(甚至f = (const .))的形式编写函数以获得相同的行为.你甚至不需要外部类型签名,GHC 用const . g正确推断它。 -
@bheklilr,类型签名是很好的文档。如果有问题的程序员认为有一个有助于澄清事情,那么这是一个很好的理由加入。
-
@dfeuer 当然,我总是将类型签名放在代码中的顶级函数上,但我的意思是,编译此代码根本不需要类型签名。 ScopedTypeVariables 是不必要的,因为编译器可以从定义中完全推断出类型。
标签: haskell typechecking nested-function