我是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)
答案 0 :(得分:5)
real
不是ML中的相等类型,因此real
s构造的多态类型也不是 - 特别是real list
s不是相等类型,所以你不能使用运算符=
来比较两个real list
,即使这些列表为空。相反,你需要模式匹配。例如,
fun reverse [] = []
| reverse (x::xs) = (reverse xs) @ [x]
或
fun reverse [] = []
| reverse (x::xs) = case xs of
[] => [x]
| _ => (reverse xs) @ [x]
即使对于不平等类型也会有效。
(或者,使用内置函数List.rev
。)