需要匹配OCaml中列表中的元组
我需要创建一个函数rec assoc(d,k,l),它接受一个三元组(d,k,l),其中l是键值对的列表[(k1,v1);(k2,v2);…],并找到第一个等于k的ki。如果找到这样一个ki,则返回vi。否则,将返回默认值d。它需要是尾部递归的 以下是我制作的函数:需要匹配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) ;; 我的
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
一般来说,你不应该使用