【问题标题】:How to check if a value exists in a list in smlnj如何检查一个值是否存在于 smlnj 的列表中
【发布时间】:2019-06-22 03:21:52
【问题描述】:

我正在做一些作业,我需要创建一个函数来检查列表中是否存在值。如果是,则返回 true,否则返回 false。我有一个想法,但我不断收到错误。我认为这可能是由于我对语法和风格缺乏了解,因为这是我第一次用 sml 编码。

我创建的函数存在,并且正在将值和列表作为元组传递。

fun exist (x, []) =     
if x = hd ([]) then true        
else if x  = tl ([]) then true    
else false;

抱歉,如果此代码不正确,但我收到错误消息:
" stdIn:2.6 警告:调用 polyEqual
标准输入:3.11 警告:调用 polyEqual
标准输入:1.6-4.11 警告:匹配非详尽 (x,nil) => ...
val 存在 = fn : ''a 列表 * 'b 列表 -> bool "

我不确定如何解决这个问题。任何帮助都会很棒。

【问题讨论】:

    标签: smlnj


    【解决方案1】:

    您的函数在 [] 上进行模式匹配,因此它只能匹配空列表。
    另外,hd []tl [] 都是错误,因为空列表既没有头也没有尾。

    此外,if some_condition then true else false 等价于 some_condition
    (而if some_condition then false else true 等价于not some_condition。)
    逻辑表达式通常比条件链更具可读性。

    你忘了递归;如果第一个元素不是您要查找的,您需要在列表的尾部使用exist

    要么坚持模式匹配:

    fun exist (_, []) = false
      | exist (x, y::ys) = x = y orelse exist (x, ys)
    

    或者不使用它:

    fun exist (x, xs) = not (null xs) andalso (x = hd xs orelse exist (x, tl xs)) 
    

    模式匹配通常是最易读的解决方案,可以清楚地显示各种情况。

    (您似乎混合了这两种形式,将[] 视为标识符而不是类型构造函数。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2021-11-04
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多