haskell - 为什么 Haskell 类型签名声明有多个箭头?

标签 haskell syntax types

对不起,这措辞不好,但很难描述。

我想我会跳到这个例子:

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/

相关文章:

haskell - 如何编写一个可以序列化/反序列化来自类似 map 结构的任何记录的通用函数?

syntax - 调用 &(x,y) 按位运算符

python - 读取 CSV 文件并确定数据结构

generics - 以通用方式操作 Scala 集合

javascript - ECMAscript 是否提供了构造函数的方法?

haskell - 随机 haskell 错误。计算永远不会结束

c++ - 通过 FFI block 从 Haskell 调用共享库,而从 C 程序链接时则不会

haskell - xmonad: float 窗口的默认大小

haskell - $(美元)和$!之间有什么区别? (美元感叹号)

javascript - 一次性解构对象并重新分配给不同的变量名