Реализация Cont Applicative экземпляра - PullRequest
0 голосов
/ 29 декабря 2018

Я получил следующую ошибку при реализации экземпляра Applicative для Cont.

Не удалось сопоставить ожидаемый тип 'r' с фактическим типом 'Cont rb' 'r' - это переменная жесткого типа, ограниченная ...

newtype Cont r a = Cont {(>>-) :: (a -> r) -> r}

instance Functor (Cont r) where
  -- fmap :: (a -> b) -> (Cont r) a -> (Cont r) b
  fmap f (Cont cps_a) = Cont $ \cps -> cps_a (cps . f)

instance Applicative (Cont r) where
  -- pure :: a -> Cont r a
  pure x = Cont ($ x)
  -- (<*>) Cont r (a -> b) -> Cont r a -> Cont r b
  (Cont cps_f) <*> cont_cps_a = cps_f (\f -> fmap f cont_cps_a)

Я пытаюсь использовать fmap при определении (<*>), извлекая f из левого значения cps, затем fmap f сверх правого значения cps.Я не уверен, где я совершил ошибку.

1 Ответ

0 голосов
/ 29 декабря 2018

Очевидно, что тип выражения cps_f (\f -> fmap f cont_cps_a) недопустим.Поскольку

fmap f cont_cps_a :: Cont r b

и

\f -> fmap f cont_cps_a :: (a->b)->Cont r b

и

cps_f :: ((a->b)->r)->r

cps_f требуют тип параметра как (a->b)->r, но теперь он равен (a->b)->Cont r b.

Вместо использования fmap вы все еще можете реализовать оператор <*>, аналогично тому, как ваша fmap функция для

(Cont cps_f) <*> Cont cps_a = Cont $ \cps_b -> cps_f (\f -> cps_a (cps_b . f))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...