type Name = string;
datatype Expr = Const of int
| Var of Name
| Neg of Expr
| Plus of Expr * Expr
| Mult of Expr * Expr
| App of Fun * Expr
and Fun = Def of Name * Expr
(* substitute every x in expression z with expression y *)
fun substitute (Name x, Expr y, Expr z) = if x = z then y else z;
x 및 z의 문자열 값을 비교하고 동일한 y 값을 반환하고, 그렇지 않으면 z를 반환하지만이 오류가 계속 발생합니까?ML의 다른 데이터 유형 비교
e.sml:13.33-13.39 Error: non-constructor applied to argument in pattern: Expr
e.sml:13.25-13.31 Error: non-constructor applied to argument in pattern: Expr
e.sml:13.17-13.23 Error: non-constructor applied to argument in pattern: Name
e.sml:13.50 Error: unbound variable or constructor: z
e.sml:13.46 Error: unbound variable or constructor: x
e.sml:13.57 Error: unbound variable or constructor: y
e.sml:13.64 Error: unbound variable or constructor: z
uncaught exception Error
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:296.17-296.20
그렇다면 이름을 Var과 어떻게 비교할 수 있습니까? 둘 다 문자열이기 때문에 어떻게해야합니까? – Jae
@Jay' "hello"'는 문자열입니다. 'Var "hello"는 문자열이 아니며'Expr' 유형의 값입니다. string 형의 값 (또는'Name', 같은 것)과'Expr' 형의 또 다른 값을 가지고 있고'Expr'이 주어진 이름을 가진'Var'인지를 검사하기를 원한다면 a) 'Expr'이 실제로 'Var'인지 확인하고 b) 문자열을 'Var'에서 가져와 다른 문자열과 비교할 수있는 패턴 매칭을 사용해야합니다. 그것이 당신에게 이해가되지 않으면 ML에서 패턴 매칭이 어떻게 작동 하는지를 읽어야합니다. – sepp2k