0

文字列を返す関数を取り、同じパラメーターを取り、「ラップされた」入力から文字列を返す関数を返す単純なラッパー クラスを F# で記述しようとしています。

次のコードは、単一の変数を取る関数に対して機能します (したがって、正常に機能しますtest)。

open System

let myFunc anotherFunc =
    fun x -> "boo" + anotherFunc x + "unboo"

let Func2 toDouble =
    (toDouble * 2).ToString ()

let test = myFunc Func2

let Func3 numOne numTwo =
    (numOne * numTwo).ToString ()

let test2 = myFunc Func3

do
    Console.WriteLine(test 10)
    Console.WriteLine(test2 5 10)

ただしfun x ->、単一のパラメーターを指定するため、test2有効なコードではありません。この構造を可能にする構文はありますか?

4

2 に答える 2

2

最も簡単な解決策はFunc3、タプルを取る関数として記述することです。このように、関数は 1 つのパラメーターのみを受け取りますが、両方の数値を渡すことができます。

// Function takeing a single argument, which is a tuple
let Func3 (numOne, numTwo) = 
  (numOne * numTwo).ToString () 

let test2 = myFunc Func3      

// The created function takes a tuple as well
Console.WriteLine(test2(5, 10))

一般に、任意の数のパラメーターを受け入れる関数を受け取る高階関数を作成する適切な方法はありません。この種の汎用性は、F# では簡単にエンコードできません。リフレクションを使用してそのようなものを構築することもできますが (ただし、それは非効率的で安全ではありません)、パラメーターのより複雑なエンコーディングを記述することもできますが、タプルが最適なオプションだと思います。

于 2011-12-04T23:11:41.450 に答える
1

あなたの機能は機能します。あなたがするとき、問題はあなたの最後の行にあります

let test2 = myFunc Func3

する必要があります

let test2 x = myFunc (Func3 x)

アップデート:

Func3 を変更したくないと仮定しています。それ以外の場合は、Tomas のソリューションが必要な場合があります。

于 2011-12-04T23:16:23.023 に答える