2012-04-04 68 views
0

鑑於功能:F#功能界面

let doTrue = fun(x) -> true 
let doFalse = fun(x) -> false 

我想重用函數簽名,這樣我可以得到

let myFunDefinition = ??? // <-- this is the function signature that i am trying to reuse 
let doTrue = myFunDefinition -> true // <-- now i don't have to type fun(x) any more 
let doFalse = myFunDefinition -> false 

是否可以定義重用函數簽名?

+3

我不明白你使用單詞「簽名」的方式。此外,你的第一個例子甚至沒有編譯(如果你的'if'分支中有非'unit'值,'true'和'false'應該是小寫的,並且你需要'else'塊)。你能澄清你在找什麼嗎? – kvb 2012-04-04 16:08:02

+0

我想他是在尋求一種以泛型爲參數的函數,但和往常一樣,很難說出他的要求。 – 2012-04-04 16:16:08

+0

@kvb閱讀它,我認爲他正在尋找一個更高階的函數,返回一個函數,評估爲真或假,但這只是一個猜測。 – 2012-04-04 16:20:04

回答

3

即使編輯後,你的問題並沒有真正意義的我。首先,簽名doTruedoFalse'a -> bool如您所寫,但我不認爲這是真的與您的問題相關,因爲我沒有看到「重複使用」簽名意味着什麼。相反,您似乎想要某種形式的文本宏,這將允許您鍵入myFunDefinition並將其替換爲文本fun (x)。除了一個事實,即您的取代文字長於原文,這裏有幾個想法:

  • F#不具有文本替換宏,所以如果這就是你想要的確切功能,你出來的運氣。
  • 如果你想節省打字,你至少可以使用更簡潔的配方let doTrue x = ...代替let doTrue = fun x -> ...
  • 如果你真的想doTruedoFalse是一些其他功能的應用truefalse,然後這很簡單:

    let myFunDefinition b = {{some function of b}} 
    let doTrue = myFunDefinition true 
    let doFalse = myFunDefinition false 
    

    在這種情況下,也許這是你在找什麼:

    let myFunDefinition b _ = b 
    ... 
    

    (?)這只是忽略第二個參數(該參數成爲doTruedoFalse第一個參數,因爲它們部分地分別適用於myFunDefinitiontruefalse第一參數,)。

  • 如果您想要其他某種抽象,那麼其他答案會對這可能意味着什麼進行一些合理的猜測。一般來說,如果你花更多的時間來闡述你的問題,你就會得到更多有用的答案,以便清楚地傳達你正在嘗試做的事情。
3

我不確定我是否正確理解您的問題,因爲在您的示例中,測試x = 1x = 3不同,而myFunDefinition在您的第二個塊中看起來相同。

假設你只是想做一些不同的事情,如果某些謂詞是真的或者是假的(比如x = 1),我會寫下面的OCaml代碼(你可能必須稍微修改語法)。

let doIfPredicate p a deflt = if p then a else deflt 
let predicate x = (x = 1) 
let doTrue x = doIfPredicate (predicate x) true false 
let doFalse x = doIfPredicate (not (predicate x)) false true 
let doTrue2 x = doIfPredicate (predicate x) (print_string "true")() 
+0

@Halladba --_ default_是F#中的一個關鍵字。 – 2012-04-04 16:51:27

+0

我試圖實際重用函數定義。邏輯並不重要,所以我已經將它編輯出來了。 – 2012-04-04 17:09:29

+0

我看不出我的答案或BUEPIXY的答案是不是重用函數定義。 – Abdallah 2012-04-04 17:16:52

2
let myFunDefinition funcP ret = 
    fun (x) -> if funcP x then ret else not ret 
let doTrue = myFunDefinition ((=) 1) true 
let doFalse = myFunDefinition ((=) 3) false 
+0

我試圖實際重用函數定義。邏輯並不重要,所以我已經將它編輯出來了。 – 2012-04-04 17:09:16

+0

這很酷,你傳遞=運算符雖然 – 2012-04-04 17:11:21