Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从数据类型中的映射中提取关键帧_Haskell - Fatal编程技术网

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)
的方式。请注意,使用会更简单,但如果事先不存在键,它会在映射中插入键,这可能不是您想要的。