1

我正在尝试从 Learn You a Haskell for Great Good 中学习 Haskell。我正在尝试构建一堆函数来执行各种向量操作。我正在构建一个接受两个向量的函数,并找到它们之间的角度。运算如下: A·B = AB cos θ

无论如何,现在我正在尝试编写一个函数来查找向量的“值”。例如,2i + 3j + 4k 的值是 sqrt(2^2 + 3^2 + 4^2)。

向量存储为一个列表,我正在考虑尝试这样的事情:

getValue (vector) = [sqrt v | v <- v + square take 1 vector]

我该怎么做?

4

3 回答 3

3

通常的名称是“规范”,或者更准确地说是“欧几里得规范”。您将组件的平方相加并计算总和的平方根。将向量表示为组件列表,它变为

-- assuming the component type is Double
norm :: Vector -> Double
norm vector = sqrt $ sum [x*x | x <- vector]

或者,map而不是列表理解,

norm vector = sqrt . sum $ map (\x -> x*x) vector

如果你喜欢无点风格,你也可以把后者写成

norm :: Vector -> Double
norm = sqrt . sum . map (\x -> x*x)
于 2012-07-05T17:38:31.847 回答
2

首先定义标量乘法,这本身就很有用。我用作|*|操作员:

(|*|) = (sum .) . zipWith (*)

然后剩下的就很简单了:

norm v = sqrt $ v |*| v
于 2012-07-05T22:17:29.043 回答
1

假设您将向量表示为列表,则:

getValue :: (Floating a) => [a] -> a
getValue = sqrt . sum . map (\i -> i * i)

或者,您可以使用列表推导来对值进行平方:

getValue :: (Floating a) => [a] -> a
getValue vector = sqrt . sum $ [x * x | x <- vector]
于 2012-07-05T17:38:39.207 回答