Haskell函数的类型签名

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 -&g

我在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

有人能解释为什么会这样吗?我能在酒吧里看到t字签名。它与a、b或a1、a2等的正常用法不同吗?首先:所有签名基本上都来自
(*)::Num a=>a->a->a
,以及您对它的用法。是的
k
foo
应该是相同的,但是
bar
确实与您在这里写的有所不同

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

顺便说一句:不要对类型的名称感到奇怪;)

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