ATS では、パターンマッチは実行時において連続して評価されます。 別の言い方をすると、節が選択されるのは与えられた値がその節に関連するパターンガードにマッチし、しかも値がその前にあるどの節のパターンにもマッチしない場合にだけです。 当然、list_zipwith 次の実装も型検査できると期待するでしょう:
fun{ a,b:t@ype }{c:t@ype } list_zipwith {n:nat} ( xs: list(a, n) , ys: list(b, n) , f: (a, b) -<cloref1> c ) : list(c, n) = ( // case+ (xs, ys) of | ( list_cons(x, xs) , list_cons(y, ys)) => ( list_cons(f(x, y), list_zipwith<a,b><c>(xs, ys, f)) ) | (_, _) => list_nil((*void*)) // ) (* end of [list_zipwith] *)
(list_cons (_, _), list_nil ())
(list_nil (), list_cons (_, _))
(list_nil (), list_nil ())
なぜ節の型検査がデフォルトで連続的に行なわれないのか気にするかもしれません。 その単純な理由は、全体に適用すると型検査の効率に大きなマイナスの影響があるからです。 したがって、特定の節の型検査に連続的な仮定を時々使うための明確な手段をプログラマに提供するのは、妥当なデザインなのです。