您需要学习使用 Haskell 的函数式编程中的一个基本概念是,函数只是一种值,定义只是命名事物。它不像程序语言那样在函数和变量之间有明显的区别,并且函数定义与变量定义完全不同。
所以像这样的变量定义
addOne :: Int -> Int
addOne = add 1
只是为表达式添加了一个名称add 1
,因此您可以将其称为addOne
. 它与变量声明相同。[1] 从 Haskell 的角度来看,该变量的值是一个函数这一事实几乎是偶然的。
你的add
定义:
add :: Int -> (Int -> Int)
add x y = x + y
也是一个变量定义。这是 Haskell 提供的一些语法糖:
add :: Int -> Int -> Int
add = \ x -> \ y -> x + y
基于更容易阅读的理论。但它仍然只是糖;您永远不需要它(见下文 [1] 除外),就像使用其他语言一样。
[1]:可怕的单态性限制也在这里发挥作用。这个想法很简单:在函数定义中,RHS 将被计算机执行多次(与您调用函数一样多次)。您可能从其他语言中知道这一点。在单态变量定义中,RHS 最多会执行一次,这也类似于其他语言的工作方式。但是,多态变量通常最终会像函数定义一样执行,RHS 的执行次数与访问变量值的次数一样多。所以 Haskell 不允许多态定义,除非你有一个多态类型签名(所以你说“我知道我在做什么,允许这个变量是多态的”)或者你在左侧有参数(所以它“看起来像“RHS应该执行多次)。