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

在Haskell代码中找不到$form的含义,haskell,Haskell,我遵循的是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 |

我遵循的是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);;
这是一个很好的例子。它们提供了一种调用模板Haskell的方法,以从任何其他类型的语法生成Haskell代码,例如在本例中的Unicode逻辑公式

本质上,它只是用户可定义的语法糖:在实际编译之前,
[$form|⊤ |]将解析为模式
顶部
,和
[$form |$p∧ $q |]
到模式
和pq
等–即基本上与OCaml代码中的内容相同。可以说,这对于该函数来说是一种过分的技巧,但在生成和/或匹配更复杂的公式时,这肯定会派上用场


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

它是模板Haskell;它使用准引号来解析
[$form |…|]
方括号。
表单
是一个已定义的符号。看起来它的目的是允许您使用漂亮的符号来编写逻辑公式,而不是直接用Haskell语法编写模式。我不知道
$
的作用是什么…@DarthFennec您比我先找到了答案…Re:$form:By,准引号语法发生了变化:>>请注意,自论文撰写以来,准旋转的语法发生了变化:在GHC 7中,人们编写[expr |…|]而不是[:expr |…|]。GHC 6.12使用[$expr |…|]。啊,它已经太旧了。那时我不知道如何使用它,更不用说准引号了!