在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
相关产品推荐
相关产品推荐

