我正在做一些作业,我需要创建一个检查列表中是否存在值的函数。如果这样做,它将返回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“
,我不太确定如何解决此问题。任何帮助都会很棒。
答案 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))
模式匹配通常是最易读的解决方案,并且可以清晰地显示出各种情况。
(您似乎混合了两种形式,将[]
视为标识符而不是类型构造函数。)