
Am Montag 21 September 2009 23:15:48 schrieb Victor Nazarov:
I've tried to reimplement code presented in the following blog post: http://cdsmith.wordpress.com/2009/09/20/side-computations-via-type-classes/
But I've got stuck with the following error:
Triangulable.hs:41:8: `addRows' is not a (visible) method of class `Triangulable'
Triangulable.hs:43:8: `addCols' is not a (visible) method of class `Triangulable'
I think the minimal example to reproduce this error is the following:
... class Triangulable m where type Elem m (@@) :: m -> (Int, Int) -> Elem size :: m -> Int swapRows :: Int -> Int -> m -> m swapCols :: Int -> Int -> m -> m addRow :: (Num Elem) => Elem -> Int -> Int -> m -> m addCol :: (Num Elem) => Elem -> Int -> Int -> m -> m
newtype ListMatrix a = ListMatrix [[a]]
instance Num a => Triangulable (ListMatrix a) where type Elem (ListMatrix a) = a (ListMatrix xs) @@ (i, j) = xs !! i !! j size (ListMatrix xs) = size xs swapRows m n (ListMatrix xs) = ListMatrix $ swap m n xs swapCols m n (ListMatrix xs) = ListMatrix $ map (swap m n) xs addRows q m n (ListMatrix xs) = ListMatrix $ modifyNth n (zipWith comb (xs !! m)) where comb a b = q * a + b addCols q m n (LisMatrix xs) = ListMatrix $ map (\row -> modifyNth n (comb (row !! m)) row) where comb a b = q * a + b ...
How can I fix this?
Shouldn't the methods be called the same in the class definition and instance declaration? So instance ... where ... addRow q m n (ListMatrix xs) = ... addCol q m n (ListMatrix xs) = ..
-- Victor Nazarov