Предлагаемые ScopedTypeVariables В шаблоне тип-подпись

Я начал писать код на Haskell. Я пытался написать функцию Фибоначчи, используя Guards -

    fibo :: (Num z, Ord z) => z -> z
    fibo d
    | d <= 0 = 0
    | d == 1 = 1
    | otherwise = fibo (d-1) + fibo (d-2)

Я получил эту ошибку:-

Подпись недопустимого типа: '(Num z, Ord z) => z -> z fibo d' Возможно, вы намеревались использовать ScopedTypeVariables в шаблоне-подписи типа

Однако, другая функция - репликация, которую я написал аналогичным образом, скомпилирована и работает нормально. Я могу написать Фибоначчи по-другому, но я хочу знать, в чем была ошибка

1 ответ

Решение

Отступы в вашей программе неверны, и странное обращение со вкладками в Stackru сделало отступы в вашем вопросе неправильными по-другому.

  1. Ваша программа должна иметь такой отступ:

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    

    Первые две строки должны начинаться в одном и том же столбце, а строки с защитой должны быть более отступы, чем эти строки.

  2. Программа, отображаемая в вашем вопросе, неверна по-другому, чем ошибка, о которой вы упоминали: строки с защитными символами должны иметь больше отступов, чем предыдущие. Это произошло из-за нестандартной обработки символов табуляции в Stackru. Не используйте вкладки.

  3. Ваша ошибка согласуется с тем, что GHC рассматривает вашу программу как отступ:

    fibo :: (Num z, Ord z) => z -> z
      fibo d               -- wrong, must start in same column as previous line
      | d <= 0 = 0
      | ...
    

    Мы можем восстановить, что ваша оригинальная программа должна быть

    <sp><sp><sp><sp>fibo :: (Num z, Ord z) => z -> z
    <tab>           fibo d
    <tab>           | d <= 0 = 0
    <tab>           | ...
    

    Не используйте вкладки.

Другие вопросы по тегам