Vì vậy, cuối cùng tôi đã tìm thấy một tác vụ mà tôi có thể sử dụng phần mở rộng DataKinds
mới (sử dụng ghc 7.4.1). Đây là Vec
Tôi đang sử dụng:Tên liên kết trong chữ ký loại sử dụng DataKind
data Nat = Z | S Nat deriving (Eq, Show)
data Vec :: Nat -> * -> * where
Nil :: Vec Z a
Cons :: a -> Vec n a -> Vec (S n) a
Bây giờ, để thuận tiện tôi muốn thực hiện fromList
. Về cơ bản không có vấn đề với đệ quy đơn giản/fold - nhưng tôi không thể tìm ra cách để cho nó đúng loại. Để tham khảo, đây là phiên bản Agda:
fromList : ∀ {a} {A : Set a} → (xs : List A) → Vec A (List.length xs)
My Haskell cách tiếp cận, sử dụng cú pháp tôi thấy here:
fromList :: (ls :: [a]) -> Vec (length ls) a
fromList [] = Nil
fromList (x:xs) = Cons x (fromList xs)
này mang lại cho tôi một parse error on input 'a'
. Cú pháp tôi tìm thấy có chính xác không, hoặc họ đã thay đổi nó chưa? Tôi cũng đã thêm một số tiện ích mở rộng khác có trong mã trong liên kết, điều này không giúp được gì (hiện tại tôi có GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies, UndecidableInstances
).
nghi ngờ khác của tôi là tôi chỉ không thể ràng buộc kiểu đa hình, nhưng thử nghiệm của tôi cho điều này:
bla :: (n :: Nat) -> a -> Vec (S n) a
bla = undefined
thất bại, quá, với Kind mis-match Expected kind 'ArgKind', but 'n' has kind 'Nat'
(thật sự không biết điều đó có nghĩa).
Có ai có thể giúp tôi với phiên bản làm việc của fromList
và cũng làm rõ các vấn đề khác không? Thật không may, DataKinds
không được tài liệu rất tốt và dường như giả định rằng tất cả mọi người sử dụng nó có kiến thức lý thuyết loại sâu sắc.
Wow, cảm ơn rất nhiều. Điều này làm cho tôi bắt đầu thực sự hiểu 'DataKinds' - họ đánh lừa tôi một chút, có vẻ như vậy. Thật vậy, lúc đầu, tôi nghĩ rằng tôi cần phiên bản được định lượng hiện tại, nhưng kiểu phụ thuộc trông giống như những gì tôi thực sự muốn loại thể hiện. Tuy nhiên, cú pháp ràng buộc với '(a :: X) -> Y' đến từ đâu? Tôi đã thấy điều đó ở một số nơi. – phg
Ví dụ, nó được sử dụng [ở đây] (http://haskell.1045720.n5.nabble.com/Data-Kinds-and-superfluous-in-my-opinion-constraints-contexts-td5689436.html), và tôi cũng nghĩ [ở đây] (http://www.typesandotherdistractions.com/2012/02/fun-with-xpolykinds-polykinded-folds.html). – phg
Tôi nghĩ rằng hầu hết những gì bạn có là mã ở cấp độ hạn '\ (a :: X) -> y' và/hoặc các công cụ liên quan đến' PolyKinds'. Ví dụ: 'dữ liệu Hộp a = Hộp' và' bla :: Hộp (n :: Nat) -> a -> Vec n a' –