我的代码:
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”的函数打印两行或更多行。 我怎么解决它?
答案 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