Вызов главной функции с аргументами
У меня проблема с чтением из файла. Всякий раз, когда мне нужно читать из файла, я делаю что-то вроде этого:
main = do x <- readFile "/tmp/foo.txt"
putStr x
Но теперь я хотел бы, чтобы путь был аргументом, поэтому я попробовал следующее
main s = do x <- readFile s
putStr x
Это не работает. Я вижу следующую ошибку:
Couldn't match expected type `IO t0'
with actual type `FilePath -> IO ()'
In the expression: main
When checking the type of the function `main'
Моя домашняя задача - написать программу, и программа должна содержать основную функцию (потому что она будет скомпилирована), а аргумент вызова должен содержать имя файла. Я не уверен, что понимаю это, и я не знаю, как это сделать. Я буду благодарен за помощь.
Ответы
Ответ 1
Отчет Haskell указывает, что функция main
всегда имеет тип IO t
, (для некоторого типа t
, который будет проигнорирован ) и, следовательно, никогда не принимает нормальных аргументов функции, поэтому это неправильный подход.
Вы ищете функцию getArgs
(для которой вам нужно импортировать модуль System.Environment
. Он возвращает аргументы, переданные в ваша программа в виде списка String
s.
Итак, ваш код будет выглядеть так:
import System.Environment
main = do
args <- getArgs
case args of
[file] -> do
x <- readFile file
putStr x
_ -> putStrLn "Wrong number of arguments"
Ответ 2
В Haskell аргументы НЕ передаются основной функции из-за того, как Haskell связывает его запуск и остается последовательным. Вам нужно использовать System.Environment.getArgs
.
В частности, поскольку Haskell является чистым функциональным языком, main
является монадическим действием, которое организует вычисления с побочным эффектом, выполняемые программным обеспечением - результат, вычисленный с помощью main
, отбрасывается, потому что на функциональных языках вы отделяются от окружающей среды по вычисление и только взаимодействовать с ним как побочный эффект.
Пример
import System.Environment
main = do x <- getArgs; print x
Это напечатает все, что вы набираете в командной строке.
В вики Haskell есть отличный учебник по этой теме.