作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给出这样的签名或 that one :
def foo[A, F[_]](implicit mon: Monoid[F[A]], pr: Pure[F]): F[A]
Char
, 有没有办法得到一个
String
而不是
List[Char]
?
String
不接受类型参数,所以我认为这是不可能的。下一个最佳选择是什么?现在,我使用
mkString
结果,但感觉不是最佳的。
String
是一个零的幺半群
""
并附加
+
...
最佳答案
可以说服 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
Char
输入参数
foo
未使用,可以是任何东西,但必须是东西:在这种情况下,要么
Char
是自然的选择,但
Nothing
或
Any
也会这样做。
String
上交易的特点:所有类型的值都可以转换为
String
如此
pure[A](a : => A) : String
适用于所有类型
A
.为
String
以外的类型复制此习语很可能必须利用某种机制来在
pure
的正文中实现特定于类型的情况。 (例如,某种模式匹配)。
关于scala - 字符串被视为幺半群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7631844/
我是一名优秀的程序员,十分优秀!