我正在尝试在 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)
您似乎想转置列表的列表。即使不深入图书馆,实现起来也相对简单。
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([]:_) = []
transpose lst@((_:xs):ys) = hds : transpose tls
where
hds = map head lst
tls = xs : map tail ys
Prelude> transpose [[1,2],[3,4]]
[[1,3],[2,4]]