![](/img/trans.png)
[英]Is there any way to declare a type representing all the callable procedures(any procedure which is callable) in Typed Racket?
[英]Typed Racket type for list of functions representing pipeline
我在無類型 Racket 中有一個 function,它采用代表輸入的 arguments、代表管道的函數和符號列表以及停止應用函數的符號(我知道這不是很清楚,但代碼在下面)。 我正在嘗試將其轉換為 Typed Racket,但無法弄清楚如何讓類型系統了解正在發生的事情。 我知道我可以使用cast
來強制它工作,但我想知道是否有更好的方法?
(define (apply-steps on steps stop-symbol)
(match steps
['() on]
[(cons step rst)
(cond
[(equal? stop-symbol (car step)) ((cadr step) on)]
[else (apply-steps ((cadr step) on) rst stop-symbol)])]))
我需要以某種方式指定簽名的類型,例如:
(apply-steps [on : T1]
[steps : (List (Pairof Symbol (-> T1 T2)) (Pairof Symbol (-> T2 T3)) ... (Pairof Symbol (-> Tn-1 Tn))]
[stop-symbol : Symbol]) : Tn
謝謝!
有幾個問題:
您的輸入之一本質上是一個函數列表。 您希望它具有類型(List (-> F1 F2) (-> F2 F3)... (-> Fn Fn+1))
,但我不認為 Typed Racket 可以支持這種事情。 如果你寫出來,它涉及無限數量的類型變量,取決於列表的長度? 你怎么能有限地指定類型。[1]。
要解決此問題,我建議您將要求更改為(List (-> AA) (-> AA)... (-> AA))
= (Listof (-> AA))
。
根據給定的類型,每個元素都是一個(Pairof Function Symbol)
,但是從您的 function 來看,它看起來需要一個(List Symbol Function)
(當我試用您的程序時,這是由 Typed Racket 捕獲的)。
應用修復程序,您將獲得:
(: apply-steps (All (A) (-> A (Listof (List Symbol (-> A A))) Symbol A)))
(define (apply-steps on steps stop-symbol)
(match steps
['() on]
[(cons step rst)
(cond
[(equal? stop-symbol (car step)) ((cadr step) on)]
[else (apply-steps ((cadr step) on) rst stop-symbol)])]))
順便說一句,如果你使用常規的 Racket,你也可以使用for/fold
和#:final
子句來實現這個 function。
(define (apply-steps on steps stop-symbol)
(for/fold ([on on]) ([step (in-list steps)])
(match-define (list sym f) step)
#:final (equal? stop-symbol sym)
(f on)))
不幸的是,Typed Racket(還)不支持#:final
,所以你不能在這里使用它。
[1]:好的,所以一種可能性可能是:對於列表中的任何兩個相鄰元素,對於某些A
、 B
、 C
,它們必須是(-> AB)
和(-> BC)
。 不過,我不認為 Typed Racket 可以支持像這樣的任意高階謂詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.