![](/img/trans.png)
[英]Is it possible to implement F#'s infrastructure for Units of Measurement in Scala?
[英]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.