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

在DrRacket的plai-typed中用define-type定义嵌套结构及编写模式匹配器遇问题

修复你的PLAI Typed模式匹配器代码

我帮你排查下这段DrRacket(PLAI Typed)代码里的几个问题,然后给你修正后的版本:

问题梳理

  • 字段访问语法错误:在activity1分支里,你用了activity-kind-type来获取Activity的type字段——这不对。PLAI Typed里,define-type定义的类型,字段访问是通过[类型名]-[字段名]的函数来实现的。比如kind类型的type字段,得用(kind-type activity)才能正确读取,而不是直接拼接名称。
  • 类型定义不完整:Hacktivity类型里的activity3分支只写了一半((ac...),得补全成完整的字段定义[activity3 (activity : Activity)]。
  • 函数分支未闭合:good?函数里的activity3分支没有写完,缺少判断逻辑和闭合括号,直接导致语法报错。
  • 冗余判断(可选优化):activity2分支里的(string=? "Analyze" "Analyze")永远返回#t,如果你的本意是判断该分支的activity类型是否为"Analyze",建议改成和activity1一致的写法。

修正后的完整代码

#lang plai-typed

(define-type Activity
  [kind (type : string) (description : string)])

(define-type Hacktivity
  [activity1 (activity : Activity)]
  [activity2 (activity : Activity)]
  [activity3 (activity : Activity)]) ; 补全activity3的完整定义

(define (good? [h : Hacktivity]) : boolean
  (type-case Hacktivity h
    [activity1 (activity) (string=? (kind-type activity) "Analyze")] ; 正确访问type字段
    [activity2 (activity) (string=? (kind-type activity) "Analyze")] ; 修正为判断activity的type(如果需要)
    [activity3 (activity) (string=? (kind-type activity) "Analyze")] ; 补全activity3的分支逻辑
    ))

额外说明

如果activity2确实需要无条件返回#t,那可以保留(string=? "Analyze" "Analyze")或者直接写#t——但通常这种写法是疏忽导致的,所以更建议统一成判断对应activity类型的逻辑,让代码更一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:00:23