haskell - Haskell 中函数的类型签名

标签 haskell

我在 haskell 中定义了三个函数,将两个数字相乘

k = \x y -> x * y

foo y = \x -> x * y

bar x = \x -> x * x

但是我得到了所有三个函数的不同签名。

λ> :t k
k :: Integer -> Integer -> Integer
λ> :t foo
foo :: Num a => a -> a -> a
λ> :t bar
bar :: Num a => t -> a -> a

有人能解释一下为什么会这样吗?我可以在 bar 的类型签名中看到 t 。它与正常使用 a、b 或 a1、a2 等有什么不同

最佳答案

首先:所有签名基本上都来自 (*)::Num a => a -> a -> a 以及您对它的使用。是的,kfoo 应该是相同的,但是 bar 确实与您在此处编写的有所不同。

  • foo 应该是显而易见的(我希望)(只是 * 是多态的,并且类型说明了这一点)
  • 对于bar来说,这是因为左侧的x右侧上没有使用,所以你得到了额外的参数 t - 与 bar y =\x -> x * x
  • 相同
  • 对于k,请参阅 Monomorphism restriction - 基本上 Haskell 会在此处拉出默认类型来解决可能出现的一些小问题。你在这里得到它有点奇怪,因为默认情况下较新的 GHCi 版本不应显示此行为(请参阅链接)
<小时/>

顺便说一句:不要对类型的名称太好奇;)

吸取的教训可能应该是写下你的签名(至少在顶级函数上)^^ - 它会解决你所有的问题

关于haskell - Haskell 中函数的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251072/

相关文章:

haskell - 将 literate Haskell (.lhs) 转换为 Haskell (.hs)

haskell - 使用 'stack build --profile' 时出现依赖性问题?

haskell - 如何在 Haskell 中重复执行 IO 命令?

multithreading - 如何避免长时间运行的并行和并发 Haskell 计算的性能下降

haskell - put 命令在使用 State monad 的典型函数中执行什么操作?

Haskell 将 Int 与 Int 混淆 -> Int

haskell - 如何在haskell中获取一元运算符 '-'的类型

Haskell:如何生成两种简单代数数据类型的笛卡尔积

haskell - Haskell 和 Idris : Reflection of Runtime/Compiletime in the type universes 之间的区别

haskell - OCaml 有融合定律吗