我怎样才能在Haskell上打破界线?

时间:2017-02-25 15:30:29

标签: haskell

我尝试使用\nputStrLnprint来破解行,但没有任何作用。

当我使用\n时,结果只会连接字符串,当我使用putStrLnprint时,我会收到类型错误。

\n的输出:

formatLines [("a",12),("b",13),("c",14)]
"a...............12\nb...............13\nc...............14\n"

putStrLn的输出:

format.hs:6:22:
    Couldn't match type `IO ()' with `[Char]'
    Expected type: String
      Actual type: IO ()
    In the return type of a call of `putStrLn'
    In the expression:
      putStrLn (formatLine ((fst x), (snd x)) ++ formatLines xs)
    In an equation for `formatLines':
        formatLines (x : xs)
          = putStrLn (formatLine ((fst x), (snd x)) ++ formatLines xs)
Failed, modules loaded: none.

print的输出与putStrLn

的输出相同

这是我的代码:

formatLine :: (String,Integer) -> String
formatLine (s, i) = s ++ "..............." ++ show i

formatLines::[(String,Integer)] -> String
formatLines [] = ""
formatLines (x:xs) = print (formatLine ((fst x), (snd x)) ++ formatLines xs) 

我理解printputStrLn错误的原因,但我不知道如何解决它。

2 个答案:

答案 0 :(得分:5)

将代码分为两部分。

一部分只是构造字符串。使用foo :: String -> Int -> String foo s n = s ++ "\n" ++ show (n*10) ++ "\n" ++ s bar :: IO () bar = putStrLn (foo "abc" 42) -- or putStr (...) for no trailing newline baz :: String -> IO () baz s = putStrLn (foo s 21) 作为换行符。

第二部分接受字符串并对其应用print(NOT \n)。新行将正确打印。

示例:

print

如果您使用IO (something),则会打印字符串表示形式,其中包含引号和转义符(如\b)。仅将text = ' ... another number as an input instead of the 3, so I would have something like this ' order = 5 #for example words = re.findall(r'\b\w{{{}}}\b'.format(order), text) print(words) 用于必须转换为字符串的值,例如数字。

另请注意,您只能在返回类型为['input', 'would'] 的函数中执行IO(如打印内容)。

答案 1 :(得分:1)

您需要将结果打印到输出。

这是一个IO操作,因此您不能拥有以-> String结尾的函数签名。相反,正如@chi指出的那样,返回类型应为IO ()。此外,由于您已经具有生成格式化字符串的功能,因此您只需要一个功能来帮助您在输入列表上映射打印操作。这可以使用mapM_,如下所示:

formatLines::[(String,Integer)] -> IO ()
formatLines y = mapM_ (putStrLn . formatLine) y

Demo