具有实数的ML函数

use*_*198 1 numbers ml

我是ML的新手并且一直在尝试简单的功能,但我在尝试使用实数来处理函数时遇到了麻烦.例如,这个反向功能....

    fun reverse (nil) = nil
      | reverse (x::xs) = if xs = nil then [x]
                         else (reverse xs) @ [x];
Run Code Online (Sandbox Code Playgroud)

我得到了整数和字符串的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
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么这个函数不适用于实数?

这是我尝试实时的输出...

    - 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)
Run Code Online (Sandbox Code Playgroud)

qap*_*hla 5

real在ML中不是一个相等类型,因此从reals 构造的多态类型也不是- 特别是real lists不是相等类型,因此你不能使用运算符=来比较两个real lists,即使这些列表是空的.相反,你需要模式匹配.例如,

fun reverse [] = []
  | reverse (x::xs) = (reverse xs) @ [x]
Run Code Online (Sandbox Code Playgroud)

要么

fun reverse [] = []
  | reverse (x::xs) = case xs of
                           [] => [x]
                         | _ => (reverse xs) @ [x]
Run Code Online (Sandbox Code Playgroud)

即使是非品质类型也会有用.

(或者,使用内置函数List.rev.)