加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 被视为Monoid的字符串

发布时间:2020-12-16 18:31:56 所属栏目:安全 来源:网络整理
导读:给出像这样的签名或 that one: def foo[A,F[_]](implicit mon: Monoid[F[A]],pr: Pure[F]): F[A] 假设A是Char,有没有办法获得String而不是List [Char]? String不带类型参数,所以我认为不可能.什么是下一个最佳选择?现在,我在结果上使用mkString,但这并不
给出像这样的签名或 that one:

def foo[A,F[_]](implicit mon: Monoid[F[A]],pr: Pure[F]): F[A]

假设A是Char,有没有办法获得String而不是List [Char]?

String不带类型参数,所以我认为不可能.什么是下一个最佳选择?现在,我在结果上使用mkString,但这并不是最佳的.

我认为String是一个带有零“”的monoid并追加……

解决方法

可以说服String伪装成更高级的类型,因此允许foo形式的函数适用.但是,Scala的类型推断目前还不能用于推断foo的类型参数,所以你必须明确地提供它们,

// Assuming the the definitions of Pure and Monoid from Scalaz

type ConstString = {
  type λ[X] = String
}

implicit def StringPure = new Pure[ConstString#λ] {
  def pure[A](a: => A) = a.toString
}

val sm = implicitly[Monoid[String]]
val sp = implicitly[Pure[ConstString#λ]]
val f : String = foo[Char,ConstString#λ](sm,sp) // OK

请注意,foo的Char类型参数未使用,可以是任何内容,但必须是:在这种情况下,Char是自然选择,但Nothing或Any也可以.

请注意,此解决方案根据String的特殊特征进行交易:所有类型的值都可转换为字符串,因此纯[A](a:=> A):String可针对所有类型实现A.对于String以外的类型复制此习惯用法最常见可能必须利用一些机制来在纯粹的体中实现特定于类型的情况(例如某种模式匹配).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读