[Haskell-beginners] Matrix / Matrix Addition

Paul Monday paul.monday at parsci.com
Thu Dec 8 23:04:43 CET 2011


Perfect … Thanks Daniel!

Paul Monday
Parallel Scientific, LLC.
paul.monday at parsci.com




On Dec 8, 2011, at 2:13 PM, Daniel Fischer wrote:

> On Thursday 08 December 2011, 21:55:46, Paul Monday wrote:
>> data UMatrix a = UMatrix (V.Vector (U.Vector a))
>>    deriving (Show, Eq)
>> 
>> madd3 :: (U.Unbox a, Num a) => UMatrix a -> UMatrix a -> UMatrix a
>> madd3 (UMatrix m) (UMatrix n) = UMatrix $ V.zipWith (U.zipWith (+)) m n
>> 
>> And it works … (really, when I started writing this note, I was
>> completely lost … welcome to the power of sitting and walking through
>> Haskell)
>> 
>> madd3 (UMatrix (Data.Vector.fromList [Data.Vector.Unboxed.fromList
>> [1,2,3], Data.Vector.Unboxed.fromList [4,5,6],
>> Data.Vector.Unboxed.fromList [7,8,9]])) (UMatrix (Data.Vector.fromList
>> [Data.Vector.Unboxed.fromList [10,11,12], Data.Vector.Unboxed.fromList
>> [13,14,5], Data.Vector.Unboxed.fromList [16,17,18]]))
>> 
>> I have ONE thing that I can't really explain …
>> 
>> Why does the declaration of madd3 REQUIRE the use of U.Unbox a as a data
>> type? madd3 :: (U.Unbox a, Num a) => UMatrix a -> UMatrix a -> UMatrix
>> a
>> 
>> I would have thought that my declaration of UMatrix would have done
>> this?
> 
> No, the data declaration doesn't provide any such context, hence you have 
> to specify it at the use site (I don't think for types which aren't 
> instances of Unbox there are any values other than _|_, though).
> 
> You can make the Unbox constraint available from the data declaration if 
> you use GADTs,
> 
> {-# LANGUAGE GADTs #-}
> 
> data UMatrix e where
>    UMatrix :: U.Unbox a => V.Vector (U.Vector a) -> UMatrix a
> 
> Then pattern-matching on a UMatrix makes the Unbox dictionary of a 
> available.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20111208/0d7550ff/attachment.htm>


More information about the Beginners mailing list