我是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