寻求建议。我正在向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).
使用这些定义,使用空列表调用元谓词只会失败。但这不允许区分呼叫失败的情况,因为闭包构造的隐式目标之一失败。
如果您设想自己使用这些元谓词,您是否发现空列表上的失败是可接受的行为,或者您是否希望在这种情况下生成异常?