[英]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.