{-# LANGUAGE OverloadedLists #-} {-# LANGUAGE TypeFamilies #-} import GHC.IsList import qualified Data.Array.Unboxed as A instance A.IArray A.UArray e => IsList (A.UArray (Int,Int) e) where type Item (A.UArray (Int,Int) e) = [e] fromList [] = A.array ((0,0),(0,0)) [] fromList ll@(hd:_) = let h = length ll w = length hd in A.array ((0,0),(h-1,w-1)) [((i,j), x) | (row, i) <- zip ll [0..] , (x, j) <- zip row [0..]] toList arr = let ((0,0), (_h,w)) = A.bounds arr in chunksN w (A.elems arr) where chunksN n [] = [] chunksN n l = let (pre, post) = splitAt n l in pre : chunksN n post main :: IO () main = do let arr :: A.UArray (Int,Int) Char arr = ["hello" ,"this " ,"is an" ,"array"] print arr