Haskell 哈斯克尔。我对这个代码片段的工作原理感到困惑
这应该是将列表中的每个元素平方,然后取它们的和,然后取平方根。很公平,但是当这个递归函数只向列表xs添加x时,它是如何工作的呢 但是,当这个递归函数只将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
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