Где в моем коде Haskell ошибка отступа / разметки? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь завершить sh простое домашнее задание в Haskell для класса в моем университете, но я не могу понять, почему мой код не скомпилируется:

-- Comments
module Main where

main :: IO ()
main = do
  n <- readLn
  print (fac n)
  print (facList n)
  print (sumFacs n)
  print (fibonacci n)

-- Aufgabe 2 (a):
fac :: Int -> Int
let
  fac 0 = 1
  fac i = i * fac(i - 1)

-- Aufgabe 2 (b):
facList :: Int -> Int -> [Int]
let
  facList x y = [fac m | m <- [x..y]]

sumFacs :: Int -> Int -> Int
let
  sumFacs x y = sum (facList x y)

-- Aufgabe 3:
fibonacci :: Int -> Int
let
  fibonacci 0 = 1
  fibonacci 1 = 1
  fibonacci i = fibonacci (i - 1) + fibonacci (i - 2)

Когда Я пытаюсь скомпилировать приведенный выше код с помощью компилятора Глазго, я получаю следующее сообщение об ошибке:

Uebung01.hs:19:1: error:
    parse error (possibly incorrect indentation or mismatched brackets)
   |
19 | facList :: Int -> Int -> [Int]
   | ^

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

1 Ответ

3 голосов
/ 12 апреля 2020

A let block [Haskell -report] ожидает in для указания выражения. В вашей функции fac вы определяете блок let, но без in это используется для определения локальной переменной (переменных), которые вы затем можете использовать в предложении in. Однако вам здесь не нужно a let, вы можете определить fac как:

fac :: Int -> Int
fac 0 = 1
fac i = i * fac (i - 1)

Вам необходимо аналогичным образом реорганизовать другие функции.

...