простая ошибка реализации дерева монады [дубликат]

В вашем сервисе get call вы можете сделать, как @Deborahk упомянул

getLab(labId: number) {
return this.http.get<Lab>(DidacticsServiceUrls.apiRoot + labId)
           .map(res => Object.assign(new Lab(), res))
           .toPromise();
 }
42
задан recursion.ninja 27 July 2015 в 15:29
поделиться

2 ответа

Это заявленное предложение монады (AMP). Теперь, когда вы объявляете что-то как Monad, вы также должны объявлять его как Applicative (и, следовательно, Functor). Математически каждая монада является аппликативным функтором, поэтому это имеет смысл.

Вы можете сделать следующее, чтобы удалить ошибку:

instance Functor Wrap where
  fmap f (Wrap x) = Wrap (f x)

instance Applicative Wrap where
  pure = Wrap
  Wrap f <*> Wrap x = Wrap (f x)

https://wiki.haskell.org/Functor-Applicative-Monad_Proposal

Редактировать: Возможно, я должен более четко указать, что это недавняя вещь ? Ранее вы использовали код, который вы использовали, но с последними версиями GHC вы получите сообщение об ошибке.

Изменить: Следующие объявления должны работать для любой монады:

import Control.Applicative -- Otherwise you can't do the Applicative instance.
import Control.Monad (liftM, ap)

instance Functor ??? where
  fmap = liftM

instance Applicative ??? where
  pure  = return
  (<*>) = ap

В зависимости от рассматриваемой монады может быть возможны более эффективные реализации, но это простая отправная точка.

70
ответ дан MathematicalOrchid 25 August 2018 в 08:29
поделиться

Наиболее нормализованный и ненавязчивый ответ: -

, поскольку Monad зависит от класса Applicative

. Аппликативный m => Monad m где ...

и Аппликация зависит от класса Functor

. Функтор f => Аппликативный f, где ...

нам нужны определения экземпляров

> instance Functor Wrapped where
>     fmap = liftM

и

> instance Applicative Wrapped where
>     pure = return
>     (<*>) = ap
0
ответ дан AaronNGray 25 August 2018 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: