람바다 레전드. - 카레.

13965 단어 fsharpfunctional

소개하다.


함수식 프로그래밍과 특정한 행동을 공유해야 한다면 카레가 답이다.Haskell Curry Curry에서 생성되며, 기본적으로 여러 매개변수 또는 n-tuple 매개변수 함수를 단일 매개변수 함수 체인으로 변환하는 기술입니다.f:( x ∗ y ) → z to ( f ):x → ( y → z )

함수 서명

, ( x ∗ y ), 도메인 및 범위를 살펴보겠습니다.원조나 ( x ∗ y )은 두 가지 유형의 곱셈이나 두 가지 유형 간의 조합이다. 화살표 함수나 은 다른 집합으로 집합하는 것을 지시하는 데 쓰인다. 다시 말하면 지시 매개 변수와 반환은 역은 함수의 매개 변수이고 범위는 함수의 결과이다.
다음 예를 살펴보십시오.f: x → y상기 함수의 역은 x이고 범위는 y이며 x에서 y까지 읽는다. 따라서 함수 f의 매개 변수는 x이고 결과는 y이다.이제 도메인으로 원조를 사용하는 또 다른 예를 살펴보자.f: ( x ∗ y ) → z기호/이름
뜻하다

되돌아오다
도메인
매개변수 유형
사정거리
결과 유형
(10)∗ y)
원조
F#로 동일한 예를 보십시오.multiply: int → int
let multiply a b = a * b
multiply 5 3
multiply: ( int ∗ int ) → int
let multiply (a,b) = a * b
multiply (5,3)

카레


아이디어는 공유 구화 행위이기 때문에 두 개의 함수를 만들 것입니다.먼저 sum 함수입니다. 이 함수는 두 개의 int형 firstsecond을 매개 변수로 수신하고 int형 값 first+second을 되돌려줍니다.마지막으로 우리는 addOne 함수를 만들 것입니다. 이 함수는 second이라는 int 매개 변수만 수신하고 1을 이 매개 변수에 추가합니다.이렇게 하면 우리는 sum 행위를 addOne 함수에 공유할 수 있다.

정규와 함수

sum: ( int ∗ int ) → int
let sum (first , second) = first + second

let addOne second = sum (1, second)

addOne 2    
|> printf "regular function result: %d"
이것은 원조를 매개 변수로 하는 일반 함수로 두 개의 값에만 적용될 수 있다.

카레와 함수

sum: int → int → int or sum: int → (int → int)
let sum first = //main function
    let subFunction second = first + second
    subFunction

let addOne = sum 1 // int -> int

addOne 2
|> printf "curried sum result: %d"

우리가 한 일


우리는 두 개의 함수를 만들었습니다. 주함수 int → (int → int)에는 int형 매개 변수 first이 있고, 반환자 함수 int → int에는 int형 매개 변수 second이 있습니다. 당신의 몸에는 매개 변수와 매개 변수가 있습니다.

이게 어떻게 된 일입니까


주함수는 하나의 값을 매개 변수로 받아들여 내부 작용역에서 '유지' 를 합니다. 이 주함수는 하나의 매개 변수 서브 함수를 되돌려줍니다. 이 서브 함수는 주함수 매개 변수를 자신의 매개 변수와 추가합니다.이것은 하위 함수가 주 함수 내부 범위 내에 있기 때문에 모든 주 함수 변수, 즉 closure에 접근할 수 있다.
기본적으로 함수를 만들 때 모든 환경이 저장됩니다. 만약 작용역이 코드의 일부분이라면, 이것은 lexical/static scopelexical/static scope처럼 자유롭거나 경계가 있는 변수 작용역 접근 범위입니다.다음 예제를 참조하십시오.
let lexicalExample =
    let a = 2 // <- lexical scope start 
    let multiply b = a * b
    let a = 3 // <- lexical scope end
    multiply 5
lexicalExample
위의 예에서 변수 a을 만들 때도 lexical/static scope을 만들고 이 lexical/static scope에 함수 multiply을 만들면 multiply 함수는 a 값을 사용할 수 있다.a 변수를 다시 만들 때 다른 lexical/static scope을 만들 것입니다. 그러나 이것은 a 함수가 사용하는 multiply 값을 변경하지 않습니다. 왜냐하면 이 함수는 마지막 lexical/static scope 안에 만들어졌기 때문입니다.

현재 우리가 lexical closure에 대해 이야기할 때 이 개념은 같지만, 하나의 차이점이 있다. 작용역은 함수를 만들 때 만들어진 것이기 때문에 함수 작용역 내의 모든 것이 모든 함수 매개 변수에 접근할 수 있다.

FSharp의 비위를 맞추다


FSharp와 함께curry를 사용하는 것은 매우 쉽다. 기본적으로 모든 다중 매개 변수 함수는curry 함수이기 때문에 수동으로 만들 필요가 없다.아래를 보십시오.
let sum first second = first + second

let addOne = sum 1 // int -> int

addOne 2
|> printf "implicit curried sum result: %d"
결과는 첫 번째 함수와 같아서 우리는 더욱 간소화할 수 있다.이것 좀 봐라:
let addOne = (+) 1 // int -> int

addOne 2
|> printf "simplify curried sum result: %d"
구화 연산자는 infix notation이고 기본적으로 다중 매개 변수이다.(+): int → int → int

카레 사용


curry를 통해 우리는 함수를 부분적으로 응용할 수 있다. 다시 말하면, 우리는 함수의 N개 매개 변수 중 첫 번째를 복원하고 결과 함수를 다시 사용할 수 있다.이런 기술은 우리로 하여금 새로운 함수를 만들지 않는 상황에서 경량급 문법 공유 행위를 사용할 수 있게 한다.curried 함수의 좋은 예는 Seq.reduce|>이다. 아래와 같다.
[1;2;3;4]
|> Seq.reduce (+)
|> printf "sum of all list itens: %d"

이 표현을 해석해 주세요.


우선, 우리는 연산자 |> 또는 forward pipe operator이 무엇인지 알아야 한다.기본적으로 forward pipe operatorinfix notation으로 조작원은 왼쪽 값을 오른쪽 함수에 응용한다.f: a → (a → b) → b
let (|>) a b = b a
Seq.reduce 함수에는 두 개의 매개 변수가 있는데 하나는 first (int → int → int)이고 다른 하나는 seq\<int\>이다.만약에 당신이 좋은 관찰자라면 int → int → int의 서명이 (+) 조작부호의 서명과 같다는 것을 볼 수 있습니다. 그래서 우리는 (+) 조작부호 부분을 Seq.reduce에 적용한 다음에 [1;2;3;4]Seq.reduce (+)에 적용합니다.
같은 표현식은 다음과 같이 다른 방식으로 쓸 수 있다.
let sumAll = Seq.reduce (+) // seq<int> -> int

sumAll [1;2;3;4]
|> printf "sum of all of integer list : %d"
이것은 이전 표현식과 같지만 새 함수sumAll:seq<int> → int을 만들었고 일부는 (+)에서 Seq.reduce으로 적용됩니다.이렇게 하면 우리는 목록에 있는 모든iten의 합을 공유할 수 있다.

결론


currying은 매우 좋은 공유 행위의 기술로 기본적으로 문법 클립을 사용하여 n-tuple 매개 변수 함수를 일련의 매개 변수를 가진 함수로 변환한다.Fsharp에서curry를 사용하는 것은 매우 쉽다. 기본적으로 모든 다중 파라미터가curry이기 때문이다.

도구책

  • Currying wikipedia
  • Partial application vs. Curriyng
  • Funtional Programming: Currying vs. Partial application
  • Curried functions
  • Partial application
  • Currying
  • What are the practical advantages of currying?
  • Currying Haskell doc.
  • A real world Currying example
  • Partial application wikipedia
  • mathematical symbols
  • domain range codomain
  • 끝맺다


    이 글을 멋진 방식으로 읽으려면 github tower-of-windsock에 있는 저장소를 방문하십시오. 만약 어떤 오류, 입력 오류, 또는 문제가 있으면 여기에 쓰십시오. 기꺼이 대답하겠습니다.

    좋은 웹페이지 즐겨찾기