我有一个元组与同一类型的两个部分和一个Int。
之间的映射Map (a,a) Int
独立于元组中as
的排序,我希望以后能够将其从地图中删除。
lookup (2,1) map == lookup (1,2) map
这可以在没有插入元组两次的情况下实现吗?
答案 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