Được rồi, tôi đang cố gắng quấn đầu quanh máy chữ, và vì vậy tôi đang cố gắng xác định kiểu chữ cho hoạt động vectơ hình học. Tôi quản lý để có được nó làm việc cho thành phần khôn ngoan +,-,*,/;
nhưng tôi đang đấu tranh với các sản phẩm dot.Haskell Vector Typeclass: Chức năng của [a] -> [a] -> a
class GeomVector a where
(>+) :: a -> a -> a
(>-) :: a -> a -> a
(>*) :: a -> a -> a
(>/) :: a -> a -> a
(>.) :: a -> a -> Double
data Vector a = Vec [a]
deriving Show
instance (Fractional a) => GeomVector (Vector a) where
(>+) (Vec u) (Vec v) = Vec $ zipWith (+) u v
(>-) (Vec u) (Vec v) = Vec $ zipWith (-) u v
(>*) (Vec u) (Vec v) = Vec $ zipWith (*) u v
(>/) (Vec u) (Vec v) = Vec $ zipWith (/) u v
(>.) (Vec u) (Vec v) = sum $ u >* v
Rõ ràng định nghĩa ví dụ của tôi cho (>.) Sẽ không làm việc bởi vì kết quả là loại Fractional a
, không Double
.
Nhưng tôi không biết cách thực hiện hành vi này từ khai báo trong lớp học.
gì tôi muốn như cần làm là:
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
Nhưng điều này là không hợp lệ vì [a]
là một loại và không phải là một loại biến.
Tôi ước tôi có thể giải thích điều này tốt hơn một chút, nhưng tôi thành thật không hiểu đủ để làm như vậy. Hy vọng rằng mã sẽ làm cho nó rõ ràng hơn một chút những gì tôi đang đấu tranh với.
Tôi nghĩ bạn cần một biến kiểu khác để biểu thị loại vô hướng, tức là 'lớp GeomVector a ở đó ... (>.) :: a -> a -> s'. – ErikR
Điều bạn muốn là [Từ đồng nghĩa loại được liên kết] (http://www.haskell.org/haskellwiki/GHC/Type_families#An_associated_type_synonym_example) – Lambdageek
Tuyên bố lớp học của bạn không hoàn thiện không chỉ vì loại kết quả (>.). Bạn cần phải tạo ra một sản phẩm chấm của '' 'u''' và' '' v''' là các danh sách , không phải là trường hợp của lớp học của bạn. –