転置行列

30分プログラム、その105。Haskellで転置行列。http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?exerciseより。
転置行列なんて使わねーよ、と思って放置していたけど、昨日使ったので。

使い方

*Main> transpose [[1,2,3],[4,5,6],[7,8,9]]
[[1,4,7],[2,5,8],[3,6,9]]

ソースコード

QuickCheck(id:mzp:20070729:quick)によるテスト付き。

import Test.QuickCheck

empty :: [a]->Bool
empty [] = True
empty _ = False

transpose :: [[a]]->[[a]]
transpose [] = []
transpose m@(x:_) 
    | empty x   = m
    | otherwise = map (\n->map (!! n) m) [0..length x-1]

pRevert :: [[Int]] -> Property
pRevert [] = True ==> 0 == length (transpose (transpose []))
pRevert m@(x:xs) = 
    and (map (\y-> length y== length x) xs) ==>
        transpose (transpose m) == m

main = quickCheck pRevert

参考