我想写一些类似的东西:
f :: (a -> b) -> a -> c -> b
f g =
let inner :: a -> c -> b
inner x y = g x
in inner
但这给了我一个错误。因为它不承认我正在尝试引用与声明中相同的“a”和“b”类型作为 f
我怎样才能明确地为内部提供正确的类型?
我想写一些类似的东西:
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 .
您的签名中添加一个显式,它表示为定义的整个范围绑定变量。
{-# 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
一种方法是通过在内部设置 ga 参数来绑定外部和内部类型,就像这样......
f g =
let inner :: (a->b)->a -> c -> b
inner g x y = g x
in inner g
不过,这确实会稍微改变您的结构......并且可能首先否定了拥有内部 let 的原因,但在许多情况下(取决于更大的程序)这可能会有所帮助。