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

标签 haskell typechecking nested-function

我想写一些类似的东西:

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/

相关文章:

haskell - Haskell 中的复杂数据结构

parsing - Haskell:尽管文件中有更多输入,但解析文件在第一个表达式后完成

python - Python 中类型注释的自引用或前向引用

Javascript 调用嵌套函数

python - 如何在python中的不同文件中导入嵌套函数?

haskell - 哪个应用仿函数用于传递共享参数?

haskell - 如何判断一个 monad 是否可交换?

parsing - 编译器设计: Is "variable not declared" a syntactic error or semantic error?

list - 即使在使用 isInstanceOf 检查类型后,Scala 类型不匹配错误

javascript - 如何在 1-arg javascript 函数中使用 2 个参数?