You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Racket的match中能否为模式的部分命名?

在Racket中使用类似F#的命名模式(As Pattern)

Racket的match(包括define/match)原生支持给模式的部分绑定名称,完全可以实现你想要的功能,不需要重复执行解构逻辑。有两种常用写法:

1. 简洁语法:绑定名:模式

这是最直观的写法,直接在模式前加上绑定名和冒号,就能把匹配到的模式结果绑定到该名称上。

针对你给出的代码,修改第三个分支如下:

(define/match (make lst)
  [((list)) (const #f '())]
  [((list (cons _ n))) (cons (make-tree-node n) '())]
  [((list-rest (cons parent pnum) child-pair:(cons child cnum) rest))
    ; 直接使用child-pair,无需重新构造(cons child cnum)
    ; rest已经是匹配到的剩余列表,直接使用即可
    (displayln child-pair) ; 示例:打印绑定的child-pair
    ; 其他逻辑
   ])

2. 标准写法:(and 模式 绑定名)

如果你偏好更显式的语法,可以用and模式同时匹配结构并绑定名称:

(define/match (make lst)
  [((list)) (const #f '())]
  [((list (cons _ n))) (cons (make-tree-node n) '())]
  [((list-rest (cons parent pnum) (and (cons child cnum) child-pair) rest))
    ; 同样可以直接使用child-pair
    (displayln child-pair)
    ; 其他逻辑
   ])

两种写法的效果完全一致,都不会重复执行解构操作——绑定的名称直接引用match宏已经解构出的结果,既清晰又高效。


内容的提问来源于stack exchange,提问作者primfaktor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:01:05