我对哈斯克尔很新。我想以递归方式访问Hashmap的所有值并将它们存储在List中。
我的Hashmap看起来像:
data Hashmap k v = Leaf | Node (Hashmap k v) (k, v) (Hashmap k v) deriving (Show)
我尝试过的功能签名是:
createList :: Hashmap k v -> [(k,v)]
我的测试结果"散列映射:
Node (Node Leaf (1,34) Leaf) (2,65) (Node Leaf (3,21) Leaf)
将是:
[(1,34),(2,65),(3,21)]
非常感谢你的帮助!
答案 0 :(得分:3)
IMO,haskell中的函数是带有动作的模式列表。正如您所看到createList
类型为Hashmap k v -> [(k,v)]
,请检查Hashmap
的定义,它有两个值构造函数,因此有两种模式,您只需要处理它们。< / p>
createList :: Hashmap k v -> [(k, v)]
createList Leaf = []
createList (Node l c r) = createList l ++ [c] ++ createList r
由于++
效率低下,我们也可以使用利弊:
加速。
list :: Hashmap k v -> [(k, v)]
list h = _list h []
where
_list Leaf xs = xs
_list (Node l c r) xs = c : (_list l $ _list r xs)