nobsun です。

> > foo (x:xs)    = ...  はOKなのに
> > foo (xs++[x]) = ...  という定義がエラーになるのは何故だろうと
> > 疑問に思っていました。
> >
> > : と ++ は、同じくリストを生成しますが、後者はユニークに
> > 定まらないのでリストコンストラクタになれないからだそうです。
> > 当然といえば当然なのですが..感心してしまいました (^^;
> 
> ユニークに定まるかどうかは関係ないんじゃないでしょうか。あるリストに対
> して、xs++[x] という式がそのリストを生成するような xs と x は高々ひと
> つしかないという意味で、x:xs と xs++[x] は同程度のユニークさで x と xs
> を定めると思います。
>
> 後者が使えないのは単にコンストラクタではないからというだけなんじゃない
> かなぁ。

[たなか あきら] さんのおっしゃるとおりです。
もし、リストの定義を

data [a] = <a>          -- singleton
         | [a] ++ [a]

とかやったとすれば、 foo (xs++<x>) とかもありでしょう。

> まぁ、それならなぜ foo (x+1) = ... と書けるのか、という話はありますが。

これは、論争があって、将来のバージョンの仕様からなくなる可能があります。
ということが仕様に書いてあったりします。

--
Nobuo Yamashita                 mailto:nobsun / sampou.org
  I love programming.           http://www.sampou.org/
  I love pencil puzzles.        http://www.puzzle.jp/


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/