有谁能告诉我这个Haskell程序有什么问题
import Control.Monad
import Data.Char
main = do
contents <- getContents
putStrLn $ contents
putStr $ "shortLinesOnly version is " ++ (shortLinesOnly contents)
putStr $ "printOnlyLessChars version is " ++ (printOnlyLessChars contents)
shortLinesOnly :: String -> String
shortLinesOnly input =
let allLines = lines input
shortLines = filter (\line -> length line < 10) allLines
result = unlines shortLines
in result
--------------------the other way of doing this is -----------------
printOnlyLessChars contents = unlines $ filter (\a -> length a < 10) $ lines $ contents
该程序运行正常,但在我尝试打印内容时失败(第5行)。为什么在通过putStrLn打印字符串时遇到问题
我收到的错误消息是
* Couldn't match expected type `(String -> IO ())
-> t0 -> IO String'
with actual type `IO String'
* The function `getContents' is applied to one argument,
but its type `IO String' has none
In the expression: getContents putStrLn
谢谢,
答案 0 :(得分:0)
这是您需要关注的重点:
In the expression: getContents putStrLn
这是haskell向您展示它如何查看您的代码,但您的代码看起来并非如此。这几乎总是一个缩进错误。检查您是否没有额外的空间或不属于它的标签。
作为阅读haskell类型错误消息时的建议,有三个地方可供查看,您应该先扫描所有这些消息,然后再确定一个:
$
或parens 我经常觉得我的大脑开始过热,因为我试图通过一个非常混乱的Couldn't match expected type
来阅读所以在我因为试图阅读错误消息的那部分而感到太烦恼之前我仔细检查了In the expression:
部分是为了确保我输入代码的方式有一个容易解决的问题。