【问题标题】:Pattern matching in RacketRacket 中的模式匹配
【发布时间】:2020-01-17 10:52:43
【问题描述】:

我在 Haskell 中有这个代码 sn-p:

matchEx :: Expr -> [Expr]
matchEx (Number n) = undefined
matchEx (Boolean b) = undefined
matchEx (If condStatement thenStatement elseStatement) = undefined

在球拍中等效的模式匹配是什么样的?在查看文档后,这就是我所拥有的。谢谢。

(define (matchEx-calls expr)
  (match expr
    [(literal n) ([])]
    [(id ident) ([])]
    [(If condStatement thenStatement elseStatement) ([])] 
   )
  )

【问题讨论】:

  • 您的match expr 似乎将所有内容都映射到了一个空列表?那么我认为将其定义为tailCalls = const [] 可能更有意义。
  • tailCalls :: Expr -> [Expr] 保证我们至少有一个参数 - 只有当 Expr 允许空表达式时,它才能是“空表达式”
  • 我认为,aswer 非常特定于在 Racket 实现中保存表达式的结构。请提供这种结构的定义,以便设计出适当的模式匹配。
  • Expr 可以是任何类型的球拍表达式,例如字符串、函数调用、数字、if 语句等。

标签: haskell pattern-matching racket


【解决方案1】:

下面是一个帮助您入门的示例:

#lang racket

(struct Expr ()              #:transparent)
(struct Number  Expr (n)     #:transparent)
(struct Boolean Expr (b)     #:transparent)
(struct Or      Expr (exprs) #:transparent)

(define (format-Expr e)
  (define ~ format-Expr)
  (match e
    [(Number n)  (~a n)]
    [(Boolean b) (if b "true" "false")]
    [(Or es)     (match es
                   ['()              "true"]
                   [(list e)         (~ e)]
                   [(list e1 e2)     (~a (~ e1) " or " (~ e2))]
                   [(list e1 es ...) (~a (~ e1) " or " (~ (Or es)))])]
    [(? Expr? e)
     ; we get here if we forgot to implement a case
     (error 'format-expr (~a "internal error, got: " e))]
    [_
     ; this on the other hand is an user error
     (error 'format-expr (~a "expected an Expr, got: " e))]))

(format-Expr (Or (list (Boolean #t) (Boolean #f))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多