我是haskell的新手,我必须做一个函数,它接受一个列表并递归计算距离。
For example:
distance [(0,0),(2,0),(2,5)]
->7
distance [(1,1),(3,4)]
->3.6055512
我把两点之间的距离变成这样
distance (x1 , y1) (x2 , y2) = sqrt
(x'*x' + y'*y')
where
x' = x1 - x2
y' = y1 - y2
但是不知道如何使用可变列表大小来处理它,谢谢
最佳答案
我们可以将此函数重命名为 distance2
以指定它计算两点之间的距离:
distance2 :: Floating a => (a, a) -> (a, a) -> a
distance2 (x1 , y1) (x2 , y2) = sqrt (x'*x' + y'*y')
where x' = x1 - x2
y' = y1 - y2
接下来我们可以使用
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
来同时迭代两个列表,并对元素应用一个函数。在这里,我们遍历列表及其尾部。因此,这将生成一个距离列表。我们可以利用 sum :: (Num a, Foldable f) => f a -> a
来总结这些距离:distance2 :: Floating a => [(a, a)] -> a
distance [] = 0
distance xa@(_:xs) = sum (zipWith distance2 xa xs)
关于haskell - Haskell 上点之间的距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58428283/