Haskell函数的类型签名
我在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
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
- 有关
的信息,请参阅-基本上Haskell将在此处拉取一个默认类型,以解决可能出现的一些小问题。您在这里看到它有点奇怪,因为默认情况下,较新的GHCi版本不应显示此行为(请参阅链接)k
顺便说一句:不要对类型的名称感到奇怪;) 吸取的教训应该是只写下你的签名(至少在顶级函数上)^^-这会解决你所有的问题