对不起,这措辞不好,但很难描述。
我想我会跳到这个例子:
add :: Integer -> Integer -> Integer
add x y = x + y
为什么:
:: Integer -> Integer -> Integer
代替:
:: Integer, Integer -> Integer
箭头是“Function type-mapping operator”,不是某种分隔符,不是吗?
最佳答案
因为 curry 。想想这个的类型:
add 3 :: Integer -> Integer
如果你给
add
一个数字,它返回一个映射 Integer
的函数到另一个整数。所以你可以这样做:map (add 3) [1..10]
将参数与部分应用的返回类型区别对待是没有意义的。
编辑澄清
我认为 bheklilr 提出了一个很好的观点,即可以像这样读取类型签名
add :: Integer -> (Integer -> Integer)
我们可以使用更多参数的函数,
zipWith3
因为这是我唯一能真正想到的。zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
如果我们只阅读 this 的作用,它需要一个函数,该函数接受 3 个值并分别返回第四个和 3 个这些值的列表,并返回第四个值的列表。试一试。
add3 :: Int -> Int -> Int -> Int
add3 a b c = a + b + c
Prelude>zipWith3 add3 [1] [2] [3]
[6]
虽然,在这种情况下,所有值的类型都是
Int
它仍然证明了这一点。现在如果我们不给它所有的列表怎么办?如果我们不给它列表只是
add3
.zipWith3 add3 :: [Int] -> [Int] -> [Int] -> [Int]
zipWith3 add3 :: [Int] -> ([Int] -> [Int] -> [Int])
zipWith3 add3 :: [Int] -> [Int] -> ([Int] -> [Int])
所以,现在我们有一个函数,它接受 3 个列表并返回一个列表。但这也是一个接受列表的函数,返回一个接受 2 个列表并返回一个列表的函数。没有办法真正区分它们。
(zipWith3 add3) [1,2] [3,4] [5,6] :: [Int]
(zipWith3 add3) [1,2] :: [Int] -> [Int] -> [Int]
看看我要去哪里?参数和返回类型之间没有区别。
关于haskell - 为什么 Haskell 类型签名声明有多个箭头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459981/