麻烦拍摄Haskell程序

时间:2017-02-28 12:51:31

标签: haskell

有谁能告诉我这个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

谢谢,

1 个答案:

答案 0 :(得分:0)

这是您需要关注的重点:

 In the expression: getContents putStrLn

这是haskell向您展示它如何查看您的代码,但您的代码看起来并非如此。这几乎总是一个缩进错误。检查您是否没有额外的空间或不属于它的标签。

作为阅读haskell类型错误消息时的建议,有三个地方可供查看,您应该先扫描所有这些消息,然后再确定一个:

  • 类型签名信息 - 您的类型是否真的匹配?
  • 表达式信息 - 编译器看到的表达式是否符合您的期望,或者您是否需要添加$或parens
  • 是否存在拼写错误或缩进问题。

我经常觉得我的大脑开始过热,因为我试图通过一个非常混乱的Couldn't match expected type来阅读所以在我因为试图阅读错误消息的那部分而感到太烦恼之前我仔细检查了In the expression:部分是为了确保我输入代码的方式有一个容易解决的问题。