在 Typed 球拍中咖喱

Eal*_*had 3 currying racket typed-racket

在常规球拍中,((curry * 2) 3)按预期工作,6结果。

但是,在 Typed Racket 中:

> ((curry * 2) 3)
; readline-input:3:0: Type Checker: could not apply function;
;  wrong number of arguments provided
;   expected: 0
;   given: 1
;   in: ((curry * 2) 3)
; [,bt for context]
Run Code Online (Sandbox Code Playgroud)

为什么?

小智 5

我相信这与 * 只能接受一个参数这一事实有关,因此当您使用参数对其进行柯里化时,它会返回一个不接受其他参数的过程。键入(curry * 2)在输入/球拍命令行和观察结果:(-> Number)

请注意,只有一个返回类型,没有参数。我在打字球拍中看不到解决此问题的方法,但我希望至少可以解释为什么会发生这种情况。您应该可以安全地将 currying 用于更复杂的过程,只要它们没有仅采用一个参数的选项。

  • 事实上,当我`(define mult *)`和`(: mult : (-> Number Number Number))`时它工作正常。不过这很奇怪;在 Typed Racket 中,对于多元程序来说,柯里化是不可能的吗? (4认同)
  • 我对 Typed Racket 的了解不够,无法回答您的评论,但我可以为您的解决方法提供简写:`((curry (ann * (-> Number Number Number)) 2) 3)`。参见 [ann](https://docs.racket-lang.org/ts-reference/special-forms.html?q=inst#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims。 .rkt%29._ann%29%29)。 (3认同)