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」を必要とする関数を含む 2 行以上を出力する必要があります。どうすれば修正できますか?

4

2 に答える 2

8

そのエラーメッセージの原因は、あなたが書くときです

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

2 つのprintステートメントは、実際には 1 つとして解析されます。

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

言い換えれば、それは 2 番目print(anotherFunction2 (someValue))1 番目への引数でもあると考えprintます。e -> IO ()これが、 (の実際の型print) が一致しないa -> b -> c -> d(3 つの引数を取る関数)と不平を言う理由です。

これを修正するには、 のdo後にa を追加しinて、2 つのステートメントを別々に解析するようにします。

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

ただし、ここではdo-notation 形式を使用することをお勧めします。letin

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ブロックでletbindingを使用する場合は、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 に答える