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 }
という関数をわざわざ定義して、正格性解析から意図的に逃れています。