[Haskell-beginners] Could not deduce (Matrix m (Maybe a)) from
the context (Matrix m a)
Lyndon Maydwell
maydwell at gmail.com
Fri Jan 29 04:45:32 EST 2010
Thanks Daniel.
It works, but I'm a bit confused as to why the extra type information is needed.
On Fri, Jan 29, 2010 at 5:17 PM, Daniel Fischer
<daniel.is.fischer at web.de> wrote:
> Am Freitag 29 Januar 2010 09:52:37 schrieb Lyndon Maydwell:
>> Hi Beginners.
>>
>> I'm writing a matrix class for a game of life implementation. When I
>> try to compile it I get the error "Could not deduce (Matrix m (Maybe
>> a)) from the context (Matrix m a)" for the method vicinityMatrix.
>>
>> However, when I query the type of an identical implementation to
>>
>> vicinityMatrix in ghci it is successful:
>> :t \m x y -> fromRows $ vicinityRows m x y
>>
>> \m x y -> fromRows $ vicinityRows m x y
>>
>> :: forall (m :: * -> *) (m1 :: * -> *) a.
>>
>> (Matrix m (Maybe a), Matrix m1 a) =>
>> m1 a -> Integer -> Integer -> m (Maybe a)
>>
>> What might be preventing the class from compiling?
>
> Well, the error says the compiler (the type checker) can't deduce the
> context (Matrix m (Maybe a)) from the givens. If you supply that
> information,
>
> vicinityMatrix :: Matrix m (Maybe a) =>
> m a -> Integer -> Integer -> m (Maybe a)
>
> it'll work.
>
>>
>> Thanks guys.
>>
>> ---
>>
>> My Matrix class definition follows below:
>>
>> module Matrix (Matrix) where
>>
>> import Data.Array
>> import Data.Maybe (catMaybes)
>> import Control.Monad (guard)
>>
>> class Matrix m a
>> where
>> fromRows :: [[a]] -> m a
>> toList :: m a -> [a]
>> rows :: m a -> Integer
>> columns :: m a -> Integer
>> row :: m a -> Integer -> [a]
>> column :: m a -> Integer -> [a]
>> at :: m a -> Integer -> Integer -> a
>> (!!!) :: m a -> Integer -> Integer -> a
>> vicinityRows :: m a -> Integer -> Integer -> [[Maybe a]]
>> vicinityMatrix :: m a -> Integer -> Integer -> m (Maybe a)
>> neighbours :: m a -> Integer -> Integer -> [a]
>>
>> toList m = do
>> x <- [0 .. columns m - 1]
>> y <- [0 .. rows m - 1]
>> return $ at m x y
>>
>> row m n = [at m x n | x <- [0 .. columns m - 1]]
>> column m n = [at m n y | y <- [0 .. rows m - 1]]
>>
>> at = (!!!)
>> (!!!) = at
>>
>> vicinityRows m x y = do
>> x' <- [x - 1 .. x + 1]
>> return $ do
>> y' <- [y - 1 .. y + 1]
>> return cell where
>> cell
>>
>> | x < 0 = Nothing
>> | y < 0 = Nothing
>> | x >= columns m = Nothing
>> | y >= rows m = Nothing
>> | otherwise = Just $ at m x y
>>
>> vicinityMatrix m x y = fromRows $ vicinityRows m x y
>>
>> -- neighbours = catMaybes . toListN . vicinityMatrix
>>
>> toListN :: Matrix m a => m a -> [a]
>> toListN m = do
>> x <- [0 .. columns m - 1]
>> y <- [0 .. rows m - 1]
>> guard $ x /= 1 && y /= 1
>> return $ at m x y
>
>
>
More information about the Beginners
mailing list