我想要定义这样的功能:了解和使用类型化球拍省略号正确
(define (((lift fn) . gs) . args)
(apply fn (map (lambda (g) (apply g args)) gs)))
这基本上“升降机”的函数fn
以便代替接受其正常参数,它接受功能并产生一个新的功能。因此,例如,
(define add (lift +))
(define sum-of-sin-and-cos (add sin cos))
(sum-of-sin-and-cos 5) ; is equivalent to (+ (sin 5) (cos 5))
(define sum-of-multiplication-and-division (add * /))
(sum-of-multiplication-and-division 1 2 3 4 5) ; is equivalent to (+ (* 1 2 3 4 5) (/ 1 2 3 4 5))
这在普通球拍中起作用。现在,我想把这个功能转换为打字球拍。这里是我想出了类型声明:
(: lift (All (A ...) (All (B ...) (All (C)
((B ... B -> C) ->
((A -> B) ... B ->
(A ... B -> C)))))))
这是我认为定义说:对于所有类型的A0
,A1
.. An
和B0
,B1
,... Bn
和C
:
lift
花费(的B0
,B1
的函数,...Bn
到C
)并且产生:- 的许多功能的功能(
Ai
到Bi
,i
从0到n
),其又产生: - 的
Ai
i
的函数,从0到n
,这反过来又产生: - 一个
C
这不行:在最后一行(A ... B -> C)
我得到Type Checker: Type variable A must be used with ... in: A
。
这不是我在使用Typed Racket时遇到的省略号的第一个问题,我认为这实际上是对省略号意味着什么的根本性误解。
作为一个方面说明,如果我尝试了All
条款坍缩成一个一个这样的:
(All (A ... B ... C) blah blah blah)
然后在第二行((B ... B - C) ->
我收到以下错误:Type Checker: Used a type variable (B) not bound with ... as a bound on a ... in: B
(指第二B在那条线上)。我也不是很明白。
完美!我现在看到我的原始类型声明出了什么问题。 – Ord