문제

동적으로 입력 된 입력 매개 변수로 기능을 작성할 수 있습니까? 나는 패턴 매칭을 시도했지만 분명히 그것은 이와 같이 작동하지 않는다.

나는 다음과 같은 일을하고 싶습니다 :

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은 매우 가까운 언어입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top