Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中数列的成对距离_Haskell_Combinatorics - Fatal编程技术网

Haskell中数列的成对距离

Haskell中数列的成对距离,haskell,combinatorics,Haskell,Combinatorics,如果X是一组数字,那么ΔX是一组数字,表示每两个数字之间的成对减法。例如,如果X是直线上按递增顺序排列的一组点,则ΔX是这些点之间成对距离的多集。如何编写一个函数来返回数字列表的成对距离?下面的方法可行,但我需要一个更优雅的解决方案。请包括理论或直觉,如果可能的话,这些理论或直觉可能会提供如何解决类似问题的见解 pairwise_distances :: [Int] -> [Int] pairwise_distances [] = [] pairwise_distances [x] = [

如果
X
是一组数字,那么
ΔX
是一组数字,表示每两个数字之间的成对减法。例如,如果
X
是直线上按递增顺序排列的一组点,则
ΔX
是这些点之间成对距离的多集。如何编写一个函数来返回数字列表的成对距离?下面的方法可行,但我需要一个更优雅的解决方案。请包括理论或直觉,如果可能的话,这些理论或直觉可能会提供如何解决类似问题的见解

pairwise_distances :: [Int] -> [Int]
pairwise_distances [] = []
pairwise_distances [x] = []
pairwise_distances (x:xs) = sort $ map (abs . (x-)) xs ++ pairwise_distances xs

pairwise_distances [3,2,1] -- [1,1,2]
pairwise_distances [0,2,4,7,10] -- [2,2,3,3,4,5,6,7,8,10]

一种选择是将成对列表的生成与差异计算分开

abs_distance x y = abs (x - y)

pairs []     = []
pairs (x:xs) = map (\y -> (x,y)) xs ++ pairs xs
-- or, with TupleSections enabled,
-- pairs (x:xs) = map (x,) xs ++ pairs xs
这样你就可以写作了

pairwise_distances = sort . map (uncurry abs_distance) . pairs 

这当然更干净(而且,我会说,更优雅),尽管它可能不是你想要的那种优雅。

distance xs=sort[y-x |(x:ys)它的拼写和听起来一样

distances xs = sort [ y - x | (x:ys) <- tails (sort xs), y <- ys ]
 f xs = [x-x' | x <- xs, x' <- xs]
fxs=[x-x'| x
f xs = [abs(x-x') | x <- xs, x' <- xs]

f xs = [x-x' | x <- xs, x' <- xs, x>x']