[英]Scala - Recursive view bounds
如何讓scala編譯器遞歸查找隱式視圖?
type Expression = () => String
implicit def constant(s: String): Expression = () => s
implicit def evaluation[A <% Expression](exprs: Seq[A]): Expression = () => exprs match {
case "concat" :: args => args.map(_.apply()).mkString
}
Seq("concat", "foo", "bar")() // This works
Seq("concat", "foo", Seq("concat", "bar", "baz"))() // No implicit view available from java.lang.Object => () => String.
我知道最后一個序列具有公共類型的Object
,它沒有隱式視圖,但是如何在不借助AnyRef
動態模式匹配的情況下定義類型安全的類型?
嘗試scala 2.9.2
由於混合內容,類型推斷發現你有一個Seq[Any]
。 最簡單的解決方案是幫助編譯器並告訴它你有一個Seq[Expression]
Seq[Expression]("concat", "foo", Seq("concat", "bar", "baz"))()
這是你用元組解決它的方法:
type Expression = () => String
implicit def constant(s: String): Expression = () => s
implicit def evaluation[A <% Expression, B <% Expression, C <% Expression](
exprs: (A, B, C)): Expression =
() => exprs match {
case ("concat", arg1, arg2) => arg1() + arg2()
}
("concat", "foo", "bar")() //> res0: String = foobar
("concat", "foo", ("concat", "bar", "baz"))() //> res1: String = foobarbaz
我也想知道為什么scala編譯器無法弄清楚內部Sequence是一個表達式 - 我想,你只是忘了一些括號 - 這里它們是:
Seq("concat", "foo", Seq("concat", "bar", "baz")())() // added inner brackets
編輯
我明白你的觀點 - 這也行不通:
val x: Expression = Seq("concat", "foo", "bar") // This works
val y: Expression = Seq("concat", "foo", x) // No implicit view available - again
所以 - 這里也有必要提供x的括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.