Haskell 哈斯克尔。我对这个代码片段的工作原理感到困惑

Haskell 哈斯克尔。我对这个代码片段的工作原理感到困惑,haskell,Haskell,这应该是将列表中的每个元素平方,然后取它们的和,然后取平方根。很公平,但是当这个递归函数只向列表xs添加x时,它是如何工作的呢 但是,当这个递归函数只将x添加到列表xs中时,它是如何工作的呢 x是列表的头部(第一个元素),它在尾部使用递归xs 例如,对于一个列表[1,4,2,5],它通过以下方式获得总和: magnitude :: Floating a => [a] -> a magnitude = sqrt . mag where mag [] = 0 mag

这应该是将列表中的每个元素平方,然后取它们的和,然后取平方根。很公平,但是当这个递归函数只向列表xs添加x时,它是如何工作的呢

但是,当这个递归函数只将
x
添加到列表
xs
中时,它是如何工作的呢

x
是列表的头部(第一个元素),它在尾部使用递归
xs

例如,对于一个列表
[1,4,2,5]
,它通过以下方式获得总和:

magnitude :: Floating a => [a] -> a
magnitude = sqrt . mag
  where mag [] = 0
        mag (x:xs) = x^2 + mag xs
量级
定义为
sqrt。mag
,这相当于
\x->sqrt(mag x)
。这意味着我们首先用
mag x
计算
x
的平方和,然后计算结果的平方根

这应该是将列表中的每个元素平方,然后取它们的和

这是通过本地函数,
mag
完成的

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
如果列表为空,则平方和为0。如果非空,则为第一个元素的平方加上列表其余元素的平方和

然后取平方根

这是通过
幅度
实现的。其定义相当于

mag [] = 0
mag (x:xs) = x^2 + mag xs
但是我们使用函数组合,

magnitude xs = sqrt (mag xs)
和无点样式(省略
xs
,因为它同时出现在左侧和右侧)以简洁起见

magnitude xs = (sqrt.mag) xs
x
是列表的头部(第一个元素),它在尾部使用递归
xs
magnitude = sqrt.mag