我是 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] https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:zipWith同时迭代两个列表,并对元素应用函数。这里我们迭代列表及其尾部。这将产生一个距离列表。我们可以利用sum :: (Num a, Foldable f) => f a -> a https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:sum总结这些距离:
distance2 :: Floating a => [(a, a)] -> a
distance [] = 0
distance xa@(_:xs) = sum (zipWith distance2 xa xs)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)