问题描述
我正在参加华盛顿大学提供的编程语言课程,在一次讲座中,出现了为 Dan 教授工作的代码,但是,我收到未绑定变量或构造函数:valof 错误。想不通。 它是 smlnj,并且在 emacs 上运行,如果它会产生任何帮助。
fun max1(xs: int list)=
if null xs
then NONE
else
let val tl_ans = max1(tl xs)
in if isSome tl_ans andalso valof tl_ans > hd xs
then tl_ans
else SOME (hd xs)
end
这里是错误:options.sml:7.37-7.42 错误:未绑定变量或构造函数:valof
解决方法
正如 quoify 所说,拼写为 valOf
。
正如 kopecs 所说,如果你使用模式匹配,它会更短:
fun max1 (x::y::rest) = max1 (Int.max (x,y) :: rest)
| max1 [x] = SOME x
| max1 [] = NONE
(为了简洁起见,此版本还使用了库函数 Int.max
。)
如果太紧凑,你也可以这样写:
fun max1 (x::y::rest) = let val z = Int.max (x,y) in max1 (z::rest) end
| max1 [x] = SOME x
| max1 [] = NONE
幻灯片中的版本处理了许多递归函数中出现的烦人情况,这些函数返回和类型如 'a option
:您可能需要执行调用,进行一些解包(即删除 SOME
) ,然后将结果打包回来(即再次添加 SOME
)。
但是 max1
问题并不需要这种情况。