gpt4 book ai didi

racket - 如何解决柯里化(Currying)函数中的类型不匹配错误?

转载 作者:行者123 更新时间:2023-12-02 02:25:58 31 4
gpt4 key购买 nike

我尝试定义一个多态类型:

(define-type (listt a)
(U Empty
(Cons a)))

(结构空())
(struct (a) Cons ([v : a] [w : (listt a)]))

和柯里化(Currying)函数:

;; a better name for subst-c is subst-currying
(: subst-c : (∀ (a) ((-> a Boolean) -> a (listt a) -> (listt a))))
(define (subst-c pred)
(lambda (n listt)
(match listt
[(Empty)
(Empty)]
[(Cons e t)
(if (pred e)
(Cons n ((subst-c pred) n t))
(Cons e ((subst-c pred) n t)))])))

但出现错误

;Type Checker: type mismatch
; expected: Nothing
; given: a
; in: n
;Type Checker: type mismatch
; expected: (U Empty (Cons Nothing))
; given: (U Empty (Cons a))
; in: t

我很困惑,我做错了什么?

最佳答案

如果您手动添加一些类型变量实例化,此代码实际上会进行类型检查。像这样:

(: subst-c : (∀ (a) ((-> a Boolean) -> a (listt a) -> (listt a))))
(define (subst-c pred)
(lambda (n listt)
(match listt
[(Empty)
(Empty)]
[(Cons e t)
(if (pred e)
(Cons n (((inst subst-c a) pred) n t)) ;; <-- Right here
(Cons e (((inst subst-c a) pred) n t)))]))) ;; <-- and here

inst 运算符用于实例化类型变量。在本例中,用于递归使用subst-c。我不确定为什么需要在这里手动实例化。我认为这可能是 Typed Racket 类型推断的错误/限制。

通过查看 DrRacket 中弹出的类型工具提示(将鼠标悬停在表达式上以查看类型)并查看 Nothing 的位置,我能够弄清楚将它们放在哪里来自。

关于racket - 如何解决柯里化(Currying)函数中的类型不匹配错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36678670/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com