{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보|name=Standard ML|logo=|paradigm=[[다중 패러다임 프로그래밍 언어|다중 패러다임]]: [[함수형 프로그래밍|함수형]], [[명령형 프로그래밍|명령형]], [[모듈러 프로그래밍|모듈 방식]]<ref>{{웹 인용|title=Programming in Standard ML: Hierarchies and Parameterization|url=https://www.cs.cmu.edu/~rwh/introsml/modules/subfun.htm|accessdate=2020-02-22}}</ref>|family=[[ML (프로그래밍 언어)|ML]]|year={{시작 날짜와 나이|1983|df=yes}}<ref name="smlnj.org">{{웹 인용|url=http://www.smlnj.org/sml97.html|title=SML '97|website=www.smlnj.org}}</ref>|designer=|latest release version=Standard ML '97<ref name="smlnj.org"/>|latest release date={{시작 날짜와 나이|1997|df=yes}}|typing=[[형추론|추론]], [[자료형 체계|정적]], [[스트롱 타이핑|스트롱]]|implementations=[[SML/NJ]], [[MLton]]|dialects=[[앨리스 (프로그래밍 언어)|앨리스]], [[컨커런트 ML]], [[디펜던트 ML]]|influenced_by=[[ML 프로그래밍 언어|ML]], [[호프 (프로그래밍 언어)|호프]], [[파스칼 (프로그래밍 언어)|파스칼]]|influenced=[[Elm]], [[F 샤프|F#]], [[F* (프로그래밍 언어)|F*]], [[OCaml]], [[파이썬]],<ref>{{웹 인용|url=https://docs.python.org/3/library/itertools.html|title=itertools — Functions creating iterators for efficient looping — Python 3.7.1rc1 documentation|website=docs.python.org}}</ref> [[러스트 (프로그래밍 언어)|러스트]], [[스칼라]]|file_ext=.sml|website=}}

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

SML은 계산가능한 함수( [[ 계산 가능한 기능을 위한 논리 |Logic for Computable Functions]] )의 정리 증명 프로젝트에서 사용되는 프로그래밍 언어인 [[ML (프로그래밍 언어)|ML]]의 현대적 방언이다. ''The Definition of Standard ML''에서  [[ 유형 규칙 |타입 규칙]]과 [[ 연산 의미론 |조작적 의미론(operational semantics)]]을 포함하는 표준이 있다는 점에서 널리 사용되는 언어들 사이에서 두드러진다.<ref>{{서적 인용|제목=The Definition of Standard ML (Revised)|성=Milner|이름=Robin|성2=Tofte|이름2=Mads|연도=1997|출판사=MIT Press|isbn=0-262-63181-4|성3=Harper|이름3=Robert|성4=MacQueen|이름4=David}}</ref>

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

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

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

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

== 같이 보기 ==
* [[선언형 프로그래밍]]
== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://sml-family.org Standard ML Family GitHub Project] {{웨이백|url=http://sml-family.org/ |date=20200220023435 }}
* [http://scholarpedia.org/article/Standard_ML_language Standard ML language] Mads Tofte, [[Scholarpedia]], 4(2):7515. [[doi:10.4249/scholarpedia.7515]]

{{전거 통제}}

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