Haskell - 类似Lisp的符号功能

时间:2016-01-15 20:57:30

标签: haskell lisp symbols

我后来写了一个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,我只是想要一些不那么尴尬的东西。

2 个答案:

答案 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功能。