我是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/

10-16 12:31