错误 SML:错误:未绑定变量或构造函数:valof

问题描述

我正在参加华盛顿大学提供的编程语言课程,在一次讲座中,出现了为 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 问题并不需要这种情况。