수색…


통사론

  • - 인수가없는 함수를 정의하는 것은 단순히 값을 정의하는 것과 같습니다.
    언어 = "느릅 나무"
  • - 인수가없는 함수를 이름을 명시하여 호출
    언어
  • - 매개 변수는 공백으로 구분되고 함수의 이름을 따릅니다.
    xy = x + y를 더한다.
  • - 같은 방식으로 함수를 호출한다.
    5 2 추가
  • - 일부 매개 변수 만 제공하여 함수를 부분적으로 적용
    증분 = 1 추가
  • - | 연산자를 사용하여 왼쪽의 표현식을 오른쪽의 함수로 전달하십시오
    10 = 9 |> 증분
  • - <| 연산자는 오른쪽에있는 표현식을 왼쪽에있는 함수로 전달합니다.
    증분 <| 5 4 추가
  • - >> 연산자와 함께 두 함수를 결합하거나 구성합니다.
    backwardsYell = String.reverse >> String.toUpper
  • - <<가 반대 방향으로 동일하게 작동합니다.
    backwardsYell = String.toUpper << String.reverse
  • - 괄호 안에 영숫자가 아닌 이름이있는 함수는 새 연산자를 만듭니다.
    (#) xy = x * y
    10 = 5 # 2
  • - 중첩 연산자는 괄호로 묶으면 일반 함수가됩니다.
    10 = (+) 5 5
  • - 선택적 형식 주석이 함수 선언 위에 나타납니다.
    isTen : Int -> Bool
    isTen n = n == 10이면 참 else 거짓

개요

Elm의 함수 응용 프로그램 구문은 괄호 또는 쉼표를 사용하지 않고 대신 공백을 구분합니다.

이름 지정 함수를 정의하려면 multiplyByTwo 및 인수 x , 어떤 작업 등호 후 = 함수에서 반환 된 것입니다.

multiplyByTwo x =
    x * 2

함수를 호출하려면 함수의 이름과 인수를 지정하십시오.

multiplyByTwo 2  -- 4

multiplyByTwo(2) 와 같은 구문은 필요하지 않습니다 (컴파일러가 불평하지 않더라도). 괄호는 우선 순위를 해결하는 데에만 사용됩니다.

> multiplyByTwo multiplyByTwo 2
-- error, thinks it's getting two arguments, but it only needs one

> multiplyByTwo (multiplyByTwo 2)
4 : number

> multiplyByTwo 2 + 2
6 : number
-- same as (multiplyByTwo 2) + 2

> multiplyByTwo (2 + 2)
8 : number

람다 식

Elm에는 람다 식 또는 익명 함수에 대한 특수 구문이 있습니다.

\arguments -> returnedValue

예를 들어 List.filter 다음과 같이 표시됩니다.

> List.filter (\num -> num > 1) [1,2,3]
[2,3] : List number

더 깊이있는, 백 슬래시 \ 는 람다 식의 시작을 표시하는 데 사용되며, 화살표 ( -> )는 함수 본문의 인수를 구분하는 데 사용됩니다. 인수가 더 많으면 공백으로 구분됩니다.

normalFunction x y = x + y
-- is equivalent to
lambdaFunction = \x y -> x + y

> normalFunction 1 2
3 : number

> lambdaFunction 1 2
3 : number

지역 변수

함수 내에서 지역 변수를 정의하여

  • 코드 반복 감소
  • 서브 표현식에 이름을 붙이다.
  • 전달 된 인수의 양을 줄이십시오.

이것에 대한 구성은 let ... in ... 입니다.

bigNumbers =
    let
        allNumbers =
            [1..100]

        isBig number =
            number > 95
    in
        List.filter isBig allNumbers

> bigNumbers
[96,97,98,99,100] : List number

> allNumbers
-- error, doesn't know what allNumbers is!

let 의 첫 부분에 정의 된 순서는 중요하지 않습니다!

outOfOrder =
    let
        x =
            y + 1  -- the compiler can handle this

        y =
            100
    in
        x + y

> outOfOrder
201 : number

부분 신청

부분적 응용 프로그램이란 인수가 적은 함수를 호출하고 그 결과를 다른 함수 (나머지 인수를 기다리는)로 저장하는 것을 의미합니다.

multiplyBy: Int -> Int -> Int    
multiplyBy x y =
    x * y


multiplyByTwo : Int -> Int  -- one Int has disappeared! we now know what x is.
multiplyByTwo =
    multiplyBy 2


> multiplyByTwo 2
4 : Int

> multiplyByTwo 4
8 : Int

학문적 인 측면에서 볼 때 엘름 (Elm)은 장면 뒤에서 카레를 치기 때문에 이것을 할 수 있습니다.

엄격하고 지연된 평가

elm에서 마지막 인수가 적용될 때 함수의 값이 계산됩니다. 아래 예제에서 f가 3 개의 인수로 호출되거나 f의 카레 된 형식이 마지막 인수와 함께 적용될 때 log 의 진단이 인쇄됩니다.

import String
import Debug exposing (log)

f a b c = String.join "," (log "Diagnostic" [a,b,c]) -- <function> : String -> String -> String -> String

f2 = f "a1" "b2" -- <function> : String -> String

f "A" "B" "C"
-- Diagnostic: ["A","B","C"]
"A,B,C" : String

f2 "c3"
-- Diagnostic: ["a1","b2","c3"]
"a1,b2,c3" : String

때로는 기능이 즉시 적용되는 것을 막기를 원할 것입니다. 느릅 나무의 전형적인 사용법은 기능이 적용될 때를 제어하기위한 추상화를 제공하는 Lazy.lazy 입니다.

lazy : (() -> a) -> Lazy a

게으른 계산은 one () 또는 Unit 유형 인수의 기능을 사용합니다. 단위 유형은 일반적으로 자리 표시 자 인수의 유형입니다. 인수 목록에서 해당 인수는 _ 으로 지정되어 값이 사용되지 않음을 표시합니다. elm의 단위 값은 빈 터플 또는 구멍을 개념적으로 나타낼 수있는 특수 기호 () 지정됩니다. 함수 호출을 위해 괄호를 사용하는 C, Javascript 및 기타 언어의 빈 인수 목록과 비슷하지만 일반적인 값입니다.

이 예제에서 f 는 람다를 사용하여 즉시 평가되지 않도록 보호 할 수 있습니다.

doit f = f () -- <function> : (() -> a) -> a
whatToDo = \_ -> f "a" "b" "c" -- <function> : a -> String
-- f is not evaluated yet

doit whatToDo
-- Diagnostic: ["a","b","c"]
"a,b,c" : String

기능 평가는 기능이 부분적으로 적용될 때마다 지연됩니다.

defer a f = \_ -> f a -- <function> : a -> (a -> b) -> c -> b

delayF = f "a" "b" |> defer "c" -- <function> : a -> String

doit delayF
-- Diagnostic: ["a","b","c"]
"a,b,c" : String

느릅 나무에는 always 기능이있어 평가를 지연시키는 데 사용할 수 없습니다. elm은 함수 응용 프로그램의 결과를 사용하는지 여부에 관계없이 모든 함수 인수를 평가하므로 falways 매개 변수로 완전히 적용되므로 함수 응용 프로그램을 always 래핑하면 지연이 발생하지 않습니다.

alwaysF = always (f "a" "b" "c") -- <function> : a -> String
-- Diagnostic: ["a","b","c"] -- Evaluation wasn't delayed.

중위 연산자 및 중침 표기법

Elm은 사용자 삽입 연산자의 정의를 허용합니다.

중위 연산자는 함수 이름 주위에 괄호를 사용하여 정의됩니다.

건설을위한 중온 연산자의이 예제를 고려하십시오. Tuples 1 => True -- (1, True) :

(=>) : a -> b -> ( a, b )
(=>) a b =
    ( a, b )

Elm의 대부분의 함수는 접두어 표기법으로 정의됩니다.

억음 악센트 기호로 묶인 함수 이름 앞에 첫 번째 인수를 지정하여 중위 표기법을 사용하여 모든 함수를 적용합니다.

import List exposing (append)


append [1,1,2] [3,5,8]   -- [1,1,2,3,5,8]
[1,1,2] `append` [3,5,8] -- [1,1,2,3,5,8]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow