簡體   English   中英

是否有 Typed Racket 提供的類型安全列表參考 function?

[英]Is there a type-safe list-ref function provided by Typed Racket?

是否有 Typed Racket 提供的類型安全list-ref function?

如果您嘗試訪問超出范圍的索引,則list-ref function 似乎會引發錯誤:

> (require typed/racket)
> (list-ref '(1 2 3) 100)
; list-ref: index too large for list
;   index: 100
;   in: '(1 2 3)

list-ref在給定類型的情況下返回錯誤是有道理的:

> list-ref
- : (All (a) (-> (Listof a) Integer a))

我想一個類型安全的版本將具有如下類型:

(: list-ref (All (a) (-> (Listof a) Integer (Option a)))

如果這個類型安全的list-ref function 是從 Typed Racket 的某個地方提供的,我將如何找到它?

如果這個類型安全的list-ref function 不存在,那為什么不存在呢? 看起來這個 function 通常很有用。

據我所知,它不存在。

您提出的(All (a) (-> (Listof a) Integer (Option a)))的一個問題是(Option a)只是(U #fa) 也就是說,您必須用#f表示“無”。 但是如果你有一個(Listof Boolean) ,並且list-ref* (你的list-ref的變體)返回#f ,你怎么知道是因為索引超出了界限,還是因為元素真的是#f ?

解決此問題的一種可能方法是用類似盒子的東西包裝“一些”變體,並相應地調整類型。 例如,

(: list-ref* (All (a) (-> (Listof a) Integer (Option (Boxof a)))))
(define (list-ref* xs i)
  (with-handlers ([exn:fail? (λ (_) #f)])
    (box (list-ref xs i))))

請注意,包裝會影響性能,這可以解釋為什么它不包含在庫中。

暫無
暫無

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

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