Необходимость превратить синтаксический анализатор в функтор

#haskell

#haskell

Вопрос:

Я новичок в Haskell, и я пытаюсь выполнить это упражнение.

Итак, мне нужно реализовать синтаксический анализатор функторов, чтобы реализовать прикладной анализатор.

Но я застрял на том, как реализовать функтор, даже с «подсказкой первой функции» :(. На самом деле, я не могу понять, чего мы пытаемся достичь, используя «fmap f Parser a».

Кто-нибудь может это объяснить?

Комментарии:

1. Покажите нам определение вашего типа синтаксического анализатора и попыток, которые вы предприняли при определении экземпляра самостоятельно. Но в любом случае, возможно, вам следует сначала немного почитать о функторах… на самом деле, это не так сложно, и если вы даже не можете понять, что с ними делать, то вам будет трудно реализовать Applicative экземпляр. ЛЯХ — это всегда легкое начало.

2. Я уже прочитал кое-что о функторах (например, в lyahfgg), и я могу понять использование fmap для простых (?) функторов, таких как списки, IO Monad, Возможно, Monad. Но здесь я должен сопоставить функцию с функцией типа String -> Maybe (a, String) , и в этом случае я не могу понять необходимость этого (ожидайте, что это требуется для реализации Applicative).

3. Экземпляр синтаксического анализатора functor используется для применения некоторой функции преобразования к конечному результату синтаксического анализатора, по существу изменяя a Parser a в Parser b .

Ответ №1:

Нам нужно определить

 fmap :: (a -> b) -> Parser a -> Parser b
  

Как обычно, мы начинаем с сопоставления с образцом:

 fmap f (Parser p) = _
  

Результатом должен быть синтаксический анализатор, поэтому давайте применим конструктор:

 fmap f (Parser p) = Parser _
  

Теперь нам нужна функция в дыре, String -> Maybe (b, String) . Итак, давайте сделаем один:

 fmap f (Parser p) = Parser $ s -> _
  

Я позволю вам попытаться закончить это.

Комментарии:

1. Я думаю, вы имеете в виду String -> Maybe (b, String)

2. Вот моя реализация. Но поскольку я не знаю, чего ожидать от функтора, я не знаю, нормально ли это : instance Functor Parser where fmap g (Parser f) = Parser f' where f' s = case f s of Nothing -> Nothing Just (x, ss) -> Just (g x, ss)

3. @MaximeB., да, это совершенно верно. Вы можете увидеть, чего ожидать от a Functor , прочитав документацию для класса в Hackage.

4. @dfeuer, не могли бы вы привести реальный пример того, почему я должен использовать функцию fmap поверх синтаксического анализатора?

5. @MaximeB., Я думаю, что было бы уместно задать этот вопрос отдельно.