青木です。

  In mail "[haskell-jp:159] Re: href 0.1"
    Nobuo Yamashita <nobsun / sampou.org> wrote:

> nobsun です。

> >     foldr (f init xs) :: (a -> b -> b) -> b -> [a] -> b    PRELUDE
> 
> この表現は凄く違和感がありますし、誤解されると思います。
> 型を表現するなら、定義のとおり、
> 
> foldr :: (a -> b -> b) -> b -> [a] -> b  
> 
> と書くべきでしょう。また、foldr f init xs と foldr (f init xs) とでは意味が
> 全くちがうのに、この表記だと同じものと誤解されてしまうとおもいます。

その反論は予想してました (ニヤリ)

> 更に、関数はすべてカリー化されているので、たとえば、foldr は 3 引数である
> と主張しているように見える表記にも、違和感があります。Haskell では
> 「関数 hoge は n 引数である」という主張にはあまり意味がないと思います。
> むしろ、Haskell ではすべての関数は一引数であるとの主張が正しいでしょう。

仕様を考えれば全くその通りだと思います。ですがだからといって
言語仕様に忠実に書けばいいかと言うと、ぼくはそう思いません。
いくら引数が一つであると言ってみても、現実にプログラム書いて
エラーが出てデバッグしようってときには引数の数という情報は絶対
に必要です。

またパラメータを書いているのは引数の数を主張するためでなく
解説文で参照するためです。例えば

    elemIndices (x xs) :: (Eq a) => a -> [a] -> [Int]

    xs から x を探索し、見付かった全インデックスのリストを返す。

のように。でないと

    第二引数から第一引数を探索し、……

と書くしかなく、余計に引数の数を主張する結果になるでしょう。
日本語の説明は (ぼくが) 絶対に欲しいので少なくともパラメータ
名は必須です。

ただ括弧は必要ないし、最初は書いていなかったのですが、

   elemIndices x xs

だと関数名とパラメータが対等に見えるのが嫌だったのと、

   xs \\ ys :: ....

のようなインフィックス演算子と通常形式とを簡単に (シンタックス
のみで) 区別するのに楽だったのでこうなっています。なにぶんまだ
慣れてないもんで、あまり面倒な区分けはできないんです。もうちょい
慣れれば解決できると思いますけど。


> >         xs の最後の要素と init から始めて、
> >         xs の後ろから二番目の要素と最初の返り値、
> 
> この部分は、言葉での説明よりは、
> 
> foldr f init []     = init
> foldr f init (x:xs) = f x (foldr f init xs)
> 
> のように定義がそのまま書いてある方がわかりやすいと思います。これは

定義では不十分でないと思ったからこそ日本語の説明を書いてます。
そして同じことを書くんだったら Haskell での定義のほうが正確に
決まってますから、日本語の説明は正確さよりもとにかくイメージが
つかめる記述を優先しています。全部に実例が書いてあるのは日本語
で (意図的に) 誤っている部分の補正をするためでもあります。

それに、教育をするのはチュートリアルなりユーザマニュアルなりの
役割であって、リファレンスの役割ではないと思います。幸いその程度
の補正もできない素人は Haskell なんか手を出さないでしょうし。

また、定義を直接書くつもりならソースコードを直接パースして情報源
にしたほうがよいでしょう。実際、Ruby 版の ReFe では Ruby のソース
コード(C言語) をパースしてメソッドから関数を検索できたりしますし。

# ……のだけども、バージョン 0.1 でそういうややこしいことが
# できるはずもなく。


> href で重要な部分は、使用例だと思います。これがあるから、href は
> 大変すばらしいツールになるのだと思います。
> (この部分が、Haskell のリファレンスでもすっとも重要だと感じますし、
> 実際この部分がいちばん希求されているものだと思います。)

そうですね。ぼくも Haskell のリファレンス読んでて一番ムカついた
のがロクに実例がないってことでした。それでとにかく実例だけは
しつこく付けてやろうと思って書いてます。


> > [バグ]
> > 
> > 死ぬほど遅い。
> 
> そうですかぁ。(Haskell の遅さにはなれてしまったので。。。)

メインマシンならいいなんですが、SPARC のほうがちょっと……
致命的に……遅いです。一回の検索で 2〜3 秒かかります。
たぶん自分で書いた glob もどきが遅いんだと思うんですけど。
-------------------------------------------------------------------
青木峰郎

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