Functional programming 球拍中的条件模式匹配

Functional programming 球拍中的条件模式匹配,functional-programming,pattern-matching,ocaml,racket,Functional Programming,Pattern Matching,Ocaml,Racket,由于指南中的所有示例都是列表,我发现很难看到如何使用Racket中的模式匹配来编写条件匹配,就像OCaml那样,例如: read ~var_a var_b s = match s.[0] with | _ when var_b >= var_a + 4 -> (* Do something *) | "a" when is_negative var_b -> (* Do something else *) ... 我如

由于指南中的所有示例都是列表,我发现很难看到如何使用Racket中的模式匹配来编写条件匹配,就像OCaml那样,例如:

read ~var_a var_b s = match s.[0] with
    | _ when var_b >= var_a + 4 ->
        (* Do something *)
    | "a" when is_negative var_b -> 
        (* Do something else *)
    ...
我如何在Racket中写类似的东西

谢谢。

该库包括模式匹配,可以通过
模式使用任意谓词。除了
,您还应该能够让球拍的匹配器正常工作。虽然我的OCaml有点弱,但我认为上面代码的以下翻译符合其含义:

(define (my-read #:var-a var-a var-b s)
  (match (string-ref s 0)
    [(and _
          (? (lambda (_)
               (>= var-b (+ var-a 4)))))
     "do something"]
    [(and '#\a
          (? (lambda (_)
               (< var-b 0))))
     "do something else"]))

;; Exercising the first case:     
(my-read #:var-a 50
         60 "blah")

;; Exercising the second case:
(my-read #:var-a 50
         -40 "alphabet")
在这两个版本中,lambda都没有观察匹配的内容,因此我将它们命名为
\uu
,表示不在乎。但是您可以想象更复杂的模式,谓词可以深入地关注到底匹配了什么

Eli建议在这里使用常规的
cond
,因为代码中没有任何重要的模式匹配。我同意。代码如下所示:

(define (my-read #:var-a var-a var-b s) 
  (cond
    [(>= var-b (+ var-a 4))
     "do something"]
    [(and (char=? (string-ref s 0) #\a)
          (< var-b 0))
     "do something else"]))
(定义(我的阅读:var-a var-a var-b s)
(续)
[(>=var-b(+var-a 4))
“做点什么”]
[(和(字符=?(字符串引用s0)#\a)
(
模式匹配可以很容易地转换为一系列测试,没有语言不能做到这一点


OCaml(可能还有Haskell)模式匹配的好处在于,编译器在可能的情况下将代码转换为最佳的测试序列(即,程序永远不会在相同的条件下测试两次,至少在您避免使用
when
警卫时是如此)。

我预计同样的情况也会发生在Racket中,因为它有显式的模式匹配能力,不是吗?如果使用
match
,可能会出现这种情况,但如果使用
cond
,则不会出现这种情况。但我不是球拍方面的专家,只是在OCaml方面。
(define (my-read #:var-a var-a var-b s) 
  (cond
    [(>= var-b (+ var-a 4))
     "do something"]
    [(and (char=? (string-ref s 0) #\a)
          (< var-b 0))
     "do something else"]))