寻求建议。我正在向Logtalk 库添加元谓词foldl1/3
。foldr1/3
这些可以很容易地定义:
foldl1(Closure, [Head| Tail], Result) :-
foldl(Closure, Head, Tail, Result).
foldr1(Closure, [Head| Tail], Result) :-
foldr1_(Tail, Head, Closure, _, Result).
foldr1_([], Result, _, Result, Result).
foldr1_([Arg2| Args], Arg1, Closure, Acc, Result) :-
foldr1_(Args, Arg2, Closure, Acc, Acc2),
call(Closure, Arg1, Acc2, Result).
使用这些定义,使用空列表调用元谓词就会失败。但这不允许区分由于闭包失败构造的隐式目标之一导致调用失败的情况。
如果您设想自己使用这些元谓词,您是否发现空列表上的失败是一种可接受的行为,或者您更愿意在这种情况下生成异常?