簡體   English   中英

Haskell ::遞歸中使用括號

[英]Haskell :: The Use of Brackets in Recursion

我只是想知道,對於遞歸示例:

squaresRec :: [Double] -> [Double]   
squaresRec [] = []                       
squaresRec (x:xs) = x*x : squaresRec xs

為什么在遞歸的情況下,沒有括號? 它不應該像這樣:

squaresRec :: [Double] -> [Double]   
squaresRec [] = []                       
squaresRec [x:xs] = x*x : squaresRec xs

我知道這行不通。 但只是想知道其背后的解釋。

[]匹配空列表。

[1]匹配僅包含一個元素的列表,該列表必須是等於1的數字。 請注意, [1]實際上是(1:[])語法糖,也就是說,它真正匹配的是:一個以數字1開頭的列表,然后是一個空列表...這只是一種復雜的說法“包含單個元素1的列表”。

(x:xs)匹配以x開頭,后跟xs (並且可以包含任意數量的元素,可能為零)的列表。 即,該模式匹配具有至少一個元素的任何列表。

[x:xs]再次匹配包含恰好一個要素的列表,並且該元素應該匹配圖案(x:xs) (哪怕類型也不有意義,因為您的列表包含Double精度數字,而不是列表。)

我有同樣的問題,因為我來自Erlang。

要了解的是,實際上我們在Erlang中使用的[head | tail]模式是由Haskell中的cons函數(即:運算符)轉換的。 括號只是用來隔離功能參數,就像(3 + 4)一樣。

我知道問“為什么會這樣???”很誘人。 並且從視覺上講更有意義,但是:是我們如何構建(和模式匹配時分開)鏈接列表的開頭和結尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM