5

Ví dụ, làm thế nào tôi có thể viết một phiên bản map mà sẽ làm việc với các chức năng đa hình trong typed vợt? Tôi sử dụng một id chức năng đơn giản định nghĩa là:Làm cách nào để viết các hàm bậc cao hơn có chức năng đa hình như các đối số trong Typed Racket?

(: id : (All (A) A -> A)) 
(define (id x) x) 

Khi tôi cố gắng để ánh xạ nó trên một danh sách tôi nhận được một lỗi:

> (map id '(1 2 3)) 

Type Checker: Polymorphic function `map' could not be applied to arguments: 
Types: (-> a b ... b c) (Listof a) (Listof b) ... b -> (Listof c) 
    (-> a c) (Pairof a (Listof a)) -> (Pairof c (Listof c)) 
Arguments: (All (A) (-> A A)) (List One Positive-Byte Positive-Byte) 
Expected result: AnyValues 
    in: (map id (quote (1 2 3))) 

Trả lời

1

Bạn phải tự nhanh chóng các đa hình trong trường hợp này:

-> (map (inst identity Integer) '(1 2 3)) 
- : (Listof Integer) [more precisely: (Pairof Integer (Listof Integer))] 
'(1 2 3) 

lý do được giải thích trong Hướng dẫn Typed vợt here:

Typed Racket’s local type inference algorithm is currently not able to infer types for polymorphic functions that are used on higher-order arguments that are themselves polymorphic.

(xem tài liệu để biết thêm giải thích và ví dụ)

+0

Điều này thật đáng buồn. Cảm ơn bạn. –

Các vấn đề liên quan