質問

それは実質的に重要な問題ではありませんが、の例を見たいです 暗黙のプログラミング F#で私の場所 ポイントフリー 関数には複数の引数があります(リストやタプルの形ではありません)。

第二に、そのような関数がどのように操作できるか 複雑なデータ構造. 。 F#Interactiveで試していますが、まだ成功していません。

たとえば、私は試しました:

> (fun _ -> (fun _ -> (+))) 333 222 111 555

それは正しい方法ですか?

と:

> (fun _ -> (fun _ -> (+))) "a" "b" "c" "d";;  

val it : string = "cd"
役に立ちましたか?

解決

F#には、Haskellで利用可能な基本的な関数の一部は含まれていません(主に、F#プログラマーは通常、プログラミングの明示的なスタイルを好むため、最も明白なケースでのみポイントフリースタイルを使用します。

ただし、このようないくつかの基本的なコンビネーターを定義できます。

// turns curried function into non-curried function and back
let curry f (a, b) = f a b
let uncurry f a b = f (a, b)

// applies the function to the first/second element of a tuple
let first f (a, b) = (f a, b)
let second f (a, b) = (a, f b)

次のように、コンビネーターを使用して2つの文字列の長さを追加するように関数を実装できます。

let addLengths = 
  uncurry (( (first String.length) >> (second String.length) ) >> (curry (+)))

これにより、適用される2つの関数が構築されます String.length タプルの1番目/2番目の要素に、それらを構成してから、タプルの要素を使用して追加します +. 。全体が包まれています uncurry, 、したがって、タイプの関数を取得します string -> string -> int.

他のヒント

f#では、関数の不安が固定されているので、両方を書くことができないでしょう

(op) 1 2

(op) 1 2 3 4

任意のオペレーターの場合 op. 。それがあなたが望むものであれば、リストまたはその他のデータ構造を使用する必要があります。名前の変数を避けようとしている場合は、いつでも「1 + 2 + 3 + 4」を実行できます。 f#に数字のリストを追加する最も慣用的な方法はです List.sum [1;2;3;4], 、変数も回避します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top