6

たとえば、次の 2 つのパラメーターを受け取る関数があります。

let f a b = a = b

次に、タプルを返す 2 つ目の関数があります。

let g = (a, b)

タプルの a と b を g から f にパラメーターとして 1 行で渡したいと思います。2 つのステートメントで行うこともできますが、これを行う理由は、呼び出し関数が or を実行し、最初のケースが false でない限り、不要な処理を節約するために f を呼び出したくないからです。

let calling =
  someboolean || 
  f g // want to split result of g to parameters for f without calling g twice

これを行う方法に関するヒントはありますか?代わりにタプルを取ることができることはわかっていますが、カリー化のオプションを保持したいと思います。

これを十分に説明したことを願っています。:)

4

4 に答える 4

5

カリー化された関数をペア引数を取る関数に変換する関数を定義できます。

uncurry f (a, b) = f a b

let calling = someBoolean || (uncurry f) g
于 2013-06-07T10:46:14.710 に答える
3

タプルからインラインで抽出できますが、短絡の利点は引き続き得られます。

let calling = someBoolean || let a,b = g in f a b
于 2013-06-07T10:58:20.077 に答える
2

すでに述べたように、uncurryコンビネータを定義して、2 つの引数を取る関数をタプルを取る関数に変換することができます。

しかし、私はそうしないことをお勧めします - そのプログラミングスタイルは F# では (たとえば Haskell とは異なり) 実際には慣用的ではなく、コードの読み取り、デバッグ、保守が難しくなっていると思います。

それで、代わりに何をしますか?

  • 2 つの値が論理的に一緒に属している (コードの他の場所で使用されているエンティティを表す) 場合fは、タプルも取るように変更します。

  • 値が 2 つだけの場合はlet、パターン マッチングを使用してタプルを分解します。これは長くなりますが、読みやすくするためにコンポーネントに名前を付ける必要があります。

あなたのサンプルgでは実際には値なので、次のように書くことができます:

let someThing, otherThing = g
boolThing || (f someThing otherThing)
于 2013-06-07T12:05:19.027 に答える