Как я должен был выяснить, что мне не удалось полностью применить функцию из этого сообщения об ошибке GHC? - PullRequest
3 голосов
/ 07 ноября 2011

Я получил сообщение об ошибке от ghc, которое я не понял, и уменьшил свой код до:

import System.Process

main = do
  (_, out, _) <- readProcessWithExitCode "echo" ["foo"]
  putStr out

(я должен был предоставить дополнительный аргумент readProcessWithExitCode).Компиляция этой неработающей программы с использованием runghc дает:

Test.hs:4:2:
    Couldn't match expected type `IO
                                    (GHC.IO.Exception.ExitCode, String, String)'
           against inferred type `(a, b, c)'
    In the pattern: (_, out, _)
    In a stmt of a 'do' expression:
        (_, out, _) <- readProcessWithExitCode "echo" ["foo"]
    In the expression:
        do { (_, out, _) <- readProcessWithExitCode "echo" ["foo"];
             putStr out }

Как я мог выяснить, что мне не удалось полностью применить функцию из этого сообщения об ошибке ghc?

1 Ответ

10 голосов
/ 07 ноября 2011

Если вы указали сигнатуру типа main :: IO (), то ошибка станет:

test.hs:5:18:
    Couldn't match expected type `IO t0'
                with actual type `String
                                  -> IO (GHC.IO.Exception.ExitCode, String, String)'
    In the return type of a call of `readProcessWithExitCode'
    In a stmt of a 'do' expression:
        (_, out, _) <- readProcessWithExitCode "echo" ["foo"]
    In the expression:
      do { (_, out, _) <- readProcessWithExitCode "echo" ["foo"];
           putStr out }

В этом случае ошибка гораздо более очевидна.

Я предполагаю, что ошибка не так очевидна, потому что, выводя тип, GHC считает, что вы находитесь в монаде функции (т.е. (a->)), а не в IO, и в этом случае вы будете применять аргумент впоследствии .

Так что не ленитесь, и включайте эти типовые подписи! ; -)

...