0

给定功能:

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

是否可以定义重用函数签名?

4

3 回答 3

3

我不确定我是否正确理解了您的问题,因为测试与您的示例x = 1不同,而在您的第二个块中似乎相同。x = 3myFunDefinition

假设您只想在某个谓词为真或为假时做一些不同的事情(例如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") ()
于 2012-04-04T16:20:25.037 回答
3

即使在编辑之后,您的问题对我来说也没有任何意义。首先, and 的签名doTrue您编写doFalse'a -> bool一样,但我认为这与您的问题并不真正相关,因为我不明白“重用”签名意味着什么。相反,您似乎想要某种形式的文本宏,它允许您键入myFunDefinition并将其替换为 text fun (x)。除了您的替换文本比原始文本长之外,这里有一些想法:

  • F# 没有文本替换宏,因此,如果这正是您想要的功能,那么您就不走运了。
  • 如果你想节省打字,你至少可以使用更简洁的公式let doTrue x = ...,而不是let doTrue = fun x -> ...
  • 如果你真的想要doTrueanddoFalse成为 and 的一些其他函数的应用,那么这很容易:truefalse

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

    在这种情况下,也许这就是您要寻找的:

    let myFunDefinition b _ = b
    ...
    

    (?) 这只是忽略了第二个参数(它成为 and 的第一个参数,doTrue因为doFalse它们分别部分适用于ormyFunDefinition的第一个参数)。truefalse

  • 如果您想要某种其他类型的抽象,那么其他答案会对这可能意味着什么做出一些合理的猜测。一般来说,如果您花更多时间阐明您的问题,以便清楚地传达您正在尝试做的事情,您将获得更多有用的答案。
于 2012-04-04T18:03:37.723 回答
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
于 2012-04-04T16:52:50.403 回答