gpt4 book ai didi

haskell - 为什么 Haskell 使用箭头表示函数的类型?

转载 作者:行者123 更新时间:2023-12-04 01:44:23 25 4
gpt4 key购买 nike

我刚开始学习 Haskell,对我来说奇怪的事情之一是具有多个参数的函数类型的语法。

考虑一个简单的例子:

(+) :: Num a => a -> a -> a

为什么我们需要这里所有的箭头?写 Num Num Num -> Num 这样的东西不是更有意义吗? ?

引擎盖下的原因是什么?我搜索了这个问题,但找不到任何真正有用的东西。

最佳答案

令人困惑的第一件事是Num a => ,所以我们现在将完全忽略它。相反,让我们考虑 Int -> Int -> Int ,这是您给出的类型签名的一种可能的特化。

函数几乎总是 curried在 haskell 。这意味着多参数函数实际上是一个参数的函数,它返回一个接受下一个参数的函数,依此类推。
->是右结合,所以 Int -> Int -> IntInt -> (Int -> Int) 相同.

这也意味着这个定义

f :: Int -> Int -> Int
f x y = x + y

是相同的
f :: Int -> Int -> Int
f x = \y -> x + y

事实上,Haskell 中的所有函数都只接受一个参数。元组也存在,但它们是一等公民,因此它们不仅仅是一个参数列表。
Num a =>是类型系统的一个不同方面。它表示类型变量 a必须是 Num 的实例类型类。作为 Num 实例的类型的常见示例包括 IntDouble .所以 Num不是类型本身,它是一个类型类。 Num a =>表示对类型变量 a 的约束,它不是函数的另一个参数。
(+)方法是 Num 的成员类型类,所以你必须约束 a这样才能使用 (+) .如果你尝试给 f签名 a -> a -> a (没有约束),它不会工作,因为 a是完全不受约束的,我们对它可以是什么类型一无所知。结果,我们无法使用 (+)在上面。

关于haskell - 为什么 Haskell 使用箭头表示函数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com