Я пытаюсь распечатать список списков в Haskell. Это то, что я успешно делал раньше для двух подсписков, но я не могу вспомнить все шаги и не видел ничего для произвольного количества подсписков. Список имеет тип [[Double]]
, где все подсписки имеют одинаковую длину.
При вводе [[1,2,3],[1,2,3],[1,2,3]]
вывод должен быть
1 1 1
2 2 2
3 3 3
Моя идея на данный момент заключается в использовании mapM_
. Я хотел бы управлять печатью, используя что-то вроде printf
. Однако при этом печатается подсписок за подсписком, а не индекс за индексом.
import Text.Printf ( printf )
print_row :: Double -> IO ()
print_row r = do
printf "%9.6f" r
print_rows :: [[Double]] -> Int -> IO ()
print_rows r i = do
mapM_ print_row (r !! i)
main :: IO ()
main = do
let rs = [[1,2,3],[1,2,3],[1,2,3]]
n = length rs - 1
mapM_ (print_rows rs) [0..n]
Вы можете использовать transpose :: [[a]] -> [[a]] [Hackage], чтобы определить транспонирование списка списков.
Более того, в Haskell часто не работают по индексу, а просто перебирают подсписки:
import Data.List (transpose)
print_row :: Double -> IO ()
print_row = printf "%9.6f"
print_rows :: [Double] -> IO ()
print_rows = mapM_ print_row
main :: IO ()
main = do
let rs = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
mapM_ print_rows (transpose rs)
или проще:
import Data.List (transpose)
main :: IO ()
main = do
let rs = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
mapM_ (mapM_ (printf "%9.6f")) (transpose rs)
Кажется, вы хотите транспонировать список списков. Это относительно просто реализовать, даже не углубляясь в библиотеку.
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([]:_) = []
transpose lst = hds : transpose tls
where
hds = map head lst
tls = map tail lst
Prelude> transpose [[1,2],[3,4]]
[[1,3],[2,4]]
Просто вычислите транспонирование с помощью
Data.List.tranpsose
, а затем распечатайте строку за строкой.