[英]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.