如何检查smlnj列表中是否存在值

时间:2019-01-29 03:53:34

标签: smlnj

我正在做一些作业,我需要创建一个检查列表中是否存在值的函数。如果这样做,它将返回true,否则返回false。我有一个如何做的想法,但我不断出错。我认为这可能是由于我缺乏语法和样式知识,因为这是我第一次在sml中进行编码。

我创建了函数exist,并将一个值和列表作为元组传入。

SELECT COUNT(ID) - COUNT(Distinct Name) FROM Highschooler

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

,我不太确定如何解决此问题。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

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

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

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