Haskell遍历列表

时间:2011-09-27 04:06:51

标签: list haskell nested loops

我知道你想在Haskell中有不同的想法,但有人可以给我一个关于如何迭代列表或嵌套列表的快速答案,并根据列表元素的值打印出一个字符。

list1 = [[1 0 0][0 1 0][0 0 1]]

通过迭代这个嵌套列表,它应该打印出x代表0和y代表1

yxx
xyx
xxy

由于

7 个答案:

答案 0 :(得分:15)

首先,我认为你的意思是:

list1 :: [[Int]]
list1 = [[1,0,0],[0,1,0],[0,0,1]]

至于你想要什么:

valueOf :: Int -> Char
valueOf 0 = 'x'
valueOf 1 = 'y'
valueOf _ = 'z'

listValues :: [[Int]] -> [String]
listValues = map (map valueOf)

printValues :: [[Int]] -> IO ()
printValues = putStrLn . unlines . listValues

然后在ghci:

*Main> printValues list1 
yxx
xyx
xxy

答案 1 :(得分:3)

试试这个:

fun :: [[Int]] -> [String]
fun = (map . map) (\x -> if x == 0 then 'x' else 'y')

如果您确实需要打印结果:

printSomeFancyList :: [[Int]] -> IO ()
printSomeFancyList = putStrLn . unlines . fun

答案 2 :(得分:2)

通过类似

的方式定义f
f x = if x == 0 then 'x' else 'y'

然后

map (map f) [[1,0,0],[0,1,0],[0,0,1]]

是你想要的,或者如果你想让它变得更加漂亮:

map' = map.map
map' f [[1,0,0],[0,1,0],[0,0,1]]

答案 3 :(得分:1)

iterateList = foldl1 (>>).concat.intersperse [putStrLn ""].(map.map) (\c ->  putStr $ if (c==0) then "X" else "Y")

答案 4 :(得分:1)

使用map的解决方案是首选的Haskell风格。但是在学习的过程中,您可能会发现更容易理解的显式递归。像这样:

charSub :: Int -> Char
charSub 0 = 'x'
charSub 1 = 'y'
charSub x = error "Non-binary value!"

listSub :: [Int] -> String
listSub [] = []
listSub (x:xs) = (charSub x) : (listSub xs)

nestedSub :: [[Int]] -> String
nestedSub [] = []
nestedSub (y:ys) = (listSub y) ++ "\n" ++ (nestedSub ys) 

map几乎完全相同 - 它将一个函数应用于列表中的每个元素。但是可能更容易看到这里发生了什么。

答案 5 :(得分:0)

如果您对任意嵌套列表感兴趣,那么您可以编写类似这样的内容(任意嵌套列表本质上是一棵树):

data Nested a = Leaf a | Nest [Nested a] deriving Show

traverse :: Nested Integer -> Nested Char
traverse (Leaf x) = Leaf (valueOf x)
traverse (Nest xs) = Nest (map traverse xs)

valueOf :: Integer -> Char
valueOf 0 = 'x'
valueOf 1 = 'y'
valueOf _ = 'z'

你可以这样做:

Main> let nl = Nest [Leaf 1, Leaf 0, Nest [Leaf 0, Leaf 0, Leaf 1, Nest [Leaf 1, Leaf 1, Leaf 0]], Nest [Leaf 1, Leaf 1]]
Main> traverse nl
Nest [Leaf 'y',Leaf 'x',Nest [Leaf 'x',Leaf 'x',Leaf 'y',Nest [Leaf 'y',Leaf 'y',Leaf 'x']],Nest [Leaf 'y',Leaf 'y']]

函数traverse采用任意嵌套的Integer列表,并根据Char规则返回valueOf s的相应嵌套列表

答案 6 :(得分:-1)

解决方案

cambiar = putStr.unlines.(map (map f)) where f x = if x == 0 then 'x' else 'y'