Вызов главной функции с аргументами - программирование
Подтвердить что ты не робот

Вызов главной функции с аргументами

У меня проблема с чтением из файла. Всякий раз, когда мне нужно читать из файла, я делаю что-то вроде этого:

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'

Моя домашняя задача - написать программу, и программа должна содержать основную функцию (потому что она будет скомпилирована), а аргумент вызова должен содержать имя файла. Я не уверен, что понимаю это, и я не знаю, как это сделать. Я буду благодарен за помощь.

4b9b3361

Ответ 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 есть отличный учебник по этой теме.