Haskell - Что делает «главное» уникальным? - PullRequest
7 голосов
/ 07 июня 2011

С этим кодом:

main :: FilePath -> FilePath -> IO ()
main wrPath rdPath = do x <- readFile rdPath
                        writeFile wrPath x

Я получил следующую ошибку:

Couldn't match expected type 'IO t0'
            with actual type 'FilePath -> FilePath -> IO()

Но файл правильно компилируется, когда я меняю имя 'main' на другое.

Что такого особенного в main и почему его тип должен быть IO t0?

Ответы [ 4 ]

22 голосов
/ 07 июня 2011

Потому что спецификация языка так говорит .

Программа на Haskell - это набор модулей, один из которых, по соглашению, должен называться Main и должен экспортировать значение main. Значением программы является значение идентификатора main в модуле Main, которое должно быть вычислением типа IO t для некоторого типа t (см. Главу 7). Когда программа выполняется, вычисление main выполняется, и ее результат (типа t) отбрасывается.

4 голосов
/ 07 июня 2011

Как сказал GolezTrol, все программы должны знать, какой символ начать выполнять при вызове функции.Многие языки сценариев не требуют (или просто не нуждаются) подпрограммы main, поскольку они могут иметь операторы, размещенные на верхнем уровне.Это не относится к Haskell, C и многим другим - эти языки нуждаются в начальной позиции и по соглашению это функция main (согласно спецификации Haskell - см. Ответ Cat).

Обратите внимание на Haskell main не принимает параметры, соответствующие аргументам программы - они получены через System.Environment.getArgs.

3 голосов
/ 07 июня 2011

Как и в C, Java или C #, main - это специальный идентификатор в определенных контекстах, который указывает, где должна начинаться программа.

В Haskell, main определен, чтобы иметь тип IO a.Вам следует либо дать вашей функции другое имя, либо, если вы действительно хотите, чтобы она была отправной точкой, измените ее сигнатуру и попросите ее прочитать аргументы из командной строки с помощью getArgs

Хотя вы этого не сделалиспросите это конкретно, main также особенное в том, что это единственная функция в программе на Haskell, которая может (безопасно) вызывать действия ввода-вывода.Во время выполнения на Haskell main рассматривается как особый.

1 голос
/ 07 июня 2011

По определению, main - это функция, которая не принимает аргументов и возвращает значение типа IO a, которое отбрасывается средой выполнения. Ваше сообщение об ошибке говорит о том, что ваш main не соответствует этим требованиям. Это действительно так, поскольку ваш main получает два параметра.

Чтобы получить доступ к параметрам командной строки, используйте System.Environment.getArgs.

...