【问题标题】:Haskell: Print Int from list one by oneHaskell:从列表中一一打印 Int
【发布时间】:2020-02-26 03:30:48
【问题描述】:

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

假设我有 [1..8]

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

_1_2_3_4_5_6_7_8

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

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

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

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

非常感谢您的帮助

【问题讨论】:

  • 您将IO ()Strings 混合在一起。
  • 你可以喜欢putStrLn . join . map ((' ':) . show)

标签: list haskell


【解决方案1】:

首先,定义一个将Int 转换为String 的函数,然后在结果前添加一个空格。

\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 函数来简化:

> 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

【讨论】:

    【解决方案2】:

    首先,您在这里混淆了一些东西:

    putStr :: String -> IO ()
    

    而您返回的是String,因此无需使用它。此外,[] 和单例列表没有模式,您可以添加它们以获得更好的输出,如下所示:

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

    如果要使用IO ()函数,请在main函数中使用:

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

    【讨论】:

      【解决方案3】:

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

      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 ()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 2015-08-03
        • 2011-08-22
        • 2016-07-29
        • 1970-01-01
        • 2012-02-05
        • 2012-11-11
        相关资源
        最近更新 更多