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

错误SML:错误:未绑定变量或构造函数:valof,sml,smlnj,Sml,Smlnj,我正在学习华盛顿大学提供的编程语言课程,在其中一次讲座中,这段代码为丹教授编写,然而,我得到了未绑定的变量或构造函数:valof error。我想不出来。 它是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

我正在学习华盛顿大学提供的编程语言课程,在其中一次讲座中,这段代码为丹教授编写,然而,我得到了未绑定的变量或构造函数:valof error。我想不出来。 它是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

下面是错误:选项。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
:您可能需要执行一个调用,进行一些解包(即删除
一些
),然后将结果打包(即再次添加
一些


但是
max1
问题并不需要这种情况。

试试
valOf
(大写字母O)。是的,效果非常好!非常感谢。有趣的是,教授的代码使用的是较低的o。再次感谢!这有点牵强,但似乎这段代码可以通过一点模式匹配得到实质性的改进
是一些tl_ans,而且valof tl_ans
肯定是一种代码气味。教授可能没有运行自己的代码。;-)在这一点上,不妨把整件事也写成一个折页:)@kopecs:是的!:)或者切换到一种语言,在该语言中,该函数以任何可折叠的有序元素结构作为输入。:)或者说,这是更好的版本。