4

我的代码:

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”的函数。我该如何解决?

4

2 回答 2

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-notation 形式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 中的函数应用。

于 2012-11-13T09:48:51.340 回答
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
于 2012-11-13T09:28:32.273 回答