我学习Haskell,但却陷入了困境:
add 0 = id
add x = add(x-1) . (+1)
Run Code Online (Sandbox Code Playgroud)
此函数通过向第一个参数添加1并从第二个参数减去1来向另一个参数添加一个参数.
*Main> add 4 2
6
Run Code Online (Sandbox Code Playgroud)
但是,我真的不明白它是如何工作的!任何人都可以解释为什么我们在'add'之后写了2个数字(虽然只用一个参数'x'来描述),'.'是什么?并且第二行中的'(+1)'表示所有这些都有效吗?
谢谢!
UPD:再次感谢所有答案!现在我明白它是如何工作的:)
Haskell中的所有函数都是curry,这意味着它们实际上只接受一个参数.当函数有两个参数时,比如f a b实际发生的是(f a) b:f a返回一个随后应用的函数b.
所以add 4是一样的add(3) . (+1).(+1)是一个函数的语法,它接受输入并将其加1.这.是一种组合功能的方式:(f . g) x与...相同f (g x).所以add(3) . (+1)首先在其参数中加1,然后调用add(3)结果.
add(3)然后扩展为add(2) . (+1),并且递归地继续,直到add 0评估为id.id是身份函数,只返回传递给它的任何东西.所以add 0 xIS id x是x.
我喜欢亚历克的回答.通常当我看到这些类型的代码时,我会在这些步骤中操作它们.原始代码:
add 0 = id
add x = add(x-1) . (+1)
Run Code Online (Sandbox Code Playgroud)
让我们把它翻译成一个更简单的形式:
add :: Int -> Int -> Int
add 0 num = id num
add num1 = add (num1 - 1) . (\num2 -> num2 + 1)
Run Code Online (Sandbox Code Playgroud)
更容易翻译:
add :: Int -> Int -> Int
add 0 num = id num
add num1 = \num3 -> add (num1 - 1) ((\num2 -> num2 + 1) num3)
Run Code Online (Sandbox Code Playgroud)
另一个转变:
add :: Int -> Int -> Int
add 0 num = id num
add num1 = \num3 -> add (num1 - 1) (num3 + 1)
Run Code Online (Sandbox Code Playgroud)
最终转型:
add :: Int -> Int -> Int
add 0 num = id num
add num1 num3 = add (num1 - 1) (num3 + 1)
Run Code Online (Sandbox Code Playgroud)
这.是一个函数组合运算符.(+1)是一种特殊的语法并代表\x -> x + 1.