我后来写了一个LISP函数,它将符号的嵌套列表与其他列表相匹配。它的工作原理如下:
(match '(a b c) '(1 2 3))
=> ((a 1) (b 2) (c 3))
(match '(a b (c d)) '(1 (2 3) (4 5)))
=> ((a 1) (b (2 3)) (c 4) (d 5))
我现在正试图在Haskell中实现类似的功能。我正在寻找的是允许在索引结果时使用可读符号的东西。我可以使用整数,但涉及的列表往往有点不可读。在Haskell中有类似的简单符号吗?
我遇到过Data.Atom.Simple,我只是想要一些不那么尴尬的东西。
答案 0 :(得分:1)
我对lisp知之甚少,所以我不知道你是在设置变量还是创建一个关联数组。
你可以这样做 - 设置变量:
Main Data.Tree> let (Node a ((Node b []):c:[])) = Node 'a' [Node 'b' [],Node 'c' []]
*Main Data.Tree> a
'a'
*Main Data.Tree> b
'b'
*Main Data.Tree> c
Node {rootLabel = 'c', subForest = []}
但老实说我不推荐 - 列表上的匹配是非常不安全的,就我的知识而言,我不知道“安全”模式匹配会导致Maybe x
。
如果你想拥有一个关联数组,你可以使用像这样的函数
aux :: Ord k => Tree k -> Tree v -> Map k v
aux a b = fromList (go a b)
where go :: Tree k -> Tree v -> [(k,v)]
go (Node k kk) (Node v vv) = (k,v):(concat $ zipWith go kk vv)
注意:此功能仅在这些树具有相同结构时才有效
atree = Node 'a' [Node 'b' [],Node 'c' []]
btree = Node 1 [Node 2 [],Node 3 []]
ctree = Node 1 [Node 2 [],Node 3 [], Node 4 []]
GHCi> aux atree btree
fromList [('a','1'),('b','2'),('c','3')]
GHCi> aux atree ctree
fromList [('a','1'),('b','2'),('c','3')]
所以你看到这个功能会关闭Node 4 []
。
答案 1 :(得分:0)
正如其他人已经注意到的那样,Haskell是严格打字的。因此,列表不能保留任意列表结构而不在类型中反映它。在你澄清之前,我会选择最简单的案例。我们假设我们有以下
a :: [String]
a = ["a", "b", "c"]
b :: [Integer]
b = [1, 2, 3]
match = zip
match a b == [("a",1),("b",2),("c",3)]
根据您实际想要使用的类型,请查看通常提供的zip功能。