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)
一种方法是通过在内部制作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的原因,但在很多情况下(取决于更大的程序)这可能会有所帮助.