Concurrent Clean : abortはstrict

ついさっきまで、abortが正格性解析で特殊な振る舞いをすることに気づきませんでした。

f b a | b = a
          = abort "error"

と書いたとき、fの型は、大体、次のように推論されるのです。

f :: !Bool !.a -> .a

で、なぜ、「!.a」のように正格性注釈がついてしまうのか、あれこれ考えていたのですが、どうも、正格性解析をする際に、abortが特別な意味を持っているということらしいです。
なので、StdDebugでは、

non_strict_abort :: !{#Char} -> .a;
non_strict_abort a = code  {
	.d 1 0
		jsr print_string_
	.o 0 0
		halt
	}

という関数をわざわざ定義して、正格性解析から意図的に逃れています。