Неоднозначное появление "Просто"

Я абсолютный новичок. Прохождение LYAH с помощью emacs.

Моя текущая настройка:

  • Ubuntu 12.04 LTS (опыт использования — новичок)
  • GNU Emacs 23 (Use Experience - beginner)
    • able to work in haskell major mode

Возникли сложности с выполнением инструкций (принести библиотеки Haskell) в пункт 2, описанный здесь.

Также требуется руководство по включению Scion IDE.

Проблема:

.hs-код

data Maybe a = Nothing | Just a

При запуске кода я получаю следующую ошибку:

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

*Main> just "Haha"  

интерактивный>:339:1: Не входит в область действия: `просто'

Это настоящая ошибка (добавлено после комментария Тихона Джелвиса):

*Main> Just "Haha"  
interactive>:341:1:  
    Ambiguous occurrence `Just'  
    It could refer to either `Main.Just',    
                             defined at /home/optimight/baby.hs:89:26  
                          or `Prelude.Just',  
                             imported from `Prelude' at /home/optimight/baby.hs:1:1  
                             (and originally defined in `Data.Maybe')  

person Optimight    schedule 21.07.2012    source источник
comment
детскими шажками -- ха-ха-ха, впервые вижу честную просьбу кормить с ложечки. прохладно. :)   -  person Nishant    schedule 21.07.2012
comment
Эм, just должно начинаться с заглавной буквы. Так что вы должны были написать Just "Haha". Это опечатка в вопросе или что вы на самом деле ввели в GHCi?   -  person Tikhon Jelvis    schedule 21.07.2012


Ответы (1)


Ваша ошибка просто говорит вам, что существует две возможные версии Just, и GHCi не знает, какую из них выбрать.

Каждая программа на Haskell неявно импортирует целый набор функций и типов данных. Они образуют «прелюдию». Одним из таких типов является Maybe. Это означает, что каждая отдельная программа уже имеет доступ к типу, подобному тому, который вы определили, с точно такими же именами.

Вы можете преодолеть это двумя способами. Лучшим вариантом будет просто выбрать разные имена:

data MyMaybe a = MyJust a | MyNothing

(Я уверен, что вы можете придумать имена получше, чем это: P.)

Другой вариант — явно импортировать Prelude, скрывая Maybe:

import Prelude hiding (Maybe (..))

Эта строка в верхней части вашей программы просто говорит Haskell импортировать все, что он обычно импортирует, кроме Maybe и всех его конструкторов (Just и Nothing).

Теперь вы столкнетесь с еще одной проблемой: GHCi не знает, как преобразовать значение вашего типа Maybe в строку для отображения в подсказке. Вы получите такую ​​ошибку:

<interactive>:1:1:
No instance for (Show (Maybe [Char]))
  arising from a use of `print'
Possible fix: add an instance declaration for (Show (Maybe [Char]))
In a stmt of an interactive GHCi command: print it

Что вам нужно сделать, так это сообщить компилятору, как значение Maybe выглядит как строка. К счастью, это очень легко. На самом деле, это настолько легко, что это может сделать даже компьютер! Если вы определяете свой тип как:

data Maybe a = Just a | Nothing deriving (Show)

тогда компилятор напишет для вас функцию show (которая в основном toString из других языков). Теперь ваш исходный оператор (Just "Haha") должен работать правильно.

Кроме того: включение Scion — это совершенно другой вопрос. Я не думаю, что стоит с этим заморачиваться, пока вы больше не изучите Haskell и не начнете работать над каким-то более крупным проектом. На данный момент стандартного режима Haskell должно быть более чем достаточно.

person Tikhon Jelvis    schedule 21.07.2012
comment
Сэр, моя скромная просьба добавить еще один вариант: это была моя ошибка, что я объявлял «данные, возможно, а», которые уже объявлены и входят в Prelude. Можно выбрать не объявлять это явно, а напрямую протестировать «Просто ха-ха». - person Optimight; 21.07.2012
comment
Когда я запускаю data MyMaybe a = MyJust a | MyNothin, он компилируется нормально. Когда я затем запускаю MyJust "blank", я получаю сообщение об ошибке No Instance for (Show... Я могу понять, почему я получаю эту ошибку, но Learn You A Haskell показывает поведение, отличное от ошибки, можете ли вы объяснить, почему? - person Addem; 24.02.2017
comment
Я не знаю, что показывает LYAH для этой задачи. Проблема возникает из-за того, что MyMaybe не имеет экземпляра Show: вы можете либо реализовать его вручную, либо добавить предложение deriving Show в определение данных. - person Tikhon Jelvis; 25.02.2017