需要匹配OCaml中列表中的元组

时间:2015-01-25 05:43:17

标签: ocaml

我需要创建一个函数rec assoc(d,k,l),它取三元组(d,k,l),其中l是键值对的列表[(k1,v1);(k2,v2) );;]并找到第一个等于k的ki。如果找到这样的ki,则返回vi。否则,返回默认值d。它需要是尾递归的

这是我做的功能:

let rec assoc (d,k,l)  = match l with
  |[]-> d
  |(a,b)::t ->  
  if (a==k) then b
  else assoc(d,k,t)
;;

我的逻辑在于列表l的头部,如果列表中元组的第一部分与k匹配,则返回元组的第二部分。 如果没有,那么我想在列表的尾部再次调用该函数,以便检查每个元素。如果整个列表遍历到空列表而没有找到匹配项,我想返回d。出于某种原因,无论我给出什么列表,它总是返回d。可能是什么原因。

下面是它应该给出的一些示例输出:

# assoc (-1,"jeff",[("sorin",85);("jeff",23);("moose",44)]);;
- : int = 23
# assoc (-1,"bob",[("sorin",85);("jeff",23);("moose",44)("margaret",99)]);;
- : int = -1 

我的两个

返回-1

1 个答案:

答案 0 :(得分:3)

请勿使用==进行比较。这是一种特殊目的的物理平等"。使用=进行比较。

(除此之外,您的代码看起来非常棒。)

比较运算符在Pervasives module中定义。以下是=(正常的相等比较)和==(物理相等比较)的描述:

  

e1 = e2测试e1和e2的结构相等性。当且仅当它们的当前内容在结构上相等时,可变结构(例如引用和数组)是相等的,即使两个可变对象不是相同的物理对象。功能值之间的相等会引发Invalid_argument。循环数据结构之间的平等可能不会终止。

     

e1 == e2测试e1和e2的物理相等性。在可变类型(例如引用,数组,字节序列,具有可变字段的记录和具有可变实例变量的对象)上,当且仅当e1的物理修改也影响e2时,e1 == e2为真。在非可变类型上,(==)的行为是依赖于实现的;但是,保证e1 == e2意味着比较e1 e2 = 0.

一般来说,除非您需要此处描述的特定(弱)相等测试,否则您不应在代码中使用==。或者,不要使用它: - )