Haskell 从数据类型中的映射中提取关键帧
我试图在一个包含许多字段的数据类型中返回具有特定Haskell 从数据类型中的映射中提取关键帧,haskell,Haskell,我试图在一个包含许多字段的数据类型中返回具有特定状态的键。我尝试了一些东西,但什么都没有!有人给我小费吗 data Configuration v = Configuration { configurationMap :: Map.Map v Status, configurationGraph :: Graph v } verticesByStatus :: Ord v => Status -> Configuration v -> [v] verticesByStat
状态的键。我尝试了一些东西,但什么都没有!有人给我小费吗
data Configuration v = Configuration {
configurationMap :: Map.Map v Status,
configurationGraph :: Graph v
}
verticesByStatus :: Ord v => Status -> Configuration v -> [v]
verticesByStatus ???
也许有更优雅的方式来表达这一点,但这里有一个解决方案:
verticesByStatus status (Configuration map graph) = fst <$> (filter ((== status) . snd) $ M.assocs map)
表示此函数的另一种方法是通过eta缩减来简化它。一种方法是使用configurationMap
函数提取配置的该部分,而不是模式匹配:
verticesByStatus status = fmap fst . filter ((== status) . snd) . Map.assocs . configurationMap
也许有更优雅的方式来表达这一点,但这里有一个解决方案:
verticesByStatus status (Configuration map graph) = fst <$> (filter ((== status) . snd) $ M.assocs map)
表示此函数的另一种方法是通过eta缩减来简化它。一种方法是使用configurationMap
函数提取配置的该部分,而不是模式匹配:
verticesByStatus status = fmap fst . filter ((== status) . snd) . Map.assocs . configurationMap
Data.Map
中有一个用于映射的选项,可直接与配置映射一起使用:
verticesByStatus :: Ord v => Status -> Configuration v -> [v]
verticesByStatus status = Map.keys . Map.filter (== status) . configurationMap
生成地图中关键点的列表。(如果您想要一个值列表,可以使用Map.elems
,或者等效地使用Data.Foldable
中的toList
。请注意,有点令人困惑的是,后者与Map.toList
不同,后者生成键值对列表,就像jkeuhlen回答中的Map.assocs
)在Data.Map中有一个用于映射的函数,可以直接与配置映射一起使用:
verticesByStatus :: Ord v => Status -> Configuration v -> [v]
verticesByStatus status = Map.keys . Map.filter (== status) . configurationMap
生成地图中关键点的列表。(如果您想要一个值列表,可以使用Map.elems
,或者等效地使用Data.Foldable
中的toList
。请注意,有点令人困惑的是,后者与Map.toList
不同,后者生成键值对列表,就像jkeuhlen回答中的Map.assocs
)
非常感谢!你的答案是完整的!谢谢!你的答案是完整的!就在@duplode之后发布-我会使用他们的解决方案。在上,isJust
/fromJust
,实际上总有比将Maybe
压缩成布尔值而只需依赖部分fromJust
来最终处理它更好的解决方案。模式匹配(与您首选的解决方案一样)是一种改进(值得注意的是列表理解如何无声地处理这里的Nothing
情况);另一种可能是在第二个解决方案中使用maybe
函数而不是if-then-else:maybe-False(=status)vStatus
Awesome@duplode!我没有意识到maybe
函数。就在@duplode之后发布-我会使用他们的解决方案。在上是just
/fromJust
,实际上总有一个比将maybe
压缩成布尔值更好的解决方案,而只需要依赖部分fromJust
来最终处理它。模式匹配(与您首选的解决方案一样)是一种改进(值得注意的是列表理解如何无声地处理这里的Nothing
情况);另一种可能是在第二个解决方案中使用maybe
函数而不是if-then-else:maybe-False(=status)vStatus
Awesome@duplode!我不知道可能函数。我喜欢你的方法,你如何处理updateStatus::Ord v=>v->Status->Configuration v->Configurationv@Phil使用:updateStatus key status config=config{configurationMap=Map.adjust(const status)key(configurationMap config)}
。在这里,const status
只是一种整洁的书写方式(\ \ \ \->status)
。请注意,使用会更简单,但如果它们事先不存在,它会在映射中插入键,这可能不是您想要的。我喜欢您的方法,您将如何处理updateStatus::Ord v=>v->状态->配置v->配置v@Phil使用:updateStatus key status config=config{configurationMap=Map.adjust(const status)key(configurationMap config)}
。在这里,const status
只是一种整洁的编写(\\\\->status)
的方式。请注意,使用会更简单,但如果事先不存在键,它会在映射中插入键,这可能不是您想要的。