编辑:我刚刚意识到这根本不能解决问题,除了包含集合中每个条目的列表(即获得(a,e)
和(b,d)
的比较值无济于事如果列表不包含e,但确实包含f)的话。 DERP。也就是说,Haskell中有序但非数字集的距离比较问题仍然很有趣,所以...
我必须写一个函数
pairs :: Ord a => [a] -> [(a,a)]
从列表中返回所有对(x i ,x j ),其中x i < x j ,i<学家
这与列表推导相当简单。现在,我需要它排序,我需要它按元组的“顺序”排序。也就是说,组合顺序 - (a,z)需要在(b,c)之后走很长的路。对于整数,这很容易 - 将x i 添加到x j 并将其用于比较。
然而,这已超过Ord
,所以这个函数必须采用像chars这样令人讨厌的东西,而在Haskell中,我所知道的只有GT
,LT
或{ {1}} - 不是多少EQ
。有没有办法让Haskell说出来
GT
大于Z
或类似的东西?或者关于如何对此进行排序的任何其他想法?
(实际任务涉及完成谓词,对于作为另一个列表A
的前缀的任何列表xs
,ys
是pairs xs
的前缀。我我只是觉得在生成它之后对列表进行排序可能就是这样.EDIT2:通过向后迭代列表来解决它,对于那些想知道的人。)
答案 0 :(得分:3)
这种排序不可能存在。不只是在Haskell,而是在任何地方 - 它在数学上是不可能的!
通过严格排序元组,您基本上创建了二维域和一维域之间的映射。这需要是双射的,以保持秩序公理。然后你谈论距离,在这种情况下是一个拓扑属性,并且总是类似于将实线mapping映射到2D平面ℝ 2 的问题。 这种双射exist,但是映射及其反转都是连续的(这对于保持任何一致意义上的距离是必要的)是不可能的。
所以你想要的是无法实现的。