2

マトリックスを展開するのに問題があります。プログラムの出力は次のようになります。私は少し立ち往生しています。

unfoldMatrix :: [ [a] ] -> [a]
Main> unfoldMatrix [[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9],
                [10, 11, 12]]
[1,4,7,10,11,12,9,6,3,2,5,8]

私のコードは機能しますが、出力はこの形式です

[[1,4,7]、[8,9]、[6,3]、[2]、[5]、[]]

思い通りに動作するようにコードを変更する方法はありますか?

transpose2:: [[a]]->[[a]]
transpose2 ([]:_) = []
transpose2 x = (map head x) : transpose2 (map tail x)


unfoldMatrix:: [[a]]->[[a]]
unfoldMatrix ([]:_) = []
unfoldMatrix x =(map head x):unfoldMatrix(tail2(x))

rotate90 :: [ [ a ] ] -> [ [ a ] ]
rotate90 = (map reverse).transpose2

tail2:: [[a]]->[[a]]
tail2 = (tail).rotate90
4

1 に答える 1

0

transpose2すべてのサブリストが同じ長さである場合、それはtransposeからと同じである必要はありませんData.List。だからあなたの展開は単に

Prelude Data.List> let unfold xxs@((_:_):_) = map head xxs ++ unfold (map reverse . transpose $ map tail xxs); unfold _ = []
Prelude Data.List> unfold [[1,2,3],[4,5,6],[7,8,9]]
[1,4,7,8,9,6,3,2,5]
Prelude Data.List> unfold [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
[1,4,7,10,11,12,9,6,3,2,5,8]
于 2012-05-25T20:56:23.323 に答える