我想要定義這樣的功能:瞭解和使用類型化球拍省略號正確
(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