繁体   English   中英

Haskell:从列表中一一打印 Int

[英]Haskell: Print Int from list one by one

关于我想在 Haskell 中做的事情,我有一个简短的问题。 我的主要目标是制作一个从 1 到特定值 y 的整数列表。 像 [1..y] 一样,打印这个列表,每个数字之间有空格

假设我有 [1..8]

我想要的 output 是(“_”代表空格):

_1_2_3_4_5_6_7_8

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

这基本上是我到目前为止所得到的

printLst :: [Int] -> String
printLst (x:xs) = " " ++ putStr (show x) >> printLst xs

我一直在搜索 web 以找到任何解决方案,但我没有找到任何可以帮助我做到这一点的东西。

非常感谢帮助

首先,定义一个 function 将Int转换为String ,然后在结果前面加上一个空格。

\x -> ' ' : show x

现在 map 在您的列表中:

>  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 function 来简化:

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

其中 forms 是Monad实例列表的基础:

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

或者更简单地说,使用 function 组合

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

一旦你有了最终的字符串,现在你可以担心打印它了。

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

好吧,首先,您在这里混淆了事物:

putStr :: String -> IO ()

而且您正在返回一个String ,因此无需使用它。 此外,您没有[]和 singleton 列表的模式,您可以添加它们以获得更好的 output ,如下所示:

printLst :: [Int] -> String
printLst [] = ""
printLst [x] = (show x)
printLst (x:xs) = (show x) ++ " " ++ printLst xs

如果要使用IO () function,在主function中使用:

main = do
  putStrLn (printLst [1..8])

这是一个列表处理问题。 对于空列表,我们可以返回空字符串,对于非空列表,我们可以先产生一个空格,然后show该项目,然后在该列表的 rest 上递归,如:

prefixSpace :: Show a => [a] -> String
prefixSpace [] = ""
prefixSpace (x:xs) = ' ' : show x ++ prefixSpace xs

或作为“折叠”模式:

prefixSpace :: Show a => [a] -> String
prefixSpace = foldr (\x -> ((' ' : show x) ++)) ""

不会打印字符串。 为此,您需要putStrLn:: String -> IO () ,但正如签名所示,如果您putStrLn some_string ,您将使用IO ()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM