Получение строки из монады IO ExitCode - PullRequest
2 голосов
/ 19 ноября 2011

Я пытаюсь объединить строку, заданную в качестве аргумента (используя getArgs) для программы на haskell, например: "rm " ++ filename ++ " filename2.txt", который находится внутри блока main = do.

Проблема связана с типом имени файла, и ghc не скомпилирует его, выдав ошибку.

Я получаю ошибку Couldn't match expected type [a] against inferred type IO ExitCode

код, который мы пытаемся запустить:

args <- getArgs
let inputfname = head args
system "rm -f "++ inputfname ++ " functions.txt"

Ответы [ 3 ]

7 голосов
/ 19 ноября 2011

Вам нужно $:

system $ "rm -f "++ inputfname ++ " functions.txt"

Или круглые скобки:

system ("rm -f " ++ inputfname ++ " functions.txt")

В противном случае вы пытаетесь запустить это:

(system "rm -f ") ++ inputfname ++ " functions.txt"

Сбой, потому что ++ хочет [a] (в данном случае String), но получает IO ExitCode (из system).

3 голосов
/ 19 ноября 2011

Проблема в том, что приложение функции имеет более высокий приоритет, чем оператор (++), поэтому оно анализируется как

(system "rm -f ") ++ inputfname ++ " functions.txt"

в то время как вы имели в виду

system ("rm -f " ++ inputfname ++ " functions.txt")

или просто

system $ "rm -f " ++ inputfname ++ " functions.txt"
0 голосов
/ 19 ноября 2011

Работает следующий код:

import System.Process
import System.Environment

main = do
   args <- getArgs
   let inputfname = head args
   system $ "rm -f "++ inputfname ++ " functions.txt"

Причины были объяснены другими комментаторами.

...