所以我正在开发一个函数来从 int 列表中找到对目标数字的一些有效算术运算。不允许使用 throw/callac。这里只有 add 和 mul 是有效的算术运算,它们是左关联的。
datatype operation = ADD | MULT
(* find_op: int -> int list -> (operatino list -> 'a) -> (unit -> 'a) -> 'a *)
fun find_op x [] s k = k()
| find_op x [y] s k = if x=y then s([]) else k()
| find_op x (y1::y2::ys) s k =
let
val add = find_op x ((y1+y2)::ys) (fn a => s(ADD::a)) k
val mul = find_op x ((y1*y2)::ys) (fn a => s(MULT::a)) k
in
need some work here
end
该功能应如下所示:
给定列表 [1,1,2,~1] 和目标编号 ~4,可接受的操作列表应该是 [ADD,ADD,MULT] 或 [ADD,MULT,MULT],因为 ((((1+1)+2 )*~1) = ((1+1) 2 ~1) = ~4。但是 [MULT,ADD,MULT] 将无效,因为 (((1*1)+2)*~1) = ~3。
我很困惑如何检查返回的结果是否是 k()。使用 = 来检查返回值是不可能的,因为它是多态的。有什么方法可以处理这个吗?