【发布时间】:2014-10-06 16:58:51
【问题描述】:
我在一个具有相同类型的两个部分的元组和一个 Int 之间有一个映射。
Map (a,a) Int
独立于元组中as 的顺序,我希望稍后能够将其从地图中取出。
lookup (2,1) map == lookup (1,2) map
如果不插入元组两次,这可能吗?
【问题讨论】:
我在一个具有相同类型的两个部分的元组和一个 Int 之间有一个映射。
Map (a,a) Int
独立于元组中as 的顺序,我希望稍后能够将其从地图中取出。
lookup (2,1) map == lookup (1,2) map
如果不插入元组两次,这可能吗?
【问题讨论】:
您可以将密钥设为(max a b, min a b)。
【讨论】:
您可以对元组进行排序,然后使用它来插入元组(也可以搜索):
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
【讨论】:
你可以试试这个:
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
【讨论】: