簡體   English   中英

代表管道的函數列表的類型化 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]:好的,所以一種可能性可能是:對於列表中的任何兩個相鄰元素,對於某些ABC ,它們必須是(-> AB)(-> BC) 不過,我不認為 Typed Racket 可以支持像這樣的任意高階謂詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM