如何检查一个值是否存在于smlnj的列表中

How to check if a value exists in a list in smlnj

我正在做一些家庭作业,我需要创建一个函数来检查某个值是否存在于列表中。如果是,则 return 为真,否则 return 为假。我知道如何去做,但我不断收到错误。我认为这可能是由于我缺乏语法和样式知识,因为这是我第一次使用 sml 编码。

我创建了函数 exist 并传递一个值并将其列为元组。

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

抱歉,如果此代码错误得可笑,但我收到错误消息:
" stdIn:2.6 警告:调用 polyEqual
stdIn:3.11 警告:调用 polyEqual
stdIn:1.6-4.11 警告:匹配不详尽 (x,nil) => ...
val exist = fn : ''a list * 'b list -> bool "

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

您的函数在 [] 上进行模式匹配,因此它只能匹配空列表。
此外,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)) 

模式匹配通常是最具可读性的解决方案,可以清楚地描述各种情况。

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