2014-07-18 71 views
2

我在Scala中發現了一個共同的趨勢是這樣的:如何在Scala中實現OCaml/F#的「函數」構造?

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 
} 

保存一個否則不必要的參數。

我試圖把它寫成一個函數,它需要一個名稱調用參數,但斯卡拉不會讓我做一個空的match塊。

可能嗎?或者斯卡拉也許已經有這樣的內置東西?

回答

8

使用功能,而不是一個方法:

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

你必須明確地寫出類型註釋,但絕不能是一個缺點 - 使用API​​的是有用的文檔。

+0

甚至比以前更乾淨,我很驚訝我沒有想到這個... –

0

我發現這樣做的(非常難看)方式,

它更像是一個黑客/解決辦法比它實際的解決方案,但我想我會在這裏發佈反正

你可以這樣做:

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

這工作和解決問題,但它的醜陋和笨重比我試圖從在第一時間脫身寫。

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

3

您可以使用部分功能:

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

儘管這需要你指定左側例如函數的類型

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

我喜歡它!它乾淨而且簡潔,可以用作'function [Int,Boolean]'以及你的建議。我想知道有什麼其他方法來解決這個問題 –

+1

在這種情況下創建一個'PartialFunction'沒有任何意義。 – sschaef

+0

@sschaef我猜測Lee只是試圖儘可能地匹配F#代碼 –

相關問題