簡體   English   中英

如何在Scala中實現OCaml / F#的“函數”構造?

[英]How would one implement OCaml / F#'s “function” construct in Scala?

我在Scala中發現的一種常見趨勢是這樣的:

def someFunction(a: SomeClass) = a match { ... }

從那里上a從未再使用過。 這種模式在FP中很常見,OCaml和F#有一個內置的構造,讓你完全拋棄那個參數。

而不是寫這個:

let someFunction a = 
  match a with
  | 0 -> true
  | _ -> false

你可以簡單地寫一下:

let someFunction =
  function
  | 0 -> true
  | _ -> false

所以我的問題是,是否有可能在Scala中寫這樣的東西?

def someFunction = function {
  case 0 => true
  case _ => false
}

保存其他不必要的參數。

我試圖把它寫成一個帶有call-by-name參數的函數,但是Scala不允許我創建一個空match塊。

可能嗎? 或者scala可能已經內置了這樣的東西?

使用函數而不是方法:

val someFunction: Int => Boolean = {
  case 0 => true
  case _ => false
}

您必須顯式編寫類型注釋,但這不能是一個缺點 - 對於API使用它是有用的文檔。

你可以使用部分功能:

def function[A, B](mf: PartialFunction[A, B]): A => B = x => mf(x)

雖然這要求你在左邊指定功能的類型,例如

def someFunction: Int => Boolean = function {
    case 0 => true
    case _ => false
}

我找到了一種(非常難看)的方式

這是一個黑客/解決方案,而不是一個實際的解決方案,但我想我還是會在這里發布它

你可以這樣做:

def something = (_: Int) match {
  case 0 => true
  case _ => false
}

這有效並解決了這個問題,但它寫起來比我試圖從一開始就擺脫的東西更丑陋和笨拙。

我很想知道你們能想出什么。

暫無
暫無

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

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