以无序元组映射为关键

时间:2014-08-13 10:58:52

标签: haskell map tuples

我有一个元组与同一类型的两个部分和一个Int。

之间的映射
Map (a,a) Int

独立于元组中as的排序,我希望以后能够将其从地图中删除。

lookup (2,1) map == lookup (1,2) map

这可以在没有插入元组两次的情况下实现吗?

3 个答案:

答案 0 :(得分:7)

您可以输入密钥(max a b, min a b)

答案 1 :(得分:3)

您可以对元组进行排序,然后使用它来插入元组(并搜索):

sortTup :: (Ord a) => (a, a) -> (a, a)
sortTup (a, b) = (min a b, max a b)

使用它你会看起来像这样:

Prelude Data.Map> let a = Map.fromList [(sortTup (2,1), 5]
Prelude Data.Map> lookup (sortTup (1,2))
5

答案 2 :(得分:2)

你可以试试这个:

import Control.Applicative

mylookup :: (Ord a) => (a,a) -> Map (a,a) Int -> Maybe Int
mylookup (x,y) m = lookup (x,y) m <|> lookup (y,x) m