람바다 레전드. - 카레.
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형 first
과 second
을 매개 변수로 수신하고 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 operator은 infix 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이기 때문이다.
도구책
끝맺다
이 글을 멋진 방식으로 읽으려면 github tower-of-windsock에 있는 저장소를 방문하십시오. 만약 어떤 오류, 입력 오류, 또는 문제가 있으면 여기에 쓰십시오. 기꺼이 대답하겠습니다.
Reference
이 문제에 관하여(람바다 레전드. - 카레.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nathancaracho/lambda-saga-currying-487h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)