Named version of `mapN` and friends
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- scala
- Lĩnh vực
- api, backend-api-design
Hướng nghiên cứu
Bắt đầu bằng cách đọc tài liệu về Named Tuples và Structural Types của Scala 3 được liên kết trong issue, sau đó tìm các API mapN và parMapN hiện có của Cats. Issue không nêu tên tệp hay test nào; để được xem là hoàn thành, cần quyết định một API Scala 3 cho phép kết hợp applicative có tên và thực hiện validation tương ứng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
I wonder if we could have a Scala 3 only version of mapN and friends that work on NamedTuples instead of plain ones.
The motivation would be to fix the major usability issue with applicative composition, where operations and the names of their results are separated.
For example, imagine a very simple for comprehension like this:
final case class Config(foo: Foo, bar: Bar, baz: Baz, quax: Quax)
object Config {
def load: IO[Config] =
for {
foo <- env(name = "FOO").as[Foo]
bar <- env(name = "BAR").as[Bar]
baz <- env(name = "BAZ").as[Baz]
quax <- env(name = "QUAX").as[Quax]
} yield Config(foo, bar, baz, quax)
}
One may realize that there is no dependency between each operation, and thus that instead of failing fast, we could try to read all env vars "concurrently" and accumulate all the errors instead:
def load: IO[Config] =
(
env(name = "FOO").as[Foo],
env(name = "BAR").as[Bar],
env(name = "BAZ").as[Baz],
env(name = "QUAX").as[Quax]
).parMapN { case (foo, bar, baz, quax) =>
Config(foo, bar, baz, quax)
}
But, this disconnects the names (foo, bar, baz, quax) from the operations that produced them; and yes, in this case, you could just do parMapN(Config.apply) but that is besides the point.
Thus, it would be great if we could use NamedTuples and maybe Structural Types to get an API like this:
def load: IO[Config] =
(
foo = env(name = "FOO").as[Foo],
bar = env(name = "BAR").as[Bar],
baz = env(name = "BAZ").as[Baz],
quax = env(name = "QUAX").as[Quax]
).namedParMapN { result =>
Config(result.foo, result.bar, result.baz, result.quax)
}
- Ngôn ngữ chính
- Scala
- Star
- 5.5k
- Fork
- 1.2k
- Merge trung bình
- 4 ngày 6 giờ
- Pull request đã merge (30 ngày)
- 6
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của typelevel/cats
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 30/100
Tất cả issue của typelevel/cats
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
typelevel/sbt-typelevel#929 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
softwaremill/tapir#5542 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
lichess-org/lila#21793 · 1 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
apache/pekko-projection#635 ·
-
RS_PixelAsPoint raises out of grid where RS_PixelAsCentroid and RS_PixelAsPolygon extrapolate Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100