Haskell可以匹配S-Expression,就像Racket的匹配一样吗?

时间:2011-06-06 05:18:41

标签: haskell s-expression

我刚开始学习Haskell三天前,目的是为Haskell中的一些自定义语义翻译。我有解释器的Racket实现,关于Racket中S-Expression的match匹配非常方便。说到Haskell,我不太确定是否存在类似的东西? 或者我必须编写一些数据类型并将S-Expressions解析为定义的数据类型,然后在Haskell中使用一些匹配机制?

我想匹配的东西(在球拍中),例如,如果有输入(来自文件或支架输入),如:(lambda (v1 v2) (+ v1 v2)),那么在Racket中,我可以编写如下模式: (lambda (,v ...) ,body)。然后做我想要的事情。 在Haskell中,我可以做类似的事吗?

1 个答案:

答案 0 :(得分:1)

Classic Haskell不提供通用模式匹配。它 提供标准模式匹配和守卫。所以你可以写像

这样的东西
foo :: [Int] -> ...
foo [1,2,3] = <some expression>
foo [1,2,x] = <some expression that can use x>
foo (x:xs) = <some expression where x is the first element, and xs is the rest>
foo (x:x':xs) = <some expression where x is the first element, x' the second, and xs is the rest>

bar :: (Int,String) -> ...
bar (1,"hello") =
bar (someInt,someString) =
bar (someInt,_) = 
bar _ = 

交替:

bar :: (Int, String) -> ...
bar x = case x of
         (1,"hello") -> ...
         _ -> ...

交替出现:

bar :: (Int, String) -> ...
bar (someInt,someString) 
         | someInt == 1 && someString == "hello" = ...
         | someInt == 2 && someString == "hello" = ...
         | otherwise = ...

GHC还提供了更加无缝集成防护和模式匹配的扩展。请参阅“视图模式”和“模式警卫”部分:http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html