Вопрос

Я новичок в ML и пробовать простые функции, но у меня возникают проблемы с попыткой заставить функции работать с реальными числами. Например, эта обратная функция ....

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

Я получаю выход Propper для целых чисел и струн.

    - 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