gpt4 book ai didi

scala - 如何编写具有上下文边界的一流函数,可以在使用现场干净地调用?

转载 作者:行者123 更新时间:2023-12-05 00:36:41 24 4
gpt4 key购买 nike

例如,假设我要写一个函数 length返回给定结构的长度,假设它有一个类型为 Length 的实例(来自 Scalaz)在范围内。

这就是我目前定义它的方式:

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

然而,像 length(List(2, 3)) 这样的电话失败,因为在这种情况下,隐式参数是所需的第一个参数。
scala> length(List(2, 3))
<console>:15: error: type mismatch;
found : List[Int]
required: scalaz.Length[?]
length(List(2, 3))
^

我以为 length(implicitly)(List(2, 3))会起作用,但最终会导致 session 崩溃(这是可以理解的,因为类型推断从左到右流动)。提供显式类型注释是可行的,但丑得难以忍受。
scala> length(implicitly[Length[List]])(List(2, 3))
res16: Int = 2

有没有写一等函数的好方法 length ,有一个上下文绑定(bind),可以在使用现场像常规函数一样干净地调用吗? (如 length(List(2, 3)) )

最佳答案

轻点,作弊!

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

scala> List(2, 3) |> length
res0: Int = 2

关于scala - 如何编写具有上下文边界的一流函数,可以在使用现场干净地调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com