Pergunta

Sou novo no ML e tenho tentado funções simples, mas estou tendo problemas para tentar conseguir funções para trabalhar com números reais. Por exemplo, essa função reversa ....

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

Recebo a saída do Propper para números inteiros e strings.

    - 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

Alguém pode me explicar por que essa função não funcionará com números reais?

Aqui está a saída quando eu tento reais ...

    - 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)
Foi útil?

Solução

real não é um tipo de igualdade em ml e, portanto, os tipos polimórficos não são construídos a partir de reals - em particular, real listS não são tipos de igualdade e, portanto, você não pode usar o operador = para comparar dois real listS, mesmo que essas listas estejam vazias. Em vez disso, você precisa corresponder ao padrão. Por exemplo,

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

ou

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

funcionará mesmo para tipos de não qualidade.

(Alternadamente, use a função embutida List.rev.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top