Определение для (<*) и (*>) - PullRequest
5 голосов
/ 10 марта 2020

Могу ли я считать, что приведенное ниже относится ко всем аппликативам?

f1 <* f2 = fmap const f1 <*> f2 

и

 f1 *> f2 = fmap (flip const ) f1  <*> f2  

1 Ответ

8 голосов
/ 10 марта 2020

Да. Из документации для Applicative:

Другие методы имеют следующие определения по умолчанию, которые могут быть переопределены эквивалентными специализированными реализациями:

  • u *> v = (id <$ u) <*> v
  • u <* v = liftA2 const u v

Ключевое слово "эквивалент". Поскольку ваши определения эквивалентны этим определениям *, они также должны быть эквивалентны определениям всех законных заявителей.

* Если вы не уверены, что ваши определения эквивалентны этим определениям, вот несколько советов:

  • fmap f x = f <$> x
  • liftA2 f x y = f <$> x <*> y
  • flip const = const id
  • x <$ m = const x <$> m
...