簡體   English   中英

Scala - 遞歸視圖邊界

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM