Я пытаюсь понять Cont в Haskell, поэтому я реализую Functor
, Applicative
и Monad
для этого.
Я определяю Cont
как newtype Cont r a = Cont {runCont :: (a -> r) -> r}
Теперь я пытаюсь реализовать <*>
.
Я полагаю, что реализация
Cont func <*> Cont value = (\r -> value (\a -> func (\c -> r (c a))))
но в MTL Cont func <*> Cont value = Cont (\r -> func (\f -> value (\ a -> r (f a) )))
обнаружил эту реализацию.
Теперь мой вопрос: как я могу убедиться, что моя реализация верна?
Я думаю, чтобы доказать Applicative
законы, но для меня это не очевидно, как это сделать.