ทำให้ F[_]implementing Monad trait ขณะที่ยอมรับบ io

0

คำถาม

ปล่อยให้พวกเราพูดว่าเรามีรหัส(<: Monad[F] ไม่ได้ทำงานอย่างที่คาดหวัง):

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))
  }
}

ฉันจะชอบ F[_] ต้องเป็น Monadดังนั้นนั่น proxy.get() มีพวกนั้นลักษณะและเปิดใช้ตัวอย่างเช่น(ภายใน External ชั้นเรียน):

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

ตอนนี้งั้นเหรอแต่เมื่อพยายาม instantiate กับ cats.effect.IO มันไม่ได้ทำงานให้ External:

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

กับข้อผิดพลาดแสดงผล:

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

เป็นอย่างนี้ได้ยังไงซ่อมหรือประสบความสำเร็จในมุมมองที่ต่างออกทาง?

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

คำตอบที่ดีที่สุด

5

แทนที่

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

กับ

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

การเป็น Monad ไม่ได้หมายความว่าการเป็นประเภทย่อยของ Monad. มันหมายความว่ามันมีนกตัวอย่างของประเภทเรียน Monad สำหรับปัจจุบันแบบนั้น

อยู่ตรงกันข้ามกับอุ้ใน FP implementing บางคนแบบนามปธรรมพฤติกรรมเป็นประสบความสำเร็จไม่ได้อยู่กับคนหนึ่งยื่นมือไปช่วย/ของลำดับการสืบทอ/ประเภทย่อย polymorphism แต่กับ implicits/defining ประเภท-ชั้นเรียนโห/โฆษณา hoc polymorphism.

บางทีคุณอาจต้องการจะนำเข้าที่จำเป็นรูปแบบการสั่งงาน:

import cats.syntax.flatMap._

หรือ

import cats.syntax.functor._

หรือของทั้งหมด synaxes ที่ครั้งนึง

import cats.syntax.all._

วิธีปฏิบัติ F[_]ไปเป็นตัวอย่างของ Monad

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

2021-10-24 16:01:35

ไม่เพียงพอตั้งแต่นั้น proxy.get() จะไม่มี Monad ลักษณะ.
scala-n00b

@language-n00b ไม่แน่ใจว่าฉันเข้าใจ ได้โปรดปรับปรุงของคุณรหัสกับปัจจุบันรุ่นสะท้อนปัจจุบันปัญหาแล้ว อะไรไม่ compile?
Dmytro Mitin

ของพร็อกซี.ได้(กุญแจ):ไม่สามารถแก้ไขสัญลักษณ์ flatMap
scala-n00b

@language-n00b ไม่สามารถ reproduce scastie.scala-lang.org/DmytroMitin/mMaQ7tgDRei8yW0HvSbebg/7 ได้โปรดเขียนทั้งเป็นรหัสมอส
Dmytro Mitin

@language-n00b บางทีคุณอาจต้องการจะนำเข้ารูปแบบการสั่งงาน stackoverflow.com/questions/58150448/...
Dmytro Mitin

ไม่เกี่ยวกับเรื่องนำเข้ารูปแบบการสั่งงานเหมือนกัฉันคิดว่านะ มันทำงานโดยไม่มี generics ใช้ทำงานสบายดีทุกอย่า: scastie.scala-lang.org/W9MDWWdrTfS5UBBkRjePTA แต่กับ generics: scastie.scala-lang.org/9ddYUoGPRLaSmespG2luuQ ไม่มากเท่าไหร่
scala-n00b

@language-n00b ไม่เรื่องนี้มันแน่ชัดจะตายเพราะกำลังนำเข้ารูปแบบการสั่งงาน. scastie.scala-lang.org/DmytroMitin/UjF8GBFRTlqF3ZHiO2eTOw/1 แค่ Functor รูปแบบการสั่งงานไม่ได้ FlatMap รูปแบบการสั่งงาน.
Dmytro Mitin

ขอบคุณมาก! นี่เป็นคนขับรถให้ฉันจะบ้าตาย
scala-n00b

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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