我是一个Haskell初学者试图理解currying。 我已经看过应该展示它的例子,但是它们涉及二元运算符,它们本身就是咖喱,让我的思绪陷入无限递归。 如果Haskell中的运算符是函数,并且所有函数都是一元函数和curry,我是否可以仅根据一元函数定义自己的加法函数?
答案 0 :(得分:4)
是
add :: Num a => a -> a -> a
add = \a -> \b -> a + b
这也是一个闭包的例子。 \b -> a + b
可以通过闭包访问a
,因为a是在该lambda范围之外定义的。
修改强>
这些被称为Peano数值
data Nat = Zero | Succ Nat
add Zero = \n -> n
add (Succ a) = \b -> Succ (add a b)
toNat 0 = Zero
toNat n = Succ (toNat (n-1))
fromNat Zero = 0
fromNat (Succ n) = 1 + fromNat n
λ: fromNat $ add (toNat 3) (toNat 4)
7
答案 1 :(得分:2)
haskell中的函数只有在它们看起来是一元的意义上才是一元的
用户。 Haskell语言没有说明这些函数的实现。
对于haskell实现来说,将(+)
实现为a是完全正常的
二进制函数,如果它还提供某种方式来表示像(+) 2
这样的值。平时
这是通过捆绑二进制函数和参数列表2
来完成的。
如果你真的想在一元函数方面实现(+),你可以 做类似的事情:
plus a b
| a > 0 = plus (pred a) (succ b)
| a < 0 = plus (succ a) (pred b)
| otherwise = b
但是,当我更好地理解Haskell(或Haskell实现)时,我认为这并没有给你任何东西。
答案 2 :(得分:1)
如果要使用咖喱添加元组,请使用以下代码:
addPair :: Num a => (a,a) -> a
addPair = \(a ,b) -> a + b
即该函数中不传递任何参数。