Tôi đang cố xác định loại cho danh sách độ dài cố định trong Haskell. Khi tôi sử dụng cách tiêu chuẩn để mã hóa các số tự nhiên thành các loại đơn nhất, mọi thứ đều hoạt động tốt. Tuy nhiên, khi tôi cố gắng xây dựng mọi thứ trên các loại chữ của GHC, tôi gặp phải rất nhiều vấn đề.Danh sách độ dài và loại chữ cố định
shot đầu tiên của tôi tại các loại danh sách mong muốn là
data List (n :: Nat) a where
Nil :: List 0 a
(:>) :: a -> List n a -> List (n+1) a
mà tiếc là không cho phép viết một hàm zip với loại
zip :: List n a -> List n b -> List n (a,b)
tôi có thể giải quyết vấn đề này bằng cách trừ đi 1 từ loại biến số n
trong loại (:>)
:
data List (n :: Nat) a where
Nil :: List 0 a
(:>) :: a -> List (n-1) a -> List n a -- subtracted 1 from both n's
Tiếp theo, tôi đã cố gắng để xác định một chức năng phụ thêm:
append :: List n1 a -> List n2 a -> List (n1 + n2) a
append Nil ys = ys
append (x :> xs) ys = x :> (append xs ys)
Thật không may, GHC nói với tôi
Couldn't match type ‘(n1 + n2) - 1’ with ‘(n1 - 1) + n2’
Thêm chế ((n1 + n2) - 1) ~ ((n1 - 1) + n2)
để chữ ký không giải quyết được vấn đề kể từ GHC phàn nàn
Could not deduce ((((n1 - 1) - 1) + n2) ~ (((n1 + n2) - 1) - 1))
from the context (((n1 + n2) - 1) ~ ((n1 - 1) + n2))
Bây giờ, tôi rõ ràng bị bắt trong một số loại vòng lặp vô hạn.
Vì vậy, tôi muốn biết nếu nó có thể xác định một loại cho các danh sách có độ dài cố định sử dụng literals loại ở tất cả. Có lẽ tôi thậm chí có thể giám sát một thư viện cho chính xác mục đích này? Về cơ bản, yêu cầu duy nhất là tôi muốn viết một cái gì đó như List 3 a
thay vì .
Bạn có thể tìm thấy một số cuộc thảo luận về các vấn đề liên quan đến gõ cấp độ dài vector trong giấy Hasochism: https://personal.cis.strath.ac.uk/conor.mcbride/pub/hasochism. pdf – chi
"Hasochism" âm thanh thực sự hấp dẫn. Tuy nhiên, tôi sẽ thử cho bài báo. Cảm ơn bạn. –
Nó có thể dễ dàng hơn để làm cho một wrapper newtype xung quanh một danh sách bình thường với một 'Nat' đính kèm, tương tự như cách' Linear.V' hiện nó. Bạn có thể định nghĩa một số nguyên thủy trong một mô đun và ẩn hàm tạo để làm cho mọi thứ an toàn. – cchalmers