9

我想写一些类似的东西:

f :: (a -> b) -> a -> c -> b
f g =
   let inner :: a -> c -> b
       inner x y = g x
   in inner

但这给了我一个错误。因为它不承认我正在尝试引用与声明中相同的“a”和“b”类型作为 f

我怎样才能明确地为内部提供正确的类型?

4

2 回答 2

17

您将需要扩展名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
于 2014-05-20T01:17:37.967 回答
5

一种方法是通过在内部设置 ga 参数来绑定外部和内部类型,就像这样......

f g =
   let inner :: (a->b)->a -> c -> b
       inner g x y = g x
   in inner g

不过,这确实会稍微改变您的结构......并且可能首先否定了拥有内部 let 的原因,但在许多情况下(取决于更大的程序)这可能会有所帮助。

于 2014-05-20T01:22:41.003 回答