Dictionary 通过使用Haskell中的Data.Map来查找键的值

Dictionary 通过使用Haskell中的Data.Map来查找键的值,dictionary,haskell,graph,functional-programming,non-exhaustive-patterns,Dictionary,Haskell,Graph,Functional Programming,Non Exhaustive Patterns,我几周前才开始使用Haskell,在这种情况下,我缺乏解决函数的想象力 所以我试图在Haskell实现的图中找到顶点的前导 我的图表: -- | A directed graph data Graph v = Graph { arcsMap :: Map v [v] -- A map associating a vertex with its successors , labelMap :: Map v String -- The Graphviz label of ea

我几周前才开始使用Haskell,在这种情况下,我缺乏解决函数的想象力

所以我试图在Haskell实现的图中找到顶点的前导

我的图表:

-- | A directed graph
data Graph v = Graph
    { arcsMap :: Map v [v]     -- A map associating a vertex with its successors
    , labelMap :: Map v String -- The Graphviz label of each node
    , styleMap :: Map v String -- The Graphviz style of each node
    }
函数
后继函数

-- | Returns the successors of a vertex in a graph in ascending order
--
-- We say that `v` is a successor of `u` in a graph `G` if the arc `(u,v)`
-- belongs to `G`.
-- Note: Returns the empty list if the vertex does not belong to the graph.
successors :: Ord v => v -> Graph v -> [v]
successors v (Graph arcs _ _) = findWithDefault [] v arcs
以及我目前正在尝试解决的函数:

-- | Returns the predecessors of a vertex in a graph in ascending order
--
-- We say that `u` is a predecessor of `v` in a graph `G` if the arc `(u,v)`
-- belongs to `G`.
-- Note: Returns the empty list if the vertex does not belong to the graph.
predecessors :: Ord v => v -> Graph v -> [v]
predecessors v  (Graph arcs _ _) = 
     map (fst)  (filter (\(x,[y]) -> elem v [y]) (assocs arcs) ) 
我需要找到一种方法,通过获取这些顶点的值(后续值)来获取关键点(顶点)。例如:

-- >>> predecessors 3 $ addArcs emptyGraph [(1,2),(2,3),(1,3)]
-- [1,2]
但当我运行该行时,我得到了lambda中的非穷举模式

这是什么?我该如何修复它? 谢谢大家!

  • 编辑:没关系,我改正了,但我还是不太明白,哈哈

Haskell的映射和Hashmap没有有效的键查找。你能做的最好的是O(n),你必须自己写。我的项目中有类似的内容,我们可以对其进行编辑以查找所有关键点:

lookupKey::Eq v=>v->Map.Map k v->[k]
lookupKey val=Map.foldrWithKey go[]其中
找到go键值=
如果值==val
然后瓦尔:找到了
其他发现

如果使用严格映射,可能需要使用严格折叠。

Haskell的映射和Hashmap没有有效的键查找。你能做的最好的是O(n),你必须自己写。我的项目中有类似的内容,我们可以对其进行编辑以查找所有关键点:

lookupKey::Eq v=>v->Map.Map k v->[k]
lookupKey val=Map.foldrWithKey go[]其中
找到go键值=
如果值==val
然后瓦尔:找到了
其他发现

如果使用严格映射,则可能需要使用严格折叠。

可能需要使用
assocs
函数将
Map
更改为键/值列表列表,然后查找对中的第二个元素。只是一个提示,如:
map fst。filter(==3.snd)
Ahhh我刚找到assocs函数:O(n)。以升序键顺序返回映射中的所有键/值对。但我还不习惯这种情况。@assembly.jc我试过了,但我的语法显然是错误的
v(Graph arcs uu)=map(fst)(filter(snd==v)(assocs arcs))
snd
是一个函数,不能用来立即比较值
v
,它需要用函数
(==v)
像(==v)这样组合.snd)。或lambda form
(\p->snd p==v)
@assembly.jc此函数已编译:
前置v(曲线弧)\=map(fst)(过滤器(\(x[y])->elem v[y])(关联弧))
但当我尝试运行
前置3$addArcs emptyGraph[(1,2)、(2,3)、(1,3)]
它告诉我:lambday中的非穷举模式您可能需要使用
assocs
函数将
Map
更改为键/值列表列表,然后找到该对中的第二个元素。只是一个提示,如:
map fst。filter(==3.snd)
Ahhh我刚找到assocs函数:O(n)。以升序键顺序返回映射中的所有键/值对。但我还不习惯这种情况。@assembly.jc我试过了,但我的语法显然是错误的
v(Graph arcs uu)=map(fst)(filter(snd==v)(assocs arcs))
snd
是一个函数,不能用来立即比较值
v
,它需要用函数
(==v)
像(==v)这样组合.snd)。或lambda form
(\p->snd p==v)
@assembly.jc此函数已编译:
前置v(图弧)=map(fst)(过滤器(\(x[y])->elem v[y])(关联弧))
但当我尝试运行
前置3$addArcs emptyGraph[(1,2)、(2,3)、(1,3)]
时,它告诉我:lambda中的非穷尽模式