표준 ML

표준 ML(Standard ML, SML)은 정적 정형 및 타입 추론을 지원하는 범용 모듈성, 함수형 프로그래밍 언어. 컴파일러 개발과 프로그래밍 언어 연구, 자동 정리 증명의 개발에 사용된다.

SML은 계산가능한 함수( Logic for Computable Functions )의 정리 증명 프로젝트에서 사용되는 프로그래밍 언어인 ML의 현대적 방언이다. The Definition of Standard ML에서  타입 규칙과 조작적 의미론(operational semantics)을 포함하는 표준이 있다는 점에서 널리 사용되는 언어들 사이에서 두드러진다.

언어 
SML은 순수 함수형 프로그래밍이 아니다. SML로 작성된 프로그램은 구문이나 명령어가 아니라 평가되는 표현식으로 구성되지만, 일부 표현식은 무의미한 "단위"값을 반환하고 부작용을 갖는다.

다른 함수형 프로그래밍처럼 SML의 핵심은 함수다. 예를 들어 계승 함수는 아래과 같이 표현된다.  fun factorial n = 
        if n = 0 then 1 else n * factorial (n - 1) SML 컴파일러는 함수의 정적 타입 int -> int를 사용자의 별도 명시없이 유추한다. 즉, n 은 정수 표현식에서만 사용되므로 정수여야하며, 함수는 항상 정수를 리턴한다고 추론한다.

if - then - else 조건문은 절에 따라 정의된 함수로 동일하게 표현될 수 있으며, 일치하는 것을 찾을 때까지 작성된 순서대로 하나씩 시도하고 '|'로 나뉘는 계승 함수의 특정 값을 평가하는 템플릿의 배열로 대체된다.  fun factorial 0 = 1
   | factorial n = n * factorial (n - 1)case 문으로 아래와 같이 작성할 수도 있다. val rec factorial =
        fn n => case n of 0 => 1
                        | n => n * factorial (n - 1) 반복문으로는 fun factorialIT value =
let
  val flag = ref value and i = ref 1
in
  while !flag <> 0 do (
  i := !i * !flag;
  flag := !flag - 1
  );
  !i
end; 익명 함수로는 val rec factorial = fn 0 => 1 | n => n * factorial(n - 1) 여기서 val 키워드는 식별자와 값을 바인딩하고, fn은 익명 함수를 정의하고, case는 일련의 패턴과 해당 표현식을 매칭한다.

로컬 함수를 사용해서 함수를 꼬리 재귀로 최적화할 수 있다.  fun factorial n = let
      fun lp (0, acc) = acc
        | lp (m, acc) = lp (m-1, m*acc)
      in
        lp (n, 1)
      end

각주

외부 링크 
 Standard ML Family GitHub Project 
 Standard ML language Mads Tofte, Scholarpedia, 4(2):7515. doi:10.4249/scholarpedia.7515

1990년 개발된 프로그래밍 언어
함수형 프로그래밍 언어
ML 프로그래밍 언어 계열
절차적 프로그래밍 언어