Elm

Elm은 웹 브라우저 기반의 GUI(Graphical user interface)를 선언적으로 작성하기 위한 도메인 특화 언어이다. Elm은 순수 함수형 언어이며, 사용성(usability)·퍼포먼스·견고성을 중시하여 개발되고 있다. 정적이고 강력한 타입 검사에 의해 '사실상 일체의 실행시 예외가 일어나지 않는다'는 점을 강점으로 내세우고 있다.

역사 
Elm은 2012년 Evan Czaplicki의 석사논문으로 최초 설계되었다. 최초의 Elm은 많은 샘플 코드와 그것들을 브라우저로 간단하게 시험할 수 있는 온라인 에디터와 함께 릴리즈되었다. Evan Czaplicki는 Elm 개발을 위해 2013년 Prezi에 입사했고 2016년부터는 오픈 소스 엔지니어로 No RedInk에 소속되어 동시에 Elm 소프트웨어 재단을 설립했다.

최초의 구현에서 Elm 컴파일러는 HTML, CSS, JavaScript를 타겟으로 하고 있었다. 일련의 툴은 그 후도 확장을 계속하고 있어 현재는 REPL, 패키지 매니저, 시간 여행 디버거, Mac과 Windows 전용의 인스톨러를 갖추고 있다. Elm은 또 커뮤니티 라이브러리를 제공하는 에코 시스템을 가지고 있다.

특징 
Elm은 작지만 표현력이 풍부한 언어의 구성요소(if 표현식, let 표현식, 패턴매칭, 익명함수)를 가지고 있다. 불변성, 정적타이핑, HTML·CSS·JavaScript와의 상호 운용성을 주요한 기능으로서 가지고 있다.

불변성 
Elm의 모든 값은 불변이며, 한 번 만들어진 값에 대해 나중에 변경할 수는 없다. Elm은 영속 데이터 구조를 이용해 Array·Dict·Set 라이브러리를 구현하고 있다.

정적타이핑 
Elm은 정적타입이다. 모든 정의에는 그 값을 정확히 표현하는 타입을 명시할 수 있다. Elm의 타입에는 다음이 포함된다.

 정수나 문자열 등의 원시형 타입
 리스트, 튜플, 확장 레코드와 같은 기본적인 데이터 구조
 Tagged Union으로 불리는 합타입()

Elm은 완전한 타입 추론을 지원하고 있어 컴파일러는 타입 명시 없이 타입 안전 여부를 판정할 수 있다.

모듈 시스템 
Elm은 모듈 시스템을 가지고 있어서 사용자는 코드를 모듈이라 불리는 작은 단위로 분할할 수 있다.사용자는 값을 Import/Export 할 수 있고 자세한 구현을 다른 프로그래머가 의식할 필요가 없도록 은폐할 수 있다. 모듈은 Elm 커뮤니티 라이브러리의 기초가 되고 있다.

HTML, CSS, JavaScript와의 상호운용성 
Elm은 Port라는 개념을 이용해 JavaScript와 통신할 수 있다. 이것에 의해서 Elm과 JavaScript 사이에 데이터의 교환이 가능하게 된다.

제약사항 
Haskell, Pure Script와 달리 Elm은 타입클래스를 지원하고 있지 않기 때문에, 많은 공통적인 처리를 추상화 할 수 없다. 예를 들어 map, apply, fold, 혹은 filter와 같은 범용적인 함수는 없다. 대신 List.map Dict.map처럼 각각의 모듈 이름을 붙여 사용한다.

Elm은 elm/html이라고 하는 라이브러리에 의해서 Elm의 내부에서 HTML이나 CSS를 취급할 수 있다. Virtual DOM을 사용해 효율적으로 UI를 갱신한다.

코드 샘플 
-- 한줄 주석

{- 여러줄 주석
여러줄 주석
여러줄 주석
-}

{- 여러줄 주석은 {- 중첩 -} 하는 것이 가능합니다. -}

-- ''greeting''라는 값을 정의。타입은 String로 자동추론된다.
greeting =
    "Hello World!"

--  Top 레벨 선언에는 타입주석을 다는게 좋다.
hello : String
hello =
    "Hi there."

-- 함수도 마찬가지로 선언한다. 인수는 함수명 뒤에 쓴다.
add x y =
    x + y

-- 피라고라스 공식을 이용해서 빗변을 구하는 함수
hypotenuse : Float -> Float -> Float
hypotenuse a b =
    sqrt (a^2 + b^2)

-- curry가 적용된 함수。곱셈 중위연산자에 2를 부분 적용한다.
multiplyBy2 : number -> number
multiplyBy2 =
    (*) 2

-- 조건분기는 if문을 사용한다.
absoluteValue : number -> number
absoluteValue number =
    if number < 0 then negate number else number

-- 레코드 타입을 사용해서 필드명을 부여한다.
book : { title : String, author : String, pages : Int }
book =
    { title = "Steppenwolf"
    , author = "Hesse"
    , pages = 237
    }

-- `.`을 사용해서 레코드의 값에 접근한다.
title : String
title =
    book.title

-- `.`을 사용한 레코드 접근은 함수로도 사용할 수 있다.
author : String
author =
    .author book

-- 커스텀 타입을 정의하기 위해서는 `type`키워드를 사용한다.
-- 다음의 타입정의는 2진트리를 나타낸다.
type Tree a
    = Empty
    | Node a (Tree a) (Tree a)

-- 이러한 커스텀 타입은 case문을 사용해서 분기할 수 있다.
depth : Tree a -> Int
depth tree =
    case tree of
        Empty ->
            0

        Node value left right ->
            1 + max (depth left) (depth right)

각주

외부 링크 

 공식사이트
 온라인에서 코드 실행 elm-lang.org/try
 Elm 설치 Install Elm
 학습 자료와 예시
 코어 라이브러리와 커뮤니티 라이브러리

함수형 프로그래밍 언어
도메인 특화 프로그래밍 언어
정적 타입 프로그래밍 언어