Нет экземпляра ошибки (GHC.Base.Alternative Parser) при запуске кода Literate Haskell

Я пытаюсь выполнить примеры из книги Грэма Хаттона «Программирование на Haskell» (http://www.cs.nott.ac.uk/~gmh/book.html). Несмотря на то, что примеры написаны на грамотном хаскеле, я могу запустить ghci для загрузки примеров; например ghci cipher.lhs (http://www.cs.nott.ac.uk/~gmh/cipher.lhs):

GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( cipher.lhs, interpreted )
Ok, modules loaded: Main.
*Main> let2int 'a'
0

Однако с некоторыми примерами из-за изменений в ghci у меня возникли некоторые проблемы; например, в Parsing.ls в главе 8 у меня ошибка No instance for (Applicative ...).

Из https://ghc.haskell.org/trac/ghc/wiki/Migration/7.10 Мне подсказали убрать некоторые ошибки, добавив код.

> instance Applicative Parser where
>    pure  = return
>    (<*>) = ap  -- defined in Control.Monad
>
> instance Functor Parser where
>    fmap  = liftM
>
> instance Alternative Parser where
>     (<|>) = mplus
>     empty = mzero 

Однако я не смог разрешить это сообщение об ошибке:

Not in scope: type constructor or class ‘Alternative’

Что с этим не так, и как решить эту проблему? Исходный код, вызывающий проблему, находится по адресу http://www.cs.nott.ac.uk/~gmh/Parsing.lhs

Решение

Добавление этого кода отлично работает:

import qualified Control.Applicative as CA
instance CA.Alternative Parser where ...

person prosseek    schedule 04.08.2015    source источник
comment
рад, что мы смогли, наконец, понять это вместе - поздравляю   -  person Random Dev    schedule 04.08.2015


Ответы (2)


Прямо по размещенной вами ссылке:

GHC говорит Нет экземпляра для (Альтернатива...)

Побочным эффектом AMP является то, что Alternative стал надклассом MonadPlus. Простое средство:

Экземпляр Альтернатива Foo, где (‹|>) = mplus empty = mzero

так вот должно быть:

import Control.Applicative

instance Alternative Parser where
    (<|>) = mplus
    empty = mzero

к сожалению, я не могу точно сказать вам, подойдет ли это, потому что ссылки на код книг, которые вы предоставили, не включают экземпляр для MonadPlus

где найти недостающие определения

самый простой способ — использовать hoogle или hayoo, как вы можете видеть по ссылке Hoogle например, скажет вам, что находится в пакете base и в Control.Applicative пространстве имен

работа с множественными

Хорошо, снова мой плохой - с тобой все должно быть в порядке.

import Control.Applicative (Alternative())

or

import qualified Control.Applicative as CA

instance CA.Alternative Parser where ...

или уточнив все (например, используя Parsing.many вместо many)

еще раз извините, что я не могу дать вам 100% водонепроницаемое решение для компиляции - вам, возможно, придется немного протестировать (например, я не уверен на 100% насчет () здесь import Control.Applicative (Alternative()), и вы, вероятно, можете его разобрать.

person Random Dev    schedule 04.08.2015
comment
Если вы проверите мой исходный пост, вы обнаружите, что я включил Alternative Parser для своего добавления. Я обновил ссылку, чтобы показать код с MonadPlus и сообщением об ошибке, которое у меня есть сейчас. - person prosseek; 04.08.2015
comment
@prosseek хорошо, извините, простой import Control.Applicative должен помочь - person Random Dev; 04.08.2015
comment
обратите внимание, что сами по себе эти определения мне не сильно помогут (мне как бы нужен код, который я мог бы загрузить в ghci самостоятельно) - да, я в основном знаю, как реализовать Parser и все такое - но мне лень делать это или просто копировать сам из книги. Но вы действительно должны попытаться справиться с этими мелкими неприятностями самостоятельно - рано или поздно вам придется это сделать, и ошибка компилятора в этом последнем случае не так уж сложна для понимания IMO. - person Random Dev; 04.08.2015
comment
PS: также, пожалуйста, не редактируйте мой ответ так сильно - если он вас не устраивает, добавьте свой собственный и примите его (вы можете сделать это - вам просто нужно немного подождать, я думаю) - person Random Dev; 04.08.2015
comment
Что ж, я просто максимально упрощаю вопрос и отвечаю; Я обновлю свой вопрос, чтобы показать правильный способ сделать это. Спасибо за помощь. - person prosseek; 04.08.2015

Я также наткнулся на эту проблему. Для тех, кто хочет адаптированную версию модуля parsing.lhs просто поместите в раздел импорта:

> import qualified Control.Applicative as CA

и после определения типа Parser этот код:

> instance Applicative Parser where
>    pure  = return
>    (<*>) = ap  -- defined in Control.Monad
> 
> instance Functor Parser where
>    fmap  = liftM
> 
> instance CA.Alternative Parser where
>    (<|>) = mplus
>    empty = mzero

Или взять адаптированную версию модуля здесь https://gist.github.com/myshov/85badeb087c51631aee3

person Alexander Myshov    schedule 31.01.2016
comment
Для тех, кто проголосовал против. Моя мотивация для этого ответа заключалась не в каком-то дублировании, а в подготовке готового решения для тех, кто просто хочет получить адаптированную версию модуля для новой версии GHCI. - person Alexander Myshov; 31.01.2016