哈斯克尔。我很困惑这个代码片段是如何工作的

Raf*_*sch 2 haskell

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 时,这个递归函数是如何工作的?

Wil*_*sem 5

但是这个递归函数是如何工作的,当它只添加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)。这意味着我们首先计算 的平方xmag x,然后计算该结果的平方根。