学习Haskell语法

时间:2017-09-04 18:37:26

标签: haskell syntax

我学习Haskell,但却陷入了困境:

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

此函数通过向第一个参数添加1并从第二个参数减去1来向另一个参数添加一个参数。

*Main> add 4 2
6

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

谢谢!

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

2 个答案:

答案 0 :(得分:7)

Haskell中的所有函数都是curry,这意味着它们实际上只接受一个参数。当函数有两个参数时,例如(f a) b实际发生的是f ab正在返回一个函数,然后将其应用于add 4

因此add(3) . (+1)(+1)相同。 .是一个函数的语法,它接受输入并将其加1。 (f . g) x是一种组合函数的方式:f (g x)add(3) . (+1)相同。所以add(3)首先在其参数中加1,然后在结果上调用add(3)

然后将

add(2) . (+1)扩展为add 0,并以递归方式继续,直至id,其结果为idadd 0 x是身份函数,只返回传递给它的任何内容。因此id x xclass Database { public $conn; public $connStatus; public function __construct() { echo "Hi There, I am a database! <br><br>"; $this->conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if($this->conn->connect_errno) { echo "Bad Connection using connect_errno method <br/>"; } else { echo "Good Connection using connect_errno method <br/>"; } if ($this->conn == false) { echo "Bad Connection using db==false method <br/>"; } else { echo "Good Connection using db==false method <br/>"; } } }

答案 1 :(得分:5)

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

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是一种特殊语法 并代表{{1}}。