如果第一个列表存在于第二个列表中,我如何制作一个将两个列表作为args并返回true的函数?

时间:2019-04-02 19:07:09

标签: sml smlnj

我必须用sml / nj写这个 我做了尝试,这就是我所做的:

我希望all函数在运行该函数时返回一个正数,但是例如当我给[1,2,3] [1,1,2,3,1,2,3,1]时 返回非穷举匹配失败。 函数有什么问题,我该怎么做才能查看元素 第一个列表中的第二个存在吗?

fun elem num [] = false
  | elem num (x::xs) = if num = x then true else elem num xs

fun all [] [] =
  let
    fun qwe [] [] acc = acc
      | qwe (x::xs) (z::zs) acc = if elem x (z::zs) then qwe xs (z::zs) (1+acc) else qwe xs (z::zs) acc
  in
    qwe [] [] 0
  end

1 个答案:

答案 0 :(得分:0)

在对all的定义中,您似乎误以为[]是一个普通列表,而不是一个空列表。

all定义中实际出现的唯一模式是[] [](两个空列表)。最强调的是非穷举匹配的情况。

由于辅助函数qwe可以完成实际工作,因此all本身进行模式匹配确实没有任何意义。 all的整体形式可以是:

fun all xs ys =
  let
    fun qwe = (*insert definition*)
  in
    qwe xs ys 0
  end;

(这里使用zs而不是ys有点尴尬)

que的定义应具有2-4个模式。 4模式定义(某些功能需要在两个列表上进行操作):

fun qwe [] [] acc = (*insert def*)
  | qwe [] (y::ys) acc = (*insert def*)
  | qwe (x::xs) [] acc = (*insert def*)
  | qwe (x::xs) (y::ys) acc = (*insert def*)

最后一个给出4种情况,第一个列表和第二个列表的每个布尔组合为空。有时您不需要为每个代码编写单独的代码。例如,

fun qwe [] [] acc = (*insert def*)
  | qwe [] ys acc = (*insert def*)
  | qwe (x::xs) ys acc = (*insert def*)

将第3种情况和第4种情况组合为一个情况。

如果您查看elem的实际定义,就会意识到可以很好地处理空ys的情况,因此在qwe的定义中,您实际上只能根据xs的工作情况使用两种模式:

fun qwe [] ys acc = (*insert def*)
  | qwe (x::xs) ys acc = (*insert def*) 

由于ys可以同时匹配空列表和非空列表,因此上述模板是详尽无遗的。

对于上述que的两种情况,有了适当的定义(您基本上已经有了),您的函数all将起作用:

- all [1,2,3] [1,1,2,3,1,2,3,1];
val it = 3 : int