magnitude :: Floating a => [a] -> a
magnitude = sqrt . mag
where mag [] = 0
mag (x:xs) = x^2 + mag xs
Run Code Online (Sandbox Code Playgroud)
这应该对列表中的每个元素进行平方,然后取它们的总和,然后取平方根。很公平,但是当它只将 x 添加到列表 xs 时,这个递归函数是如何工作的?
但是这个递归函数是如何工作的,当它只添加
x到列表中时xs?
x是列表的头部(第一个元素),它在尾部使用递归xs。
因此,例如对于 list [1,4,2,5],它通过以下方式获得总和:
mag [1,4,2,5]
= 1 ^ 2 + mag [4,2,5]
= 1 + mag [4,2,5]
= 1 + (4 ^ 2 + mag [2,5])
= 1 + (16 + mag [2,5])
= 1 + (16 + (2 ^ 2 + mag [5]))
= 1 + (16 + (4 + mag [5]))
= 1 + (16 + (4 + (5 ^ 2 + mag [])))
= 1 + (16 + (4 + (25 + mag [])))
= 1 + (16 + (4 + (25 + 0)))
= 1 + (16 + (4 + 25))
= 1 + (16 + 29)
= 1 + 45
= 46
Run Code Online (Sandbox Code Playgroud)
在magnitude被定义为sqrt . mag,这相当于\x -> sqrt (mag x)。这意味着我们首先计算 的平方x和mag x,然后计算该结果的平方根。