使用一元函数定义加法并在Haskell中进行curry?

时间:2014-03-11 06:52:07

标签: haskell currying

我是一个Haskell初学者试图理解currying。 我已经看过应该展示它的例子,但是它们涉及二元运算符,它们本身就是咖喱,让我的思绪陷入无限递归。 如果Haskell中的运算符是函数,并且所有函数都是一元函数和curry,我是否可以仅根据一元函数定义自己的加法函数?

3 个答案:

答案 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

即该函数中不传递任何参数。