【问题标题】:How can I make a function that takes two lists as args and returns true if the first list exists in the second?如果第一个列表存在于第二个列表中,如何创建一个将两个列表作为参数并返回 true 的函数?
【发布时间】:2019-04-03 07:38:37
【问题描述】:

我必须用 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

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    在您对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
    

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2020-07-24
      相关资源
      最近更新 更多