2017-09-04 82 views
1

我学习哈斯克尔,但卡住了一两件事:加入1至第一个参数和第二个参数中减去1学习Haskell语法

add 0 = id 
add x = add(x-1) . (+1) 

该函数添加一个参数到另一个。

*Main> add 4 2 
6 

但是,我真的不明白它是如何工作的!任何人都可以解释为什么我们在'add'后写两个数字(虽然只用一个参数'x'来描述),''是什么。和'(+1)'在第二行意味着什么和所有这些工作?

谢谢!

UPD:再次感谢所有答案!现在我明白它是如何工作的:)

回答

7

Haskell中的所有函数都是curried的,这意味着它们实际上只取一个参数。当函数采用两个参数时,如f a b实际发生的是(f a) bf a正在返回一个函数,然后将其应用于b。因此add 4add(3) . (+1)相同。 (+1)是接受其输入并将1加1的函数的语法。 .是组成函数的一种方式:(f . g) xf (g x)相同。因此,add(3) . (+1)首先将其参数加1,然后对结果调用add(3)

add(3)然后扩大到add(2) . (+1)了,这样下去直到递归add 0,其计算结果为idid是身份函数,它只是返回您传递给它的任何内容。所以add 0 xid xx

+6

是的。尽管如此,请不要编写'f(x)'样式函数应用程序,也不要编写数字参数 - 它只是让人困惑。 – leftaroundabout

5

我喜欢亚历克的回答。通常当我看到这些类型的代码时,我在这些步骤中操纵它们。原代码:

add 0 = id 
add x = add(x-1) . (+1) 

让我们把它翻译成更简单的形式:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = add (num1 - 1) . (\num2 -> num2 + 1) 

更容易翻译:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = \num3 -> add (num1 - 1) ((\num2 -> num2 + 1) num3) 

另一个转换:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = \num3 -> add (num1 - 1) (num3 + 1) 

最终转化:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 num3 = add (num1 - 1) (num3 + 1) 

.是一个函数组合运算符。 (+1)是一种特殊的语法 并且代表\x -> x + 1