Основы компиляции на Haskell - PullRequest
1 голос
/ 19 декабря 2009

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

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 = read "index"

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

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

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

Ответы [ 5 ]

8 голосов
/ 19 декабря 2009

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

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

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

5 голосов
/ 19 декабря 2009

Просто подытожив:

  • Ваш отступ выглядит нормально.
  • Имена функций не могут начинаться с заглавной буквы. Идентификаторы с заглавной буквы используются только для конструкторов, имен типов и модулей.
  • Вы можете проверить свои вещи с помощью интерактивного переводчика, и вам не нужна основная функция.
  • Вам нужно имя переменной, если вы хотите сохранить результат некоторых вычислений, поэтому результат getLine должен быть привязан к index, а не "index". Первой будет строка переменная , а не строка значение .
  • putStrLn принимает только один параметр (отображаемую строку). В вашей программе он получает два параметра: функцию Fib и некоторые неопределенные x.
  • Кстати, вам нужно определить x, возможно, используя read для преобразования входной строки в целочисленное значение.
  • Кроме того, putStrLn нужна строка, а Fib возвращает целое число, вам нужно преобразовать его перед передачей: putStrLn (show (Fib x)).
2 голосов
/ 22 декабря 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 для их решения.

1 голос
/ 19 декабря 2009

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

do
   idx <- getLine
   print $ fib $ read idx
1 голос
/ 19 декабря 2009

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

...