如何检查一个值是否存在于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))
模式匹配通常是最具可读性的解决方案,可以清楚地描述各种情况。
(您似乎混合了两种形式,将 []
视为标识符而不是类型构造函数。)
我正在做一些家庭作业,我需要创建一个函数来检查某个值是否存在于列表中。如果是,则 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))
模式匹配通常是最具可读性的解决方案,可以清楚地描述各种情况。
(您似乎混合了两种形式,将 []
视为标识符而不是类型构造函数。)