type Zipper a = ([a],[a]) cursorOnDiagonal :: [[Int]] -> [Zipper Int] cursorOnDiagonal matrix = map (\(n,x) -> splitAt n x) (zip [0..(length matrix)-1] matrix) flipToOneAtCursor :: [Zipper Int] -> [Zipper Int] flipToOneAtCursor = map (\(ys,x:xs) -> (ys,1:xs)) backToList :: [Zipper Int] -> [[Int]] backToList = map (\(ys,xs) -> ys ++ xs)
backToList . flipToOneAtCursor . cursorOnDiagonal $ matrix == [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]