質問

誰にでも、好ましくは実践の評価精度向上について、その後を発揮します。

役に立ちましたか?

解決

(編集:小さな 存FP洪庵 へ)

の洪庵のCurrying(洪庵食ですが、実はそうではありませんの食)

学生たJacques Garrigueいないかcurryingが良いです。" ジャック"と答えを教えてお好みの食事はお好きなデザート".の身の学生との回答が多かった今日はちょっとお好み焼きや官が、彼のお気に入りのレストラン食もお好み焼き、官は常に新たな腹痛にあります。なジャックの学生で食べるレストランで、お好み焼きトートバッグなど学生のお気に入りの、そしてとして知られるようになっていた広町店が素晴らしい成果を生み出してきた官は学生楽しく、残りの食欲が増進されます。その学生が飽がなかった啓発...翌朝まで彼が目を覚まし、うつぶせになっていた。

私の例ですので、再利用、封止します。これはかなり明らかだけを探してみるのはいかがでしょうべきコンクリートの簡単なる例にとらわれず自由に考えるのを多くする。

しい地図を渡ります。この機能できる画廊や個々のノードが必要であるその一つの引数--以来、私たちはあなたの適用のノードでの最後の引数に使います。ることはないという感じです画廊、書面に 他の 機能この機能は使用その他のインスタンスその他の変数をいいます。

type 'a tree = E of 'a | N of 'a * 'a tree * 'a tree
let rec tree_map f tree = match tree with
    | N(x,left,right) -> N(f x, tree_map f left, tree_map f right)
    | E(x) -> E(f x)

let sample_tree = N(1,E(3),E(4)
let multiply x y = x * y
let sample_tree2 = tree_map (multiply 3) sample_tree

このと同じです:

let sample_tree2 = tree_map (fun x -> x * 3) sample_tree

このサンプルなが説得力があると感じています。になっているのですが、一度ご利用の言語により自然に来られます。他の例では一部のコードとして再利用しcurrying.A 再発の関係を素数.ど多くの類似性もコメントありがとうございます

let rec f_recurrence f a seed n =
    match n with
    | a -> seed
    | _ -> let prev = f_recurrence f a seed (n-1) in
           prev + (f n prev)

let rowland = f_recurrence gcd 1 7
let cloitre = f_recurrence lcm 1 1

let rowland_prime n = (rowland (n+1)) - (rowland n)
let cloitre_prime n = ((cloitre (n+1))/(cloitre n)) - 1

Ok、ローランドとレクロワは画廊の機能はほとんどなされていなかった無料の変数は、インデックスの配列を知らずにや悩f_recurrence.

他のヒント

ながら、過去の事例かという答えは、こちらの二つの簡単な例Currying益F#プログラミング

open System.IO

let appendFile (fileName : string) (text : string) =
    let file = new StreamWriter(fileName, true)
    file.WriteLine(text)
    file.Close()

// Call it normally    
appendFile @"D:\Log.txt" "Processing Event X..."

// If you curry the function, you don't need to keep specifying the
// log file name.
let curriedAppendFile = appendFile @"D:\Log.txt"

// Adds data to "Log.txt"
curriedAppendFile "Processing Event Y..."

とを忘れないでカレーのPrintf家族の機能!のcdやd版の異なるがラムダ仕様.

// Non curried, Prints 1 2 3 
List.iter (fun i -> printf "%d " i) [1 .. 3];;

// Curried, Prints 1 2 3
List.iter (printfn "%d ") [1 .. 3];;

Curryingの転換を進機能は複数の引数チェーンの単一の引数をとる。例クライアントまで、フルのC#となり、三つの引数を取る関数:

Func<T1, Func<T2, Func<T3, T4>>> Curry<T1, T2, T3, T4>(Func<T1, T2, T3, T4> f)
{
    return a => b => c => f(a, b, c);
}

void UseACurriedFunction()
{
    var curryCompare = Curry<string, string, bool, int>(String.Compare);
    var a = "SomeString";
    var b = "SOMESTRING";
    Console.WriteLine(String.Compare(a, b, true));
    Console.WriteLine(curryCompare(a)(b)(true));

    //partial application
    var compareAWithB = curryCompare(a)(b);
    Console.WriteLine(compareAWithB(true));
    Console.WriteLine(compareAWithB(false));
}

現在、boolean型の引数はしょう ない 引数ののうまくいオープンの一部。このはんだ理由の一つの引数をF#機能では思えるかもしれないoddます。う定義の設定の異なるC#カレーの機能:

Func<T3, Func<T2, Func<T1, T4>>> BackwardsCurry<T1, T2, T3, T4>(Func<T1, T2, T3, T4> f)
{
    return a => b => c => f(c, b, a);
}

今でも有:

void UseADifferentlyCurriedFunction()
{
    var curryCompare = BackwardsCurry<string, string, bool, int>(String.Compare);

    var caseSensitiveCompare = curryCompare(false);
    var caseInsensitiveCompare = curryCompare(true);

    var format = Curry<string, string, string, string>(String.Format)("Results of comparing {0} with {1}:");

    var strings = new[] {"Hello", "HELLO", "Greetings", "GREETINGS"};

    foreach (var s in strings)
    {
        var caseSensitiveCompareWithS = caseSensitiveCompare(s);
        var caseInsensitiveCompareWithS = caseInsensitiveCompare(s);
        var formatWithS = format(s);

        foreach (var t in strings)
        {
            Console.WriteLine(formatWithS(t));
            Console.WriteLine(caseSensitiveCompareWithS(t));
            Console.WriteLine(caseInsensitiveCompareWithS(t));
        }
    }
}

なぜこれらの例はクライアントまで、フルのC#?でF#,関数の宣言は画廊によるデフォルトです。いる必要がありカレー機能彼らは既にクのcdやd.の例外があるが、その枠組み方法およびその他の機能過負荷きく、さまざまな要素のタプルを複数の引数になります。だしがしたいカレーのような機能を、いかにこの問いを探していたときのためのライブラリ関数といいます。しかも欠ければ確かにそれはいかなる些細な行:

let curry f a b c = f(a, b, c)

//overload resolution failure: there are two overloads with three arguments.
//let curryCompare = curry String.Compare

//This one might be more useful; it works because there's only one 3-argument overload
let backCurry f a b c = f(c, b, a)
let intParse = backCurry Int32.Parse
let intParseCurrentCultureAnyStyle = intParse CultureInfo.CurrentCulture NumberStyles.Any
let myInt = intParseCurrentCultureAnyStyle "23"
let myOtherInt = intParseCurrentCultureAnyStyle "42"

の障害と文字列になります。を比較して調査を実施しているのは、同じだが指定する3つの引数過負荷取りに使用でき、非一般解

let curryCompare s1 s2 (b:bool) = String.Compare(s1, s2, b)
let backwardsCurryCompare (b:bool) s1 s2 = String.Compare(s1, s2, b)

いについては詳しの部分的な機能を応用F#ので、答えが覆われる。

このシンプルなものになる。取り機能、結合、その引数として返します。例えば:

let concatStrings left right = left + right
let makeCommandPrompt= appendString "c:\> "

現在のよcurryingのconcatStringsの機能に簡単に追加できまDOSスタイルコマンドプロンプトの前の文字列で本当に便利です!

大丈夫をしなければいけません。不具合を見たいのですが、いく機能を返しまうデータストリームのようにする。

let readDWORD array i = array[i] | array[i + 1] << 8 | array[i + 2] << 16 | 
    array[i + 3] << 24 //I've actually used this function in Python.

の一つであることを設けるのではなく全体のクラスのためこのようなもの呼び出しのコンストラクタを呼び出し、obj.readDWORD()、あなただけの機能を持っているところできない変異からです。

から取り寄せた選りすぐりのできる地図、機能のリスト?例えば、マッピング機能を追加し、各要素のリスト:

> List.map ((+) 1) [1; 2; 3];;
val it : int list = [2; 3; 4]

これは実際に使用curryingので (+) オペレーターを作成するのに使用された機能を追加し、その引数で押し込もう少しこの例を変化させることによっても地図と同じ機能の一覧リスト:

> List.map (List.map ((+) 1)) [[1; 2]; [3]];;
val it : int list = [[2; 3]; [4]]

なcurryingできない一部の適用はこれらの機能が記のようなことではなく:

> List.map((fun xs -> List.map((fun n -> n + 1), xs)), [[1; 2]; [3]]);;
val it : int list = [[2; 3]; [4]]

私たとえばシミュレーションを行うcurryingクライアントまで、フルのC# 自分のブログ.の議を作成できる機能が閉鎖上のパラメータ(私の例の作成機能の算定の売上税を閉鎖の値を指定の市区町村)において、既存のマルチパラメータ機能です。

何が魅力的なはずが分離機能を具体的に計算売上高税理郡を作成できます(再利用)の機能を動的に行います。

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