이 유효한 구문에 가까운 것 :
fun member (e, []) = false
|member (e, h as (e::rest)) = true
|member (e, h::rest) = member (e, rest);
참고 "같은 시간 ...".
"e"가 두 번째 패턴에서 중복되어 여전히 잘못되었으므로 허용되지 않습니다.
이 문법적으로 정확 :
fun member (e, []) = false
|member (e, h as (e2::rest)) = true
|member (e, h::rest) = member (e, rest);
하지만 여전히 논리적으로 맞지 않습니다. Sebastien이 언급 한 것처럼, 두 번째 패턴 member (e, h as (e2::rest))
은 세 번째 패턴과 동일하므로 member (e, h::rest)
으로 작성하는 것이 더 좋으므로 세 패턴 중 두 패턴 만 유지하도록하는 것이 좋습니다.
요소 e가 원래의 구문 오류 외에도리스트 L
에 속하는 경우 내가 직접 확인하는 프로그램을 작성해야합니다, 당신은 e
를 확인할 수없는 패턴으로, 목록에 , 패턴 에서처럼 변수는 상수처럼 해석되지 않습니다. 패턴에서는 상수 만이 값을 나타내고 반대로 변수 은 값이 할당되고 구조는입니다. 전의. true
또는 false
과 같은 것이 있는지 스스로 확인할 수 있지만 변수가 아닙니다 (이것이 SML이 정의 된 방법입니다). 패턴 만 사용하려는 경우에도 if … then … else
을 사용해야합니다.
호기심에서 벗어난 당신은 guarded 패턴 일치를 원했던 가설 sML (Successor ML)에 관심이있을 수 있습니다 : Match guards (successor-ml.org).