我只是想知道,对于递归示例:
squaresRec :: [Double] -> [Double]
squaresRec [] = []
squaresRec (x:xs) = x*x : squaresRec xs
Run Code Online (Sandbox Code Playgroud)
为什么在递归的情况下,没有括号?不应该假设是这样的:
squaresRec :: [Double] -> [Double]
squaresRec [] = []
squaresRec [x:xs] = x*x : squaresRec xs
Run Code Online (Sandbox Code Playgroud)
我知道这不行.但只是想知道背后的解释.
[] 匹配空列表.
[1]匹配一个只包含一个元素的列表,该列表必须是一个等于1的数字.请注意,这[1]实际上是语法糖(1:[]),即它真正匹配的是:以数字开头的列表1,后跟一个空的列表......这只是一种复杂的说法"包含单个元素的列表1".
(x:xs)匹配以x,后跟xs(并且可能包含任意数量的元素,可能为零)的列表.即,此模式匹配具有至少一个元素的任何列表.
[x:xs]再配其中包含一个列表正好一个元素,该元素应该匹配模式(x:xs).(即使是类型也没有意义,因为你的列表包含Double--numbers,而不是列表.)