Haskell Let / In主要功能

时间:2012-11-13 09:23:55

标签: haskell

我的代码:

import System.IO

main :: IO()
main = do
inFile <- openFile "file.txt" ReadMode
content <- hGetContents inFile
let
    someValue = someFunction(content)
    in
    print(anotherFunction(someValue))
    print(anotherFunction2(someValue))
hClose inFile

我的错误:

- Type error in application
*** Expression     : print (anotherFunction2(someValue))
*** Term           : print
*** Type           : e -> IO ()
*** Does not match : a -> b -> c -> d

我需要使用需要“someValue”的函数打印两行或更多行。 我怎么解决它?

2 个答案:

答案 0 :(得分:8)

该错误消息的原因是当您编写

let
    someValue = someFunction(content)
    in
    print(anotherFunction(someValue))
    print(anotherFunction2(someValue))

这两个print语句实际上被解析为一个:

print (anotherFunction (someValue)) print (anotherFunction2 (someValue))

换句话说,它认为第二个print以及(anotherFunction2 (someValue))也是第一个print的参数。这就是为什么它抱怨e -> IO ()print的实际类型)与a -> b -> c -> d(一个带三个参数的函数)不匹配。

您可以通过在do之后添加in来解决此问题,以使其分离解析这两个语句:

let
    someValue = someFunction(content)
    in do
    print(anotherFunction(someValue))
    print(anotherFunction2(someValue))

但是,最好在do处使用let - 表示形式,而不使用任何in

import System.IO

main :: IO()
main = do
    inFile <- openFile "file.txt" ReadMode
    content <- hGetContents inFile
    let someValue = someFunction content
    print (anotherFunction someValue)
    print (anotherFunction2 someValue)
    hClose inFile

我还在上面的代码中删除了一些冗余的括号。请记住,它们仅用于分组,而不用于Haskell中的函数应用程序。

答案 1 :(得分:7)

在do块中使用let绑定时,请不要使用in关键字。

main :: IO()
main = do
    inFile <- openFile "file.txt" ReadMode
    content <- hGetContents inFile
    let someValue = someFunction(content)
    print(anotherFunction(someValue))
    print(anotherFunction2(someValue))
    hClose inFile