【发布时间】:2015-12-29 02:10:19
【问题描述】:
我正在尝试实现一个接收 int 和数字列表的函数,并检查列表中的所有元素是否可以被 int 整除,例如:div_by_x 2 [1;3;4;8;0 ] = [假;假;真;真;真] 我有一个辅助函数,它在可行时只返回 true 或 false:
let divisible x i =
if i mod x = 0 then true else false;;
至此,我已经实现了一个有效的递归 div 函数,即:
let rec div_by_x x y = match y with
[] -> []
| (hd :: tl) ->
let l1 = div_by_x x tl in divisible x hd :: l1;;
但现在我正在尝试用 fold 函数实现 div_by_x,定义为:
let rec fold f a l = match l with
[] -> a
| (h::t) -> fold f (f a h) t
;;
我有点坚持如何在保持正在进行的列表的同时制作列表。到目前为止我有
let div_by_x x y= fold divisible x y [] y;;
这似乎不起作用并向我大喊:“
错误:此表达式的类型为 int -> int -> bool 但表达式应为类型 ('a -> 'b -> 'c) -> 'd -> 'a -> 'b -> 'c int 类型与 'a -> 'b -> 'c " 类型不兼容
有什么帮助吗?谢谢!
【问题讨论】:
-
不是您问题的答案,但
if expression then true else false可以单独替换为expression。 -
如果您仔细查看您的问题,您会注意到您正在尝试将
divisible x应用于列表的每个元素。这可以使用map来完成。您现在必须根据fold实现map。 :)