【问题标题】:Key-value union function ocaml键值联合函数 ocaml
【发布时间】:2021-09-02 18:22:48
【问题描述】:

我正在尝试创建一个函数,该函数采用 (key,value) 的两个对列表,比较键,如果相同,则返回联合列表: [(1,["one"]);(1,["uno"])][(2,["two"]);(1,["eden"])] 应该返回[(1,["one";"uno";"eden"]);(2,"two")] 此代码返回单位,我不知道为什么:

type 'a kvs=(int*('a list))list ;;
let rec union l1 l2 =  match l1 with 
  |[]->l2
  |h::t-> let (k1,v1) = h and (k2,v2)=(List.hd l2) in 
      if (k1=k2)then begin 
        v1@v2;     (*this part*)
        union t l2
      end 
      else union t l2;;

let l1 = [(1,["three"]);(1,["tri"])];;
let l2 = [(2,["three"]);(1,["tri"])];;
union l1 l2;;    


  

【问题讨论】:

  • 列表是不可变的。 v1@v2 创建一个新列表,但您只是将其丢弃。您需要考虑如何返回此值以及在列表的其余部分上调用 union 的结果。
  • 嘿 OP(@tacocat),因为我的回答被否决了,我不知道为什么,所以我期待你的一点帮助。如果是您投了反对票,请给我留言,以便我知道原因,如果没有,请忽略。我不太关心否决票,而只是试图了解如何回答可以以多种方式解释的问题,并且是否有一种方式可以满足所有不同且不相关的解释。请帮忙,我只是敦促自己在 SO 上做得更好。
  • @NalinRanjan 我的猜测是因为您没有解决实际问题。 OP 不仅要求解决方案,还要求解释他们为什么会出错。虽然我认为即使他们只是要求一个解决方案,你仍然不应该只是给他们一个复制粘贴的答案,因为大多数这类问题来自试图解决一个练习的学生,而且有一个教授创建练习而不只是发布示例问题和解决方案列表的充分理由;让学生思考如何解决问题并考虑不同的解决方案。

标签: list tuples ocaml union key-value


【解决方案1】:

扩展@glennsl 的评论:当您使用stmt1; stmt2 时,stmt1 的结果将被丢弃。如果您使用 stmt1 来解决它的副作用,该构造仍然有用。例如。函数

let f x =
 Printf.printf "you passed the string %s" x;
 x

不会更改其结果,但会打印字符串 x 作为附加副作用。当stmt1 没有类型单元时,总是会发出您看到的警告,因为您隐含地忽略了它的值。相反,最好使用模式

    let v = v1@v2 in
    union t l2

这样您就可以在递归调用中使用v

如果您只是想让警告消失,您可以随时使用ignore(stmt1); stmt2 默默地丢弃stmt1 的值,但在大多数情况下这不是您想要的。

【讨论】:

    【解决方案2】:

    假设您想要一个能够获得所需输出的函数并且输出中的顺序无关紧要,以下是我认为您需要的...

    let union l1 l2 =
      let
        filter_unique = List.fold_left (fun acc curr -> if not (List.exists (fun y -> y = curr) acc) then (curr::acc) else acc) []
      in
      let rec unique_unions acc = function
        | [] -> acc
        | ((key, value)::tail) ->
           try
             let existing_values = List.assoc key acc in
             unique_unions ((key, filter_unique (existing_values @ value)) :: (List.remove_assoc key acc)) tail
           with
             Not_found -> unique_unions ((key, value) :: acc) tail
      in    
      unique_unions [] (l1 @ l2)
    
    
    

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2019-08-11
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多