2014-09-24 2 views
0

요소 e가 목록 L에 속하는지 확인한 다음 true를 반환하는 프로그램을 작성해야합니다. 나는 패턴 매치를 시도하므로 if를 사용하지 않는 것을 선호한다.EQUALOP에서 SML 구문 오류가 발견되었습니다.

는이 코드 쓰기 :

member (e, []) = false 
    |member (e, h=e::rest) = true 
    |member (e, h::rest) = member (e, rest); 

을 그리고 난 ''EQUALOP에서 찾을 구문 오류 ''를 얻을. 아무도 내가 무엇을 바꿔야한다고 설명 할 수 있습니까?

답변

1

패턴에 = (또는 다른 연산자 또는 기능)을 사용할 수 없습니다.

(e, h::rest) 패턴을 사용해야합니다. 그런 다음 if e = h then ... else ...을 사용하여 동일한 지 확인하십시오.

0

이 유효한 구문에 가까운 것 :

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).