qlinear-0.1.0.0: src/Internal/Matrix.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
module Internal.Matrix where
import qualified Data.List as List
import Data.List.Split
import Data.Proxy
import Data.Tuple
import qualified GHC.Natural as Natural
import GHC.TypeNats
import Prelude hiding (length)
data Matrix (m :: Nat) (n :: Nat) a where
Matrix :: forall m n a. (Int, Int) -> ![[a]] -> Matrix m n a
instance Show a => Show (Matrix m n a) where
show (Matrix _ matrix) = List.intercalate "\n" $ map show matrix
instance Functor (Matrix m n) where
fmap f (Matrix size a) = Matrix size $ map (map f) a
instance Applicative (Matrix m n) where
pure = Matrix (1, 1) . pure . pure
Matrix size fs <*> (Matrix _ as) =
Matrix size $ map (uncurry (<*>)) $ zip fs as
instance (Eq a) => Eq (Matrix m n a) where
Matrix _ a == Matrix _ b = a == b
type Vector n a = Matrix n 1 a
size :: Integral b => Matrix m n a -> (b, b)
size (Matrix (m, n) _) = (fromIntegral m, fromIntegral n)
value :: Matrix m n a -> [[a]]
value (Matrix _ value) = value