life/Matrix.hs
2015-03-08 01:34:41 +01:00

37 lines
997 B
Haskell

module Matrix where
import Control.Applicative
import Data.List (intercalate)
newtype Mat a = Mat [[a]]
type Pos = (Int, Int)
instance Functor Mat where
fmap f (Mat m) = Mat ((map . map) f m)
instance (Show a) => Show (Mat a) where
show (Mat m) = concatMap ((++"\n") . intercalate " " . map show) m
-- | Safely access a list
-- [4,1,5,9] ?? 2 == Just 5
-- [5,7] ?? 3 == Nothing
(??) :: [a] -> Int -> Maybe a
xs ?? n | n < 0 = Nothing
[] ?? _ = Nothing
(x:_) ?? 0 = Just x
(_:xs) ?? n = xs ?? (n-1)
-- | Split a list into sublists of length n
-- group 2 [1..5] == [[1,2],[3,4],[5]]
group _ [] = []
group n xs = take n xs : group n (drop n xs)
-- | Create a matrix of indeces of a matrix
indeces :: Mat a -> Mat Pos
indeces (Mat m) = Mat (group y pos) where
(x, y) = (length m, length (m !! 0))
pos = liftA2 (,) [0..x-1] [0..y-1]
-- | Create a constant matrix
constant :: a -> Int -> Int -> Mat a
constant k x y = Mat (replicate x $ replicate y k)