Как определить (*>), (<*) в терминах (<*>) и чисто? - PullRequest
1 голос
/ 11 ноября 2019

Я могу определить их, используя монады.

(<*) :: Monad m => m a -> m b -> m a
(<*) fa fb = fa >>= \a -> (fb >>= \_ -> return a)
(<*) fa fb = ??? -- In terms of pure & (<*>)

(*>) :: Monad m => m a -> m b -> m b
(*>) fa fb = fa >>= \_ -> (fb >>= \b -> return b)
(*>) fa fb = ??? -- In terms of pure & (<*>)

(\*>) и (<\*) считаются операторами последовательности. Могу ли я с уверенностью предположить, что заявители могут работать как в последовательном, так и в параллельном режиме? Монады - это лишь подкатегория аппликативов, способных только на последовательные действия. И даже если это не имеет значения, порядок операций для нескольких монад, таких как монада считывателя (пример чтения конфигураций из HashMap настроек среды)?

1 Ответ

4 голосов
/ 11 ноября 2019

Стандартное определение:

(<*) :: Applicative m => m a -> m b -> m a
(<*) fa fb = (\a _ -> a) <$> fa <*> fb

Затем мы можем применить закон f <$> x = pure f <*> x только для использования <*> и pure.

Другое аналогично.

...