だから私は、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+1) 2 ~1) = ~4. ただし、(((1*1)+2)*~1) = ~3 であるため、[MULT,ADD,MULT] は有効ではありません。
返された結果が k() かどうかを確認する方法がわかりません。= を使用して戻り値を確認することは、ポリモーフィックであるため不可能です。これを処理する方法はありますか?