#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., Я думаю, что было бы уместно задать этот вопрос отдельно.