ProgramingTip

elm에서`<<`연산자는 무엇을 의미합니까?

bestdevel 2021. 1. 9. 16:25
반응형

elm에서`<<`연산자는 무엇을 의미합니까?


Elm Form Example 122 행 에서 다음 코드에서 <<연산자는 무엇을 의미합니까?

Field.field Field.defaultStyle (Signal.send updateChan << toUpdate) "" content

Elm 구문 참조 에서 수 없습니다 .

그것은 의미 하는가, 언제, 대신 전송 분야의 변화 contentupdateChan, 전송 toUpdateupdateChan?


<<핵심 라이브러리에 정의 된 함수 구성 연산자 입니다. 기초의 모든 기능은 정규화되지 않은 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.isEmptyList a -> BoolListBool

동일한 유형 변수가 다시 표시되면 유형 변수의 인스턴스는 반드시 유형이어야합니다. 예를 들어 유형이 있습니다. 이 적용한다면 당신 정수의 목록 (즉 유형이 무엇인가에 ), 그것은 을 구석으로입니다 다시 정수의 목록을 반환합니다. 더 많은 함수는 정수 목록을 없습니다. 이것은 컴파일러에 의해 보장됩니다.List.reverseList a -> List aList.reverseList Int

Elm의 모든 기능은 기본적으로 커리 합니다. 즉, 인수가 2 개인 함수가있는 경우 인수가 1 개인 함수를 반환하는 1 인수 함수로 변환됩니다. 그렇기 때문에 느릅 나무의 함수 응용 프로그램 구문이 자바, C ++, C #을, 파이썬 등과 같은 다른 언어의 함수 응용 프로그램 과 매우 다릅니다 . 작성할를 someFunction(arg1, arg2)수있을 때 를 작성할 이유가 없습니다 someFunction arg1 arg2. 왜? 왜냐하면 실제로 someFunction arg1 arg2((someFunction arg1) arg2).

커링은 부분적 적용을 가능하게합니다. 부분적으로 적용 가정합니다 . 유형이 있습니다. 우리는 유형을 " 유형 과 유형 의 2 개의 인수를 취합니다 "로 읽을 수 있습니다 . 그러나 우리는 또한 " 유형의 인수 1 개를받습니다 . " 유형의 함수를 반환합니다 . 따라서 우리는 유형을 가질 함수를 만들 수 있습니다 .List.memberList.membera -> List a -> BoolList.memberaList aList.memberaList a -> BoolisOneMemberOf = List.member 1List Int -> Bool

이것은 ->함수의 유형 주석이 오른쪽 연관 임을 의미합니다 . 즉, a -> List a -> Boola -> (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 프로젝트로 가져 오 이미 수행되어야합니다.Basicsimport Basics exposing (..)

따라서 다른 연산자와 다른 연산자 (<<)와 함수입니다. 그 유형은 무엇입니까?

(<<) : (b -> c) -> (a -> b) -> a -> c

때문에 ->연관성, 이것은 동일합니다 :

(<<) : (b -> c) -> (a -> b) -> (a -> c)

즉, (<<)타입 2 개 기능 b -> ca -> 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에서는 더 이상 할 수 없지만 HaskellPureScript같은 언어 에는 여전히 있습니다.


<< 함수 구성-함수를 반환합니다.

컴포지션은 계산 파이프, 함수 체인을 만듭니다. 이 파이프는 입력을 기다리고, 제공되면 첫 번째 함수가 계산을 시작하고 다음으로 출력을 보냅니다.

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)

중위 연산자

여기서는 중위 연산자<<사용 하지만 괄호로 묶는 접두사 연산자로 사용할 수도 있습니다 : 또는 .(<<) (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

기능 구성입니다. 구체적인 예를 들어 의미

\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

cvalue를 반환합니다 10.

자세히 알아보기 :

  • 중위 연산자 -함수 왼쪽의 첫 번째 인수,
  • 부분 적용 -두 개의 인수를 예상하는 함수에 하나의 인수를 전달하면 하나의 인수를 예상하는 함수를 얻습니다.

javascript개발자를 위한 Explantion :

--elm

(a << b) x

비슷할 것입니다

//javasript

a(b(x))

<<또는 함수 구성>> 이라고 합니다.

참조 URL : https://stackoverflow.com/questions/27441648/what-does-the-operator-mean-in-elm

반응형