Elm Language
기능 및 부분 적용
수색…
통사론
- - 인수가없는 함수를 정의하는 것은 단순히 값을 정의하는 것과 같습니다.
언어 = "느릅 나무" - - 인수가없는 함수를 이름을 명시하여 호출
언어 - - 매개 변수는 공백으로 구분되고 함수의 이름을 따릅니다.
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은 함수 응용 프로그램의 결과를 사용하는지 여부에 관계없이 모든 함수 인수를 평가하므로 f 가 always 매개 변수로 완전히 적용되므로 함수 응용 프로그램을 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]