无法在Haskell代码中找到$ form的含义

时间:2019-07-09 19:20:57

标签: haskell

我正在遵循“ Handbook of Practical Logic and Automated Reasoning”代码库的Haskell版本。在以下情况下,$form的目的是什么?

eval :: Formula -> (Rel -> Bool) -> Bool
eval fm v = case fm of
  [$form| ⊤ |] -> True
  [$form| ⊥ |] -> False
  [$form| ^a |] -> v a
  [$form| ¬ $p |] -> not (eval p v)
  [$form| $p ∧ $q |] -> eval p v && eval q v
  [$form| $p ∨ $q |] -> eval p v || eval q v
  [$form| $p ⊃ $q |] -> not (eval p v) || (eval q v)
  [$form| $p ⇔ $q |] -> eval p v == eval q v
  _ -> error "quantifier in prop eval"

相关的OCaml代码很简单:

let rec eval fm v =
  match fm with
    False -> false
  | True -> true
  | Atom(x) -> v(x)
  | Not(p) -> not(eval p v)
  | And(p,q) -> (eval p v) & (eval q v)
  | Or(p,q) -> (eval p v) or (eval q v)
  | Imp(p,q) -> not(eval p v) or (eval q v)
  | Iff(p,q) -> (eval p v) = (eval q v);;

1 个答案:

答案 0 :(得分:6)

formquasi-quoter。这些提供了一种调用模板Haskell的方式,可以从您希望使用的任何其他语法中生成Haskell代码,例如本例中的Unicode逻辑公式。

从本质上讲,这只是用户可定义的语法糖:在实际编译之前,[$form| ⊤ |]将被解析为模式Top,而[$form| $p ∧ $q |]将被解析为模式And p q,等等–即基本上与OCaml代码中的内容相同。可以说这对于此功能来说是过大的,但是当生成和/或匹配更复杂的公式时,这肯定会派上用场。

它写成[$form|而不仅仅是[form|是过时的GHC-6语法。对于当前的编译器,请使用后一种形式。