我只是想知道,遞歸例如:哈斯克爾::斗拱的遞歸
squaresRec :: [Double] -> [Double]
squaresRec [] = []
squaresRec (x:xs) = x*x : squaresRec xs
爲什麼在遞歸的情況下,沒有括號?它不應該是這樣的:
squaresRec :: [Double] -> [Double]
squaresRec [] = []
squaresRec [x:xs] = x*x : squaresRec xs
我知道這是行不通的。但只是想知道背後的解釋。
我認爲它代表一個元組和一個列表,我對(1,2,3)與[1,2,3]的使用相混淆。 我確實認爲爲什麼不這樣做[(x:xs)]?它是一個不爲空[]的列表,但列表以x開始,其餘爲xs。 –
你可以寫'[(x:xs)]',但括號在那裏沒有任何區別。一般來說,括號隻影響代碼的_parsed_,但[']'已經將一切內容解析到一個AST節點中,所以不管你寫'[x:xs]'還是'[(x :(xs)]'或甚至類似'(([((((x):((xs)))))]))''。方括號OTOH確實有所作爲,即它們觸發語法解析。 '[x:xs]'是'(x:xs):[]'的糖,而'x:xs'已經脫糖。 – leftaroundabout
括號不是元組的構造函數。他們在這裏隔離幾個','(逗號),它們是真正的元組構造者 – Uniaika