scala – 如何编写具有上下文边界的第一类函数,可以在使用站点上
发布时间:2020-12-16 18:11:04 所属栏目:安全 来源:网络整理
导读:例如,假设我想编写一个返回给定结构长度的函数长度,因为它在范围内有一个类型为Length的实例(来自 Scalaz). 这就是我目前定义它的方式: scala def length[A,F[_] : Length]: F[A] = Int = _.lenlength: [A,F[_]](implicit evidence$1: scalaz.Length[F])F[A
例如,假设我想编写一个返回给定结构长度的函数长度,因为它在范围内有一个类型为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)) ^ 我认为长度(隐式)(List(2,3))可以工作,但最终会导致sesssion崩溃(这可以理解为类型推断从左向右流动).提供显式类型注释有效,但它难以忍受. scala> length(implicitly[Length[List]])(List(2,3)) res16: Int = 2 是否有一种很好的方法来编写第一类函数,例如length,具有上下文绑定,可以像使用站点上的常规函数??一样干净地调用它? (如长度(列表(2,3))) 解决方法
容易,欺骗!
scala> def length[A,F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int scala> List(2,3) |> length res0: Int = 2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |