我想写一些类似的东西:
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 .
到您的签名,这表明为定义的整个范围绑定(bind)变量。
{-# LANGUAGE ScopedTypeVariables #-}
f :: forall a b c . (a -> b) -> a -> c -> b
f g =
let inner :: a -> c -> b
inner x y = g x
in inner
关于haskell - 如何声明在 let 中定义的函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749488/