如何声明let中定义的函数的类型

dsp*_*pyz 9 haskell typechecking nested-function

我想写一些类似的东西:

f :: (a -> b) -> a -> c -> b
f g =
   let inner :: a -> c -> b
       inner x y = g x
   in inner
Run Code Online (Sandbox Code Playgroud)

但是这给了我一个错误.因为它没有意识到我正在尝试引用与声明中相同的"a"和"b"类型作为f

我怎样才能明确地给出内在的正确类型?

cro*_*eea 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
Run Code Online (Sandbox Code Playgroud)


jam*_*idh 5

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

f g =
   let inner :: (a->b)->a -> c -> b
       inner g x y = g x
   in inner g
Run Code Online (Sandbox Code Playgroud)

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