Face F[_] de punere în aplicare Monadă trăsătură în timp ce acceptarea IO

0

Problema

Să ne spunem că avem codul (<: Monad[F] nu lucreze cum era de așteptat):

class External[F[_] <: Monad[F] : Concurrent](implicit proxy: Proxy[F]) { ... }

class Proxy[F[_] <: Monad[F]](implicit storage: Storage, async: Async[F]) {
  def get(key: String): F[Option[Entry]] = {
    async.blocking(storage.get(key))
  }
}

Mi-ar place F[_] pentru a fi un Monad, astfel încât proxy.get() au aceste trăsături și permite, de exemplu (în interiorul External clasa):

proxy.get(key).flatMap(...)

Până în prezent atât de bine, dar atunci când încearcă pentru a instantia cu cats.effect.IO nu merge pentru External:

implicit val proxy: Proxy[IO] = new Proxy()
implicit val external: External[IO] = new External()

Cu ieșire de eroare:

inferred type arguments [[+A]cats.effect.IO[A]] do not conform to value <local External>'s type parameter bounds [F[_] <: cats.Monad[F]]

Cum poate fi fix sau realizat într-un mod diferit?

cats-effect implicit scala scala-cats
2021-10-24 08:45:18
1

Cel mai bun răspuns

5

Înlocuiți

class External[F[_] <: Monad[F] : Concurrent]

cu

class External[F[_]: Monad : Concurrent]

Fiind un Monad nu înseamnă a fi un subtip de Monad. Aceasta înseamnă că nu există o instanță de tip clasa Monad de tip curent.

Contrar OOP, în FP implementarea unor abstract de comportament este realizat nu cu extinderea/moștenire/subtip polimorfism dar cu implicits/definire tip-cazuri de clasă/ad-hoc polimorfism.

Poate ai nevoie pentru a importa necesar sintaxa:

import cats.syntax.flatMap._

sau

import cats.syntax.functor._

sau toate synaxes la o dată

import cats.syntax.all._

Cum să pună în aplicare F[_] pentru a fi un exemplu de Monadă

https://eed3si9n.com/herding-cats/import-guide.html

2021-10-24 16:01:35

Nu sunt suficiente, atunci proxy.get() nu va avea Monad trăsături.
scala-n00b

@scala-n00b Nu sunt sigur că înțeleg. Vă rugăm să actualizați codul cu versiunea curentă reflectă o problemă actuală. Ce nu compila?
Dmytro Mitin

proxy.get(key): nu se Poate rezolva simbol flatMap
scala-n00b

@scala-n00b nu Pot reproduce scastie.scala-lang.org/DmytroMitin/mMaQ7tgDRei8yW0HvSbebg/7 vă Rugăm să scrie tot codul.
Dmytro Mitin

@scala-n00b Poate ai nevoie pentru a importa sintaxa stackoverflow.com/questions/58150448/...
Dmytro Mitin

Nu despre import sintaxă ori cred. Aceasta funcționează fără generice utilizarea funcționează foarte bine: scastie.scala-lang.org/W9MDWWdrTfS5UBBkRjePTA dar cu generice: scastie.scala-lang.org/9ddYUoGPRLaSmespG2luuQ nu atât de mult
scala-n00b

@scala-n00b Nu, acest lucru este exact cauza importul de sintaxă. scastie.scala-lang.org/DmytroMitin/UjF8GBFRTlqF3ZHiO2eTOw/1 Doar Functor sintaxa, nu FlatMap sintaxa.
Dmytro Mitin

VĂ MULȚUMESC ATÂT DE MULT! Acest lucru a fost de conducere mine nebun.
scala-n00b

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................