如何根据 OCAML 中的上下文使参数采用伪 "null" 值
How to make a parameter take a pseudo "null" value depending on the context in OCAML
我想制作一个接受列表和运算符的函数,并对列表的所有元素执行该操作。
问题是,在制作辅助函数时,我不知道如何将附加参数初始化为函数将作为输入的数据类型的 "NULL"。
例如,如果我们正在处理整数,我希望我的参数取值 0、0。对于浮点数和字符串“”。
提前致谢!
let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) (ret:'a) = match li with
| [] -> va
| h :: t -> combine_all_aux va op t (op ret h)
;;
let combine_all va op li =
combine_all_aux va op li (Something)
;;
我注意到的第一件事是您的代码,如给定的那样,总是 returns va
。当它到达列表末尾时,它会忽略累加值 ret
.
因此,很难准确理解该函数的作用。我们应该考虑 va
在列表的末尾还是开头?您实施的是右折还是左折?
假设您正在实施左折叠,并且 va
应该位于列表的末尾。然后调用:
combine_all va op [e1; e2; e3]
相当于这个表达式(用+表示op
参数):
(((e1 + e2) + e3) + va)
如果这是您的目标,我想到的一种解决方案是考虑列表 li @ [va]
。该列表在构造上是非空的。因此,您始终可以提取列表的头部并将其用作您的初始累加值(您称之为 ret
)。然后将递归函数应用于 li @ [va]
.
的尾部
如果 va
应该被认为是在列表的开头,事情就更容易了。您已经有了非空操作数列表的头部和尾部:va
是头部,li
是尾部。
感谢@Jeffrey,我使用 head 作为累加器编写了函数,这样就不需要额外的参数了。
let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) = match li with
| [] -> va
| h :: t -> op h (combine_all_aux va op t)
;;
我想制作一个接受列表和运算符的函数,并对列表的所有元素执行该操作。
问题是,在制作辅助函数时,我不知道如何将附加参数初始化为函数将作为输入的数据类型的 "NULL"。
例如,如果我们正在处理整数,我希望我的参数取值 0、0。对于浮点数和字符串“”。
提前致谢!
let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) (ret:'a) = match li with
| [] -> va
| h :: t -> combine_all_aux va op t (op ret h)
;;
let combine_all va op li =
combine_all_aux va op li (Something)
;;
我注意到的第一件事是您的代码,如给定的那样,总是 returns va
。当它到达列表末尾时,它会忽略累加值 ret
.
因此,很难准确理解该函数的作用。我们应该考虑 va
在列表的末尾还是开头?您实施的是右折还是左折?
假设您正在实施左折叠,并且 va
应该位于列表的末尾。然后调用:
combine_all va op [e1; e2; e3]
相当于这个表达式(用+表示op
参数):
(((e1 + e2) + e3) + va)
如果这是您的目标,我想到的一种解决方案是考虑列表 li @ [va]
。该列表在构造上是非空的。因此,您始终可以提取列表的头部并将其用作您的初始累加值(您称之为 ret
)。然后将递归函数应用于 li @ [va]
.
如果 va
应该被认为是在列表的开头,事情就更容易了。您已经有了非空操作数列表的头部和尾部:va
是头部,li
是尾部。
感谢@Jeffrey,我使用 head 作为累加器编写了函数,这样就不需要额外的参数了。
let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) = match li with
| [] -> va
| h :: t -> op h (combine_all_aux va op t)
;;