В вашем сервисе get call вы можете сделать, как @Deborahk упомянул
getLab(labId: number) {
return this.http.get<Lab>(DidacticsServiceUrls.apiRoot + labId)
.map(res => Object.assign(new Lab(), res))
.toPromise();
}
Это заявленное предложение монады (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
В зависимости от рассматриваемой монады может быть возможны более эффективные реализации, но это простая отправная точка.
Наиболее нормализованный и ненавязчивый ответ: -
, поскольку Monad зависит от класса Applicative
. Аппликативный m => Monad m где ...
blockquote>и Аппликация зависит от класса Functor
. Функтор f => Аппликативный f, где ...
blockquote>нам нужны определения экземпляров
> instance Functor Wrapped where > fmap = liftM
и
> instance Applicative Wrapped where > pure = return > (<*>) = ap