在 Haskell 中按行打印列表列表

问题描述 投票:0回答:2

我正在尝试在 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] 
haskell
2个回答
0
投票

您可以使用

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)

0
投票

您似乎想转置列表的列表。即使不深入图书馆,实现起来也相对简单。

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]]
© www.soinside.com 2019 - 2024. All rights reserved.