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

需要匹配OCaml中列表中的元组,ocaml,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) ;; 我的

我需要创建一个函数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。不要使用
==
进行比较。这是一个特殊目的的“身体平等”。使用
=
进行比较

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

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

e1=e1和e2结构相等性的e2测试。可变结构(如引用和数组)如果且仅当其当前内容在结构上相等时才相等,即使两个可变对象不是相同的物理对象。函数值之间的相等将引发无效的\u参数。循环数据结构之间的相等性可能不会终止

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


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

不要使用
=
进行比较。这是一个特殊目的的“身体平等”。使用
=
进行比较

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

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

e1=e1和e2结构相等性的e2测试。可变结构(如引用和数组)如果且仅当其当前内容在结构上相等时才相等,即使两个可变对象不是相同的物理对象。函数值之间的相等将引发无效的\u参数。循环数据结构之间的相等性可能不会终止

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


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

不要使用
=
进行比较。这是一个特殊目的的“身体平等”。使用
=
进行比较

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

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

e1=e1和e2结构相等性的e2测试。可变结构(如引用和数组)如果且仅当其当前内容在结构上相等时才相等,即使两个可变对象不是相同的物理对象。函数值之间的相等将引发无效的\u参数。循环数据结构之间的相等性可能不会终止

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


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

不要使用
=
进行比较。这是一个特殊目的的“身体平等”。使用
=
进行比较

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

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

e1=e1和e2结构相等性的e2测试。可变结构(如引用和数组)如果且仅当其当前内容在结构上相等时才相等,即使两个可变对象不是相同的物理对象。函数值之间的相等将引发无效的\u参数。循环数据结构之间的相等性可能不会终止

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

一般来说,你不应该使用