SML/NJ- 동적 타이핑과 일치하는 패턴
-
05-07-2019 - |
문제
동적으로 입력 된 입력 매개 변수로 기능을 작성할 수 있습니까? 나는 패턴 매칭을 시도했지만 분명히 그것은 이와 같이 작동하지 않는다.
나는 다음과 같은 일을하고 싶습니다 :
fun firstStr (0,n:string) = n
| firstStr (b:string,n:string) = if b>n then n else b;
고맙습니다.
해결책
StandardML은 엄격하고 정적으로 입력 한 언어입니다. 따라서 첫 번째 케이스에서 int를 수락하는 함수와 두 번째 문자열이있을 수 없습니다. 당신이 얻는 오류는입니다
this clause: string * string -> 'Z
previous clauses: int * string -> 'Z
in declaration:
firstStr =
(fn (0,<pat> : string) => n
| (<pat> : string,<pat> : string) => if <exp> > <exp> then n else b)
문자열 인 하나의 케이스와 int 인 경우 하나의 케이스를 원한다면 새 유형 인 A "를 만들 수 있습니다.태그가 지정된 연합"(일명"차별화 된 연합 ")는 패턴 일치와 함께 사용하기 쉽도록 설계되었습니다. 이는 다음과 같습니다.
datatype Wrapper = Int of int
| String of string
fun firstStr(Int 0, n:string) = n
| firstStr(String b, n:string) = if b>n then n else b
물론,이 래퍼 유형에 대해 더 적절한 이름을 찾고 싶을 수도 있습니다. 프로그램의 맥락에서 의미가 있습니다. 또한 유형 주석이 켜져 있습니다 n
실제로는 필요하지 않습니다. 글을 쓰는 것이 더 관용적 일 것입니다
fun firstStr(Int 0, n) = n
| firstStr(String b, n) = if b>n then n else b
또한, 컴파일러는 당신에게 사례를 발견하지 못했다고 말할 것입니다. 첫 번째 인수가 0과 같지 않은 정수라면 어떨까요?
마지막으로, 비교의 의미가 확실하지 않습니다. b>n
, 두 줄의 어떤 측면을 비교하고 싶습니까? SML에서 두 줄을 비교할 때 사전 (일명 알파벳) 비교가 보입니다. 그게 당신이 원하는 것입니까?
다른 팁
약간의 자세히 설명하려면 두 개의 인수가 있다고 가정 해 봅시다. 각각은 문자열이나 정수 일 수 있으며, 두 줄이 있으면 사전이 더 작은 문자열을 원한다면, 하나의 문자열이있는 경우, 그 문자열을 원한다면, 그리고 당신이있는 경우. 문자열을 반환 할 수없는 두 정수. 너 뭐하니? 유형 값을 반환하십시오 string option
(찾다 option
, SOME
, 그리고 NONE
~에 http://www.standardml.org/basis/option.html):
datatype string_or_int = String of string
| Int of int
fun firstStr(String a, String b) = SOME (if a < b then a else b)
| firstStr(String a, Int _ ) = SOME a
| firstStr(Int _, String b) = SOME b
| firstStr(Int _, Int _ ) = NONE
기능 firstStr
유형이 있습니다
string_or_int * string_or_int -> string option
유능한 ML 프로그래머가되는 가장 빠른 방법은 유형에 대해 먼저 생각하는 법을 배우십시오. 예를 들어, 당신이 정말로 원했던 것은 유형의 함수였습니다. string option * string -> string
, 당신은 직접 쓸 필요가 없습니다. 내장 기능 getOpt
것을 수행. 반면에, 그것은 당신이 원하는 것처럼 들립니다. string option * string -> string
, 당신은 쓸 수 있습니다
fun firstStr(SOME a, b) = if a < b then a else b
| firstStr(NONE, b) = b
그리고 당신은 필요하지 않습니다 SOME
가치 생성자 또는 an option
결과에 입력하십시오.
다형성 변이체 OCAML에는 더 많은 역동적 인 속성이 있습니다. 원하는 경우 OCAML과 SML은 매우 가까운 언어입니다.