1
let myFunc x y =
    List.fold (&&) true [func1 x y; func2 x y]

I don't know all the different operators and techniques in F#, but was hoping I could just plop some operator in place of "x y" for func1 and func2 to indicate to them "Just take my parameters" almost like how composition has implicit parameter pass through.

Alternatively, if someone can think of a much more straightforward and clean way of doing this that gets rid of the need for my function to hand it's parameters in, let me know.

Also, if this is just not possible which seems entirely likely, let me know.

Thanks!

4

1 に答える 1

3

のパラメータをとmyfuncのパラメータにスレッド化する良い方法はないと思います。ただし、次のように書くことができるため、例はおそらく少し単純化されすぎています。func1func2

let myfunc x y = 
  func1 x y && func2 x y

実際には、関数の数が多いので、使用foldするのは理にかなっていると思います。その場合、結果を結合するために使用するのではなく、関数foldを結合するために使用できます。

問題を少し単純化して、2つの引数を(2つの別々の引数としてではなく)タプルとして受け取ると仮定すると、次のように記述できますfunc1func2

let func1 (a, b) = true
let func2 (a, b) = true

let myfunc = List.fold (fun f st a -> f a && st a) (fun _ -> true) [ func1; func2 ] 

これで、パラメーターを明示的に(tofunc1func2)に渡す必要はありませんが、の引数はfoldもう少し複雑になります。一度だけ書く必要があるので、それで問題ないと思います(そして、この方法でかなり読みやすくなります)。

ただし、ポイントフリースタイルが好きな場合(または、どこまで到達できるかを確認したい場合)は、いくつかのヘルパー関数を定義してから、次のようにコードを記述できます。

/// Given a value, returns a constant function that always returns that value
let constant a _ = a
/// Takes an operation 'a -> b -> c' and builds a function that
/// performs the operation on results of functions    
let lift2 op f g x = op (f x) (g x)

let myfunc2  = List.fold (lift2 (&&)) (constant true) [ ffunc1; ffunc2 ] 

任意の数の関数が必要ない場合は、コードを単純化してまったく使用foldしません。あなたがそれをする必要があるなら、私はあなたのバージョンが非常に読みやすく、長すぎないと思います。この回答で私が書いた例は、パラメーターを手動で渡すことを回避できることを示していますが、コードが少しわかりにくいものになっています。

于 2012-08-22T15:16:36.090 に答える