문제

누군가를 제공,바람직하게는 실제/용,그들에 게시할 수 있습을 보여주는 개념?

도움이 되었습니까?

해결책

(편집:작 Ocaml FP 고안 일을 시작하는)

고안의 무두질(고안에 대해 식품,하지 않은 음식에 대해)

학생했을 자크 Garrigue 고 말했다,"나는 무엇인지 이해하지 변환이 좋습니다." 자크 라고 대답에게"나에게 당신의 마음에 드는 식사를 좋아하는 디저트".의아해 학생 대답했다는 그가 좋아 오고 가장자,그러나 동시에 그의 마음에 드는 레스토랑을 제공한키,그들의 가장자 항상 그에게 복통 다음과 같은 아침입니다.그래서 자크를했다는 학생을 먹는 레스토랑에서는 제공되는 오으로 학생의 마음에 드는 다음했다는 그 마을에서 가게에는 우수한 칸텐 곳에 학생이 행복하게 적용되는의 나머지 자신의 식욕입니다.학생은 물리게되었다,그러나 그는 계몽...다음날 아침까지 일어났을 때 그 위를 느꼈다.

내 예를 덮을 것이다 그것을 사용하고 재사용 및 캡슐화의 코드입니다.이것은 매우 분명면에서 보면 이러한을 줘야 한 콘크리트,간단한 예제는 생각할 수 있습의 적용에서 수많은 상황입니다.

우리가 하고 싶은 지도 위에 나무입니다.이 기능을 수 있 카레 및에 적용되는 각 노드를 필요로 하는 경우 하나 이상-논쟁이기 때문에 우리가 신청서 노드의 그것의 마지막 인수입니다.그것은 필요가 없을 것 카레지만,쓰기 또 다른 기능(이 함수에서 사용되고 있는 다른 인스턴스와 다른 변수)낭비가 될 것입니다.

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

그래서 이 간단한 케이스지 않을 설득력이 있습니다.그것은 정말이지만,강력한 일단 당신이 언어를 사용하세하고 자연스럽게 이러한 상황입니다.다른 예제와 일부 코드를 재사용으로 변환.A 재발과 관련하여 만들 prime 번호.많은 유사성에 있다:

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

확인,지금은 롤랜드와 cloitre 은 카레 기능을,이후 그들은 무한 변수,그리고 우리는 얻을 수 있습니다 어떤 지수는 그것의 순서 없이 알거나 걱정 f_recurrence.

다른 팁

는 동안 이전의 예에는 질문에 대답 여기에 두 가지 간단한 예제는 어떻게 변환 도움이 될 수 있습니다 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 가능!에서의 변환전 통지의 명백한 부족 람다.

// 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];;

변환 프로세스에 대해 설명합 변환 기능으로 여러 논쟁으로 체인의 하나의 인수 기능입니다.예제에서는 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#기능을 할 수 있게 보상합니다.을 정의하자 다른 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#,함수의 선언은 카레 기본적으로 합니다.당신이하지 않는 일반적으로 필요가 카레 기능그들은 이미 변환.중요한 예외는 이 framework 방법과 기타 오버로드 기능을 가지고 가는 튜플을 포함하는 여러 인수입니다.당신은 따라서도 카레와 같은 기능을,및,사실 나에게 와서 이 질문을 했을 때 보고한 라이브러리 함수는 이것을 할 것입니다.나는 그것이 없어졌습니다(경우 실제로 그것입니다)때문에 그것의 아주 사소한 구현하기:

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:\> "

지금 변환하여 간단한 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(),당신은 단지 가능할 수 없는 돌연변이 아래에서 당신입니다.

할 수 있습니다 알고도 기능을 통해니까?예를 들어,mapping 기능을 하나 추가하여 각 요소의 목록:

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

이것은 실제로 이미 사용하면 변환기 (+) 연산자를 만드는 데 사용하는 기능을 하나 추가하는 인수 하지만 집중할 수 있습니다 조금 더 많은 이 예를 변경하여 그것을 지도 동일한 기능의 목록:

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

지 않고 변환할 수 있지 않은 부분적으로 적용하는 이러한 기능과가 뭔가를 작성하는 다음과 같이 대신:

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

나는 좋은 예를 시뮬레이션의 변환에서는 C# 내 블로그.요점은 당신을 만들 수 있는 기능 닫을 통해 매개 변수(예제는 함수를 만들에 대한 계산 판매 세상의 가치를 주촌)를 기존의 다 매개변수 함수입니다.

무엇이 매력적인 여기에 대하여 별도의 기능을 위해 특별히 계산하는 영업 세금 쿡 카운티에서,당신은 만들 수 있습니다(그리고 다시 사용)기능을 동적으로 런타임입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top