익명 함수
\x -> x + 1
\x y -> x + y
\x y -> [x, 1, y, 2]
백슬래시와 화살표 사이에 함수의 인자들, 화살표 오른편에는 함수의 내용
활용은 다음과 같이 한다.
> (\x y -> x * y) 2 3
6 : number
x와 y를 곱하는 익명 함수에 x 값에 2, y 값에 3을 대입하여 결과 6이 된다.
이름 정의된 함수
add : Int -> Int -> Int
add x y =
x + y
인자로 받는 Type들과 결과 Type을 첫줄에 기입한다. 이를 Elm 에서 시그니처라고 불린다.
다음 줄 에 함수의 내용을 기입한다.
다른 언어와 다르게 공백 만으로 함수의 인자를 전달한다.
풀어서 쓰면 아래와 같다.
Kotlin
add(2, 3)
Elm
((add 2) 3)
add 2
-- 중간 함수
-- 이 중간 함수를 add2 라 명명
-- 함수 내용을 보자면 아래와 같다.
add2 : Int -> Int -> Int
add2 2 y =
2 + y
add2 3
5 : Int
이름이 정의된 함수를 다음과 같이 활용할 수 있다.
> add 2 3
5 : Int
> add 2 3 == 5
True : Bool
> add (add 3 4) 5
12 : Int
부분 적용
모든 함수는 하나의 인자만을 받기 때문에 add 같은 함수를 호출할 때
아래와 같이 Int -> Int의 시그니처를 가질 수 있다.
add2 = add 2
add2 3
5 : Int
타입 변수
흔히 쓰이는 문자열 리스트의 indexOf 함수를 시그니처로 표현하면 다음과 같다.
indexOf: String -> List String -> Int
문자열 리스트이 아닌 정수 리스트를 가진 상황에서 위 함수를 재활용하고 싶을 땐 타입 변수(Stand-In) 기능으로
Generic 함수로 만들 수 있다.
indexOf: a -> List a -> Int
a Type이 String, Int, Boolean 등 여러가지 Type을 인자로 받을 수 있다.
인자로 전달되는 함수
타 언어의 람다 표현식과 같다.
예시로 정수 리스트를 문자열 리스트로 변환하는 map 함수를 시그너처로 표현하면 다음과 같다.
map : (Int -> String) -> List Int -> List String
- 첫번 째 인자로 함수를 받음
- 정수 리스트를 인자로 받음
- 최종적으로 정수 리스트를 문자열 리스트로 반환
> map toString [1, 2, 3]
["1","2","3"] : List String