List Haskell:逐个打印列表中的Int

List Haskell:逐个打印列表中的Int,list,haskell,List,Haskell,我有一个关于我想在Haskell做的事的简短问题。 我的基本目标是创建一个从1到特定值y的整数列表。例如[1..y],然后在每个数字之间用空格打印此列表 假设我有[1..8] 我想要的输出是(“\u1”表示空格): 我玩过一些不同的东西,但没有运气 这就是到目前为止Iv的基本情况 printLst :: [Int] -> String printLst (x:xs) = " " ++ putStr (show x) >> printLst xs 我一直在网上搜索,想找到解决这

我有一个关于我想在Haskell做的事的简短问题。 我的基本目标是创建一个从1到特定值y的整数列表。例如[1..y],然后在每个数字之间用空格打印此列表

假设我有[1..8]

我想要的输出是(“\u1”表示空格):

我玩过一些不同的东西,但没有运气

这就是到目前为止Iv的基本情况

printLst :: [Int] -> String
printLst (x:xs) = " " ++ putStr (show x) >> printLst xs
我一直在网上搜索,想找到解决这个问题的方法,但我没有找到任何能帮助我做到这一点的方法


非常感谢您的帮助

首先,您把这里的事情弄糊涂了:

putStr :: String -> IO ()
您返回的是一个
字符串
,因此无需使用该字符串。另外,您没有
[]
和单例列表的模式,您可以添加它们以获得更好的输出,如下所示:

printLst :: [Int] -> String
printLst [] = ""
printLst [x] = (show x)
printLst (x:xs) = (show x) ++ " " ++ printLst xs
如果要使用
IO()
函数,请在主函数中使用它:

main = do
  putStrLn (printLst [1..8])
> concatMap (\x -> ' ':show x) [1..8]
" 1 2 3 4 5 6 7 8"

这是一个列表处理问题。对于空列表,我们可以返回空字符串,对于非空列表,我们可以首先生成一个空格,后跟该项的
show
,然后在该列表的其余部分递归,如:

prefixSpace :: Show a => [a] -> String
prefixSpace [] = ""
prefixSpace (x:xs) = ' ' : show x ++ prefixSpace xs
或作为“折叠”模式:


这将不会打印字符串。为此,您需要,但正如签名所示,如果您
输入一些字符串
,则使用
IO()

,首先定义一个函数,该函数将
Int
转换为
字符串
,然后在结果前面加一个空格

\x -> ' ' : show x
现在将此映射到您的列表:

>  map (\x -> ' ' : show x) [1..8]
[" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"]
现在我们只需要将所有字符串连接成一个:

> concat (map (\x -> ' ' : show x) [1..8])
" 1 2 3 4 5 6 7 8"
这可以使用
concatMap
功能简化:

main = do
  putStrLn (printLst [1..8])
> concatMap (\x -> ' ':show x) [1..8]
" 1 2 3 4 5 6 7 8"
它构成列表的
Monad
实例的基础:

> [1..8] >>= (\x -> ' ' : show x)
" 1 2 3 4 5 6 7 8"
或者更简单地说,使用函数组合

> [1..8] >>= (' ' :) . show
" 1 2 3 4 5 6 7 8"
一旦得到最后一个字符串,现在就可以担心打印它了

> putStrLn $ [1..8] >>= (' ' :) . show
 1 2 3 4 5 6 7 8

您正在将
IO()
String
s混合。您可以像
putstrn那样进行操作。参加地图((“”:).show)