[Haskell-cafe] Problem with type families

Victor Nazarov asviraspossible at gmail.com
Mon Sep 21 18:06:05 EDT 2009


On Tue, Sep 22, 2009 at 1:31 AM, Daniel Fischer
<daniel.is.fischer at web.de> wrote:
> 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) = ..
>

Yes that's right. My fault, I was too conserned with Fractional
context in addRow and addCol function that I failed to see a simple
bug.

Here is working code for those who is interested:
http://www.hpaste.org/fastcgi/hpaste.fcgi/view?id=9676#a9676

--
Victor Nazarov


More information about the Haskell-Cafe mailing list