문제

나는 ML을 처음 접했고 간단한 기능을 시도해 왔지만 실수로 기능하는 기능을 얻는 데 어려움을 겪고 있습니다. 예를 들어,이 역 함수 ....

    fun reverse (nil) = nil
      | reverse (x::xs) = if xs = nil then [x]
                         else (reverse xs) @ [x];

정수와 문자열에 대한 프로퍼 출력을 얻습니다.

    - reverse [1,2,3,4];
    val it = [4,3,2,1] : int list
    - reverse ["a" , "b" , "c" , "d" ];
    val it = ["d","c","b","a"] : string list

이 기능이 왜 실수로 작동하지 않는지 설명 할 수 있습니까?

내가 진짜를 시도 할 때의 출력은 다음과 같습니다 ...

    - reverse [1.0, 2.0];
    stdIn:1.2-53.9 Error: operator and operand don't agree [equality type required]
      operator domain: ''Z list
      operand:         real list
      in expression:
        reverse (1.0 :: 2.0 :: nil)
도움이 되었습니까?

해결책

real ML의 평등 유형이 아니므로 다형성 유형도 구축되지 않습니다. reals- 특히 real listS는 평등 유형이 아니므로 연산자를 사용할 수 없습니다. = 두 가지를 비교합니다 real listS, 해당 목록이 비어 있더라도. 대신 패턴 일치가 필요합니다. 예를 들어,

fun reverse [] = []
  | reverse (x::xs) = (reverse xs) @ [x]

또는

fun reverse [] = []
  | reverse (x::xs) = case xs of
                           [] => [x]
                         | _ => (reverse xs) @ [x]

품질이없는 유형에도 작동합니다.

(또는 내장 기능을 사용하십시오 List.rev.)

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