【问题标题】:Error SML : Error: unbound variable or constructor: valof错误 SML:错误:未绑定的变量或构造函数:valof
【发布时间】:2021-04-12 03:13:30
【问题描述】:

我正在参加华盛顿大学提供的编程语言课程,在其中一场讲座中,弹出的代码对 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 Error: unbound variable or constructor: valof

【问题讨论】:

  • 改用valOf(大写O)。
  • 是的,效果很好!谢谢。有趣的是教授的代码是低o。再次感谢!
  • 有点切题的想法,但似乎可以通过一些模式匹配来大幅改进这段代码。 isSome tl_ans andalso valof tl_ans 绝对是代码味道。
  • 教授可能没有运行他自己的代码。 ;-)

标签: sml smlnj


【解决方案1】:

正如quoify所说,它的拼写是valOf

正如科佩斯所说,如果你使用模式匹配,它会更短:

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 问题并不需要这种情况。

【讨论】:

  • 好吧,在这一点上还不如把整个事情也写成一个折叠:)
  • @kopecs:是的! :) 或者切换到此函数为 pre-defined 的语言,以将可排序元素的任何可折叠结构作为输入。 :)
  • 或者更确切地说,maximumMaybe 是更好的版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2015-02-04
相关资源
最近更新 更多