Haskellの「代数的」データ型は代数的か?

という(という言い方も合っているのかどうか定かではありませんが)。他力本願の本領を発揮して、別の話のついでに、知り合い(www.cl.cam.ac.uk/~amp12/)にちょっと聞いてみました。

The denotational semantics of datatypes, be it in a non-strict language like Haskell, or a strict one like ML, involves solutions of domain equations. It's just that the domain constructions are different in each case (to take account of the different evaluation strategies). The surprising thing is that in all cases these solutions are both initial _and_ final simultaneously (they are what Freyd termed free bialgebras) in a suitable category of domains and strict continous functions. In that sense the dataypes in Haskell are "algebraic" (but one could equally say they are "coalgebraic", or better "bialgebraic"). The terminology is an historical accident. In pure strict functional programming, the values (as opposed to all expressions, including ones that may diverge) of an algebraic datatype really do correspond to what one would expect: eg finite lists of values for a list datatype. When lazy functional programming got going, the very same form of datatype declaration was used, so people carried on calling it algebraic, even though its semantics, because of the non-strict eval strategy, is much more complicated. I find it ironic that one of the early selling points of lazy functional programming is that its programs satisfy familiar mathematical "laws" (like beta conversion---in the strict world one only has beta-value conversion), whereas in reality its semantics is much more complicated than for strict functional programming.

だそうで。自分がちゃんと理解していないのでコメントできませんが…

追記:恥の上塗りを承知でナイーブな質問なのですが、Haskellにはstrictでない関数もあるわけで、もし「strictな連続関数に制限したCPOでは始代数」と理解してしまうと、「Haskellの代数的データ型は始代数」という話とズレているようにも(私のように何も知らない者には)聞こえてしまうのですが、どう考えれば良いのでしょうか?

追記の追記:っていうか、読み直したら何となくわかった(ような気がする)。strictじゃないといけないのは酒井先生:-)のいうF(f)であって、「Haskellの関数がstrictでない」こととはまったく別の話、ということか。

ちなみに、しつこいようですが、圏論の話題については、自分は「自然変換関手 = List.map」という程度のデタラメな理解しかない人間なので*1、私のいうことを信じてはいけません。

*1:YK先生の圏論の授業は最初の2回ぐらいで脱落しました…。なぜか単位はもらえた記憶もありますが。スミマセン。