Основы компиляции Haskell

Я работаю над второй проблемой Эйлера, а пока просто пытаюсь определить последовательность Фибоначчи. В настоящее время у меня есть функция Фибоначчи, определенная как

Fib 0 = 0
Fib 1 = 1
Fib x = Fib (x - 1) + Fib (x - 2)

Поскольку я хочу, чтобы программа зависела от моего ввода с клавиатуры, я использовал

main = do
        putStrLn "Enter desired Fibonacci index: "
        "index" <- getLine
        putStrLn Fib x

И определил x как x = read "index"

Я почти уверен, что испортил как отступ, так и свой синтаксис. В зависимости от того, как я модифицирую код, запуск «ghc /dir/file.hs» выдает мне что-то вроде «Не входит в область: конструктор данных `Fib'» или «ошибка синтаксического анализа (возможно, неправильный отступ)». я не знаю, что, черт возьми, я делаю, особенно в отношении того, как настроить .hs для компиляции.Я прочитал около 7 руководств по компиляции с помощью GHC, но все они, похоже, пропускают ту часть, где объясняют основные требования к компиляции.

Пожалуйста, дайте мне знать, как я могу быть более конкретным, если это поможет. Я думаю, что две вещи, которые я пытаюсь понять, это то, как вся «основная» вещь связана с компиляцией, и как я могу заставить ее распознать, что я определил Фибоначчи как функцию, даже если она говорит, что это не входит в область действия.

PS: Я не могу понять здесь отступ, кажется, Стек хочет поместить все в одну строку, поэтому мне нужно все это разделить. Прости.


person Community    schedule 19.12.2009    source источник
comment
Если вы их еще не знаете, другие функции, которые будут полезны для полного решения: sum, filter и takeWhile.   -  person Jonno_FTW    schedule 19.12.2009


Ответы (5)


Первая буква Фибоначчи не должна быть заглавной. Слова, написанные с заглавной буквы, указывают на тип. Функции должны начинаться со строчной буквы.

Компиляция выглядит отлично!

Вы также получите несколько других ошибок при компиляции. Помните, что putStrLn принимает String в качестве аргумента. Ваша функция fib возвращает Integer. Вы можете использовать show для преобразования значения в String.

person Jeff Foster    schedule 19.12.2009
comment
Просто примечание: идентификаторы с заглавной буквы указывают на конструкторы данных (как в этой ошибке) или конструкторы типов (в контексте типа) или имена модулей (в контексте модуля). - person Don Stewart; 19.12.2009

Просто подытожу:

  • Ваш отступ выглядит нормально.
  • Имена функций не могут начинаться с заглавной буквы. Идентификаторы с заглавной буквы используются только для имен конструкторов, типов и модулей.
  • Вы можете проверить свои вещи с помощью интерактивного интерпретатора, и вам не нужна основная функция.
  • Вам нужно имя переменной, если вы хотите сохранить результат некоторых вычислений, поэтому результат getLine должен быть привязан к index, а не "index". Первым будет строка переменная, а не строка значение.
  • putStrLn принимает только один параметр (показываемую строку). В вашей программе он получает два параметра: функцию Fib и некоторый неопределенный x.
  • Кстати, вам нужно определить x, вероятно, используя read для преобразования входной строки в целочисленное значение.
  • Кроме того, putStrLn нужна строка, а Fib возвращает целое число, вам нужно преобразовать его перед передачей: putStrLn (show (Fib x)).
person Thiago Arrais    schedule 19.12.2009

Вот ваш код, исправленный, чтобы вы могли его скомпилировать.

fib 0 = 0
fib 1 = 1
fib x = fib (x - 1) + fib (x - 2)

main = do
        putStrLn "Enter desired Fibonacci index: "
        index <- getLine
        print (fib (read index))

У тебя была пара проблем. Функции начинаются со строчных букв. Во-вторых, вы не можете применить putStrLn к результату fib, потому что fib возвращает целое число, а putStrLn ожидает String. Поэтому я использовал print вместо этого. Кроме того, вы пытались использовать строку ("index") в качестве переменной. Это правда, что вы получаете String из getLine, но оно должно быть сохранено в переменной, а переменная не заключена в кавычки.

Обратите внимание, как и сказал Барри, вам на самом деле не нужна функция main. Просто поместите свою функцию фибоначчи в файл, загрузите ее в ghci и вызовите функцию оттуда. Очень просто.

Также обратите внимание, что ваша функция Фибоначчи ужасно медленная, но я надеюсь, вы уже знаете об этом.

Удачи в решении задач Эйлера. Я нашел довольно забавным использовать Haskell для их решения.

person svenningsson    schedule 22.12.2009

Не заморачивайтесь с основной функцией. Просто запустите ghci, загрузите свой модуль и вызовите функцию fib напрямую.

person Barry Brown    schedule 19.12.2009

IIRC, getLine возвращает строку, поэтому вы должны привязать ее к переменной

do
   idx <- getLine
   print $ fib $ read idx
person Macke    schedule 19.12.2009
comment
Это не сработает, так как fib принимает числовое значение. Последняя строка должна быть putStrLn $ show $ fib $ read idx. Кроме того, вы можете использовать print вместо putStrLn . show. - person yatima2975; 19.12.2009
comment
Вы правы. Мой Haskell ржавеет. - person Macke; 20.12.2009