elm에서`<<`연산자는 무엇을 의미합니까?
Elm Form Example 122 행 에서 다음 코드에서 <<
연산자는 무엇을 의미합니까?
Field.field Field.defaultStyle (Signal.send updateChan << toUpdate) "" content
Elm 구문 참조 에서 수 없습니다 .
그것은 의미 하는가, 언제, 대신 전송 분야의 변화 content
에 updateChan
, 전송 toUpdate
에 updateChan
?
<<
핵심 라이브러리에 정의 된 함수 구성 연산자 입니다. 기초의 모든 기능은 정규화되지 않은 Elm 프로젝트로 가져옵니다.Basics
느릅 나무의 유형 시스템
Elm 유형 시스템의 기본을 기억해 봅시다.
Elm은 정적으로 입력 합니다. 이것은 Elm에서 모든 변수 또는 함수에 유형이 유형이 변경되지 않음을 의미합니다. Elm 유형의 예는 다음과 가변적입니다.
Int
String
Maybe Bool
{ name : String, age : Int }
Int -> Int
Int -> String -> Maybe Char
.
정적 유형 지정은 컴파일러가 모든 함수 및 변수의 유형이 올바른지 확인 실행 실행 유형 오류가 발생하지 않습니다. 즉, String -> String
수신하거나 반환 하는 유형의 함수 가 사용하는 것을 허용하는 코드는 반환 Int
하지 않습니다.
당신은 또한 같은 구체적인 유형을 대체하여 기능을 다형성 할 수 String
또는 Maybe Int
같은 임의의 작은 작은 인 형태 변수로 a
. 예 를가 많은 느릅 나무의 핵심 기능은 입력 다형성 유형이있다 . 어떤 유형을 취하고 유형 값을 리턴합니다 .List.isEmpty
List a -> Bool
List
Bool
동일한 유형 변수가 다시 표시되면 유형 변수의 인스턴스는 반드시 유형이어야합니다. 예를 들어 유형이 있습니다. 이 적용한다면 당신 정수의 목록 (즉 유형이 무엇인가에 ), 그것은 을 구석으로입니다 다시 정수의 목록을 반환합니다. 더 많은 함수는 정수 목록을 없습니다. 이것은 컴파일러에 의해 보장됩니다.List.reverse
List a -> List a
List.reverse
List Int
Elm의 모든 기능은 기본적으로 커리 합니다. 즉, 인수가 2 개인 함수가있는 경우 인수가 1 개인 함수를 반환하는 1 인수 함수로 변환됩니다. 그렇기 때문에 느릅 나무의 함수 응용 프로그램 구문이 자바, C ++, C #을, 파이썬 등과 같은 다른 언어의 함수 응용 프로그램 과 매우 다릅니다 . 작성할를 someFunction(arg1, arg2)
수있을 때 를 작성할 이유가 없습니다 someFunction arg1 arg2
. 왜? 왜냐하면 실제로 someFunction arg1 arg2
는 ((someFunction arg1) arg2)
.
커링은 부분적 적용을 가능하게합니다. 부분적으로 적용 가정합니다 . 유형이 있습니다. 우리는 유형을 " 유형 과 유형 의 2 개의 인수를 취합니다 "로 읽을 수 있습니다 . 그러나 우리는 또한 " 유형의 인수 1 개를받습니다 . " 유형의 함수를 반환합니다 . 따라서 우리는 유형을 가질 함수를 만들 수 있습니다 .List.member
List.member
a -> List a -> Bool
List.member
a
List a
List.member
a
List a -> Bool
isOneMemberOf = List.member 1
List Int -> Bool
이것은 ->
함수의 유형 주석이 오른쪽 연관 임을 의미합니다 . 즉, a -> List a -> Bool
는 a -> (List a -> Bool)
.
중위 및 접두사 표기법
모든 중위 연산자 는 실제로 커튼 뒤의 기능입니다. 함수 이름이 영숫자가 아닌 기호 (예 : $, <|, << 등)로만 결합 경우에만 해당되며, 두 인수 사이에 배치 할 일반 함수처럼 앞에는 없습니다.
그러나 +
괄호로 묶어 2 개의 인수라는 이항 연산자를 넣을 수 있으므로 아래의 두 함수 응용 프로그램은 동일합니다.
2 + 3 -- returns 5
(+) 2 3 -- returns 5, just like the previous one
중위 연산자는 일반적인 함수입니다. 그들에 대해 특별한 것은 없습니다. 다른 기능과 곳곳에서 사용할 수 있습니다.
addTwo : Int -> Int
addTwo = (+) 2
addTwo 3 -- returns 5
기능 구성
(<<)
핵심 라이브러리에 정의 된 함수 구성 연산자 입니다. Elm은 기본의 모든 함수는 정규화되지 않고 Elm 프로젝트로 가져 오 이미 수행되어야합니다.Basics
import Basics exposing (..)
따라서 다른 연산자와 다른 연산자 (<<)
와 함수입니다. 그 유형은 무엇입니까?
(<<) : (b -> c) -> (a -> b) -> a -> c
때문에 ->
연관성, 이것은 동일합니다 :
(<<) : (b -> c) -> (a -> b) -> (a -> c)
즉, (<<)
타입 2 개 기능 b -> c
및 a -> b
부가이 한 타입의 기능을 리턴한다 a -> c
. 2 개의 기능을 하나로 구성합니다. 어떻게 작동합니까? 단순화를 위해 인위적인 예를 보겠습니다. 두 가지 간단한 함수가 가정합니다.
addOne = (+) 1
multTwo = (*) 2
우리가없는 가정 (+)
만 addOne
, 우리가 어떻게 3가 아닌 1을 추가하는 함수를 만들까요? 매우 간단합니다. 우리는
addOne
함께 3 번 구성 합니다.
addThree : Int -> Int
addThree = addOne << addOne << addOne
2를 더한 다음 4를 곱하는 함수를 다음 어떨까요?
ourFunction : Int -> Int
ourFunction = multTwo << multTwo << addOne << addOne
(<<)
오른쪽에서 왼쪽으로 함수를 구성합니다. 그러나 위의 예는 모든 유형이 동일하기 때문에 간단합니다. 목록의 모든 짝수 큐브의 수술을 어떻게합니까?
isEven : Int -> Bool
isEven n = n % 2 == 0
cube : Int -> Int
cube n = n * n * n
ourFunction2 : List Int -> Int
ourFunction2 = List.sum << filter isEven << map cube
(>>)
같은 함수이지만 인수가 뒤집혀서 대신 왼쪽에서 오른쪽으로 같은 구성을 사용할 수 있습니다.
ourFunction2 = map cube >> filter isEven >> List.sum
요약
와 같은 h << g << f
것을 f
보면 g
, h
이 함수 라는 것을 알 수 있습니다. 이 구문은 h << g << f
이 값에 적용 x
되면 다음을 알 수 있습니다.
- Elm은 먼저 적용
f
됩니다.x
- 그런 다음
g
이전 단계의 결과에 적용됩니다. - 그런 다음
h
이전 단계의 결과에 적용됩니다.
따라서 (negate << (*) 10 << sqrt) 25
= -50.0
, 25의 제곱근을 취하고 5를 얻은 다음 5에 10을 곱하고 50을 얻은 다음 50을 부정하고 -50을 얻습니다.
왜 <<가 아닌.
Elm 0.13 ( 공고 참조 ) 이전에는 함수 구성 연산자가 (.)
어떤 그 동작은 현재와 동일했습니다 (<<)
. (<<)
F # 언어의 Elm 0.13에서 채택되었습니다 ( Github 참조 ). 엘름 0.13도 추가 (>>)
하는 것과 같이 flip (<<)
, 그리고 기능 애플리케이션 조작자 대체 및 등가 등 .(<|)
($)
(|>)
flip (<|)
중위 함수 호출
일반적인 영숫자 함수 이름을 중위 이항 연산자로 바꿀 수 있는지 궁금 할 것입니다. Elm 0.18 이전에는 백틱을 사용하여 함수를 중위로 만들었으므로 2 미만은 동일합니다.
max 1 2 -- returns 2
1 `max` 2 -- returns 2
Elm 0.18 은이 기능을 제거했습니다 . Elm에서는 더 이상 할 수 없지만 Haskell 및 PureScript 와 같은 언어 에는 여전히 있습니다.
<<
함수 구성-함수를 반환합니다.
컴포지션은 계산 파이프, 함수 체인을 만듭니다. 이 파이프는 입력을 기다리고, 제공되면 첫 번째 함수가 계산을 시작하고 다음으로 출력을 보냅니다.
import Html
add x y =
Debug.log "x" x + Debug.log "y" y
add9 =
add 4 << add 5
main =
Html.text <| toString <| add9 2
참고 : 위의 예에서는 부분 응용 프로그램을 사용 합니다 . 기능에 모든 매개 변수를 제공하지 않고 결과적으로 기능을 얻습니다.
웹 브라우저에서 위의 예제를 실행하고 콘솔 출력을 보면 다음이 표시됩니다.
x: 5
y: 2
x: 4
y: 7
수학 연산으로 작성하면 다음과 같습니다.
4 + (5 + 2)
4 + 7
참고 : 정방향 버전을 사용할 수도 있습니다 >>
.
서명 읽기
이 연산자의 서명을보고 :
(<<) : (b -> c) -> (a -> b) -> a -> c
들면 <<
연산자 함수가 b -> c
첫번째 매개 변수로하고, 기능 a -> b
제 등은 :
(b -> c) << (a -> b)
그러나 세 번째 매개 변수도 a
있습니다. 때문에이 ->
후, 마우스 오른쪽 연관있다
(<<) : (b -> c) -> (a -> b) -> a -> c
다음과 같습니다.
(<<) : (b -> c) -> (a -> b) -> (a -> c)
.
그래서 <<
함수 를 반환합니다 a -> c
.
연관성
프로그래밍 언어에서 연산자의 연관성 (또는 고 정성)은 괄호가 없을 때 동일한 우선 순위의 연산자를 그룹화하는 방법을 결정하는 속성입니다. 즉, 각 연산자가 평가되는 순서 :
a = b = c
다음과 같이 구문 분석됩니다. a = (b = c)
- 연산자의 연관성은 무엇이며 왜 중요한가요?
- https://www.quora.com/How-does-one-explain-the-right-to-left-associativity-of-the-conditional-operator-in-C
중위 연산자
여기서는 중위 연산자<<
로 사용 하지만 괄호로 묶는 접두사 연산자로 사용할 수도 있습니다 : 또는 .(<<) (b -> c) (a -> b)
(<|) (add 4) (add 5)
느릅 나무 <0.18는 데 사용 당신이 정상적인 기능을 가지고 중위 연산자로 사용할 수 있습니다.
<|
운영자에 대한 한마디
<|
함수 응용 프로그램-값을 반환합니다.
기본적으로 괄호 대신 사용합니다.
text (something ++ something)
다음과 같이 쓸 수 있습니다.
text <| something ++ something
따라서이 연산자의 서명 을 살펴 보겠습니다.
(<|) : (a -> b) -> a -> b
<|
연산자의 a -> b
경우 첫 번째 매개 변수로 함수 가 있고 두 번째 매개 변수로 값 이 있음을 알 수 있습니다 a
.
(a -> b) <| a
그리고 그것은 b
.
함수 응용 프로그램으로 동일한 값을 얻을 수 있습니다 <|
.
v1 = add 4 <| add 5 <| 4
v2 = (add 4 << add 5) 4
- 이 연산자의 정방향 버전도 있습니다
|>
. - https://elm-community.github.io/elm-faq/#what-good-is-the--operator-if-it-is-just-function-application
- 명확성을 위해 혼합하지 않는
<|
및<<
기능 구성입니다. 구체적인 예를 들어 의미
\x -> (Signal.send updateChan (toUpdate x))
elm에서는 구문의 일부가 아니라 표준 라이브러리 인 Basics의 일부입니다 . <<
두 번째 시도 : D
<<
vs <|
차이 <<
와 <|
즉 <<
작성 기능에 사용되며 <|
생략 괄호로 사용된다.
왜 그렇게 작동 하는가
여기에 있는 유형 주석을 살펴 보겠습니다 .
<< : (b -> c) -> (a -> b) -> a -> c
이 정의는 두 개의 함수를 function에 전달하면 function을 <<
얻게 된다는 것을 알려줍니다 a -> c
.
데모가있는 예
hi a =
a + 2
hello a =
a * 2
bye =
hello << hi
c =
bye 3
c
value를 반환합니다 10
.
자세히 알아보기 :
javascript
개발자를 위한 Explantion :
--elm
(a << b) x
비슷할 것입니다
//javasript
a(b(x))
참조 URL : https://stackoverflow.com/questions/27441648/what-does-the-operator-mean-in-elm
'ProgramingTip' 카테고리의 다른 글
해시의 키에 모든 키 집합이 존재 확인 (0) | 2021.01.09 |
---|---|
즉석에서 CSS 파일 교체 (페이지에 새 스타일 적용) (0) | 2021.01.09 |
새 Chrome에서 드롭 다운 메뉴 검사 (0) | 2021.01.09 |
NSMutableArray addObject가 작동하지 않습니다. (0) | 2021.01.09 |
UINavigationBar 여러 줄 제목 (0) | 2021.01.09 |