1

编辑:我刚刚意识到这根本不会解决问题,除了集合中每个条目的列表(即,如果列表不包含 e,则获得比较值(a,e)并且根本不会帮助我,但是(b,d)确实包含 f)。德普。也就是说,Haskell 中有序但非数字集的距离比较问题仍然是 IMO 有趣的,所以......

我必须写一个函数

pairs :: Ord a => [a] -> [(a,a)]

它从 x i < x j和 i < j的列表中返回所有对 (x i , x j )。

这对于列表推导非常简单。现在,我需要它排序,并且我需要它按元组的“顺序”排序。也就是说,组合顺序 - (a,z) 需要在 (b,c) 之后很长一段时间。对于整数,这很容易 - 将 x i添加到 x j并将其用于比较。

然而,这已经结束了Ord,所以这个函数必须接受像字符这样令人讨厌的东西,而在 Haskell 中,我所知道的只是GT,LTEQ- 而不是多少GT。有没有办法让 Haskell 说

Z大于 25A

或类似的东西?或者关于如何排序的任何其他想法?

(实际任务涉及满足谓词,即对于任何xs作为另一个列表前缀的列表yspairs xs它是 的前缀pairs ys。我只是觉得在生成列表后对列表进行排序可能是要走的路。EDIT2:解决了它通过向后迭代列表,对于那些想知道的人。)

4

1 回答 1

3

这样的排序不可能存在。不仅在 Haskell 中,而且在任何地方——这在数学上是不可能的!

通过严格排序的元组,您基本上是在二维域和一维域之间创建映射。这需要是双射的以保留顺序公理。然后你谈论距离,在这种情况下是一种拓扑属性,并且总是类似于将实线 ℝ 映射到 2D 平面 ℝ<sup>2 的问题。 存在
这样的双射,但映射及其逆映射永远不可能是连续的(这对于在任何一致的意义上保持距离都是必要的)。

所以你想要的是无法实现的。

于 2015-01-21T15:04:20.830 回答