簡體   English   中英

隱式轉換,類型參數,重載和匿名函數語法

[英]Implicit conversions, type parameters, overloading, and anonymous functions syntax

所以,我試圖用這樣的東西“拉皮條”我的Future (以及其他東西):

implicit class Pimp[T](val x: T) extends AnyVal  {
  def ->>[R](f: T => R): R = f(x)
  def ->>[R](r: => R): R = r
  def <<-(f: T => Unit): T = f.andThen(_ => x).apply(x)
  def <<-(f: => Unit): T = <<- { _ => f }
}

出於某種原因,當我現在嘗試這樣做時:

Future(1) ->> { Await.result(_, 1 seconds) }

它失敗並error: missing parameter type for expanded function ((x$1) => Await.result(x$1, 1.seconds))

但這有效:

Future(1) <<- { Await.result(_, 1 seconds) }

所以,問題是第一種情況出了什么問題。 我做錯了什么,以及如何讓它發揮作用。 我甚至試過這個(根本不是我想要的,因為它太冗長了): Future(1) --> { case x: Future[Int] => Awayt.result(_, 1 seconds) } ,但是由於某種原因,這個失敗了(仍然說參數類型未知 - 如果我明確指定它,它怎么知道?)

我懷疑,第一種情況和第二種情況之間的區別在於->>有一個類型參數,而<<-沒有......但即使是這個Future(1) ->>[Int] { Await.result(_, 1 seconds) }仍然無法正常工作:(

更新好了,所以,我找到了一種方法:

Future(1) ->> { (f:Future[Int]) => Await.result(f, 1 seconds) }

這有點失敗了我隱含的目的,因為它是多么冗長:(有沒有辦法讓它推斷參數類型而不像其他情況那樣拼寫出來?

更新2還有一件事。 Pimp刪除->>的重載“味道”使得另一種情況起作用。 即,如果我只離開

def ->>[R](f: T => R): R = f(x)

Pimp的定義中,那么

Future(1) ->> { Await.result(_, 1 seconds) }

精美的工作方式。

考慮一下,我想,問題是在重載的情況下foo ->> { _ => bar }是不明確的:它可能意味着“返回欄”,或者“返回一個函數foo => bar ”。 這並不能解釋為什么foo ->>[Bar] { _ => bar }不起作用。

您可以縮短對Future(1) ->> { Await.result(_: Future[Int], 1 seconds) }的調用。 不完美,但比你的更新1更好。更好的是避免在“拉皮條”方法中超載:不出所料,它使類型推斷變得復雜。

看完后http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html仔細,似乎指明[Int] 不應該工作:

  1. 整個表達式是函數應用程序(6.6)。

  2. 由於Future(1).->>超載,我們轉到6.23。

    1. 備選方案A集是由->>引用的成員集; [Int]沒有被考慮在內,因為該部分討論“標識符或選擇e ”,並且選擇是Future(1).->>

    2. shape({ Await.result(_, 1 seconds) })Any => Nothing

    3. “設B是A中適用於類型(形狀(e1),...,形狀(en))”的表達式(e1,...,en)的替代集合。 A 中的兩種方法適用於Any => Nothing (如你所說,“它可能意味着”返回欄“或”返回函數foo => bar“)。所以我們去”否則,讓S1,...,Sm是通過鍵入具有未定義的期望類型的每個參數獲得的類型的向量“並且此類型輸入失敗。

    4. 對於<<- case, => Unit不適用(因為在此步驟中期望的類型不是Unit ,因此不會丟棄值)。

但它足夠微妙,我在寫這個更新時改變了主意兩次; 我現在已經做到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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