在Haskell中键入函数的签名

时间:2016-02-07 07:50:53

标签: 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

有人可以解释为什么会这样吗?我可以在酒吧的类型签名中看到。它是否与a,b或a1,a2等的正常使用不同

1 个答案:

答案 0 :(得分:6)

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

  • foo应该是显而易见的(我希望)(它只是*是多态的,类型只是说明了)
  • 代表bar,因为左侧的x未在right方面使用,因此您获得额外参数t - 它&# 39;与bar y = \x -> x * x
  • 相同
  • for k请参阅Monomorphism restriction - 基本上Haskell将在此处提取默认类型以解决可能出现的一些轻微问题。你在这里得到它有点奇怪,因为默认情况下较新的GHCi版本不应该显示这种行为(见链接)
顺便说一句:不要对这些类型的名称感到惊讶;)

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