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

編集後でも、あなたの質問は私には意味がありません。まず、andの署名はあなたが書いたとおりですが、署名を「再利用」することが何を意味するのかがわからないため、これはあなたの質問に本当に関連しているとは思いません。代わりに、入力してそれを text に置き換えることができる何らかの形式のテキスト マクロが必要なようです。置換テキストが元のテキストよりも長いという事実は別として、ここにいくつかの考えがあります。doTruedoFalse'a -> boolmyFunDefinitionfun (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
    ...
    

    (?) これは単に 2 番目の引数を無視します (これは、 and の最初の引数にdoTrueなります。これは、それぞれorの最初の引数にdoFalse部分的に適用されるためです)。myFunDefinitiontruefalse

  • 代わりに他の種類の抽象化が必要な場合は、他の回答がそれが何を意味するかについて合理的な推測を行います。一般的に、あなたがしようとしていることを明確に伝えるために、より多くの時間を費やして質問を明確にすると、より役立つ回答が得られます。
于 2012-04-04T18:03:37.723 に答える
3

テストはあなたの例x = 1とは異なりますが、2番目のブロックでは同じように見えるため、質問を正しく理解しているかどうかはわかりません。x = 3myFunDefinition

ある述語が true または false (たとえば ) の場合に別のことをしたいだけだと仮定すると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 に答える
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 に答える