我尝试使用\n
,putStrLn
和print
来破解行,但没有任何作用。
当我使用\n
时,结果只会连接字符串,当我使用putStrLn
或print
时,我会收到类型错误。
\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)
我理解print
和putStrLn
错误的原因,但我不知道如何解决它。
答案 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