星野正利のHaskell日記 このページをアンテナに追加 RSSフィード

2006-06-20フツケル独書会第3回議事録

P.58 型変数(type variable) P.58 型変数(type variable) - 星野正利のHaskell日記 を含むブックマーク

同じ型であること示すために、同じ変数名を使う。

例:

reverse :: [a] -> [a]

など。

P.60 関数の型宣言 P.60 関数の型宣言 - 星野正利のHaskell日記 を含むブックマーク

大抵は型宣言を省略してもコンパイルできる。

但し、ソースを読む時の為に(人間の為に)、きちんと宣言すべき。

P.62 高階関数 P.62 高階関数 - 星野正利のHaskell日記 を含むブックマーク

関数引数にとる関数

これが、関数型言語の肝?

P.63 map関数 P.63 map関数 - 星野正利のHaskell日記 を含むブックマーク

java.util.Map とは大違い。

forループを使って、変換処理を行うのに対応?

P.65 if式 P.65 if式 - 星野正利のHaskell日記 を含むブックマーク

if文に非ず。三項演算子の方が近い。

P.66 二項演算子 P.66 二項演算子 - 星野正利のHaskell日記 を含むブックマーク

二項演算子関数

型宣言では、関数名をカッコで囲んで、2項演算子であることを表す。

P.69 concat関数 P.69 concat関数 - 星野正利のHaskell日記 を含むブックマーク

リスト次元を一つ落とす。

次元から1次元、3次元から2次元

2006-06-18フツケル独書会第2回議事録

P.56 型推論(type inference) P.56 型推論(type inference) - 星野正利のHaskell日記 を含むブックマーク

スゴイ。

型を指定しなくても、コンパイラが型をチェック出来るだなんて。


変数引数戻り値を、具体的なクラスよりも、interface にするように」

って、わざわざ気をつけなくても、

自動的に、型に(必要以上に)縛られないプログラムを書けてしまう?

P.57 現時点のGHCでは、エンコーディング変換が未実装 P.57 現時点のGHCでは、エンコーディング変換が未実装 - 星野正利のHaskell日記 を含むブックマーク

そうか、文字数カウントのはずのプログラムで、

バイト数カウントができてしまったのは、これのせいか。


Javaエンコーディング変換用のフィルタを作って、GHCに被せる事は出来ないかな?

runghc(インタプリタ)ならば、パイプフィルタを経由するようにしたコマンドを、

エイリアスにしてしまえば、違和感なく使えそうな気がする。

ghc(コンパイラ)では、exeファイルへの入出力にパイプをかませる必要があるので、

エイリアスで楽するのは無理だけど。

2006-06-17フツケル独書会第1回議事録

独書会開幕 独書会開幕 - 星野正利のHaskell日記 を含むブックマーク

関数型言語を覚えたい。ということで、

ここに「ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門」独り読書会の開幕を宣言します。

会員宣誓 会員宣誓 - 星野正利のHaskell日記 を含むブックマーク

宣誓、我々独書会会員一同は、プログラマーシップに乗っ取り、Haskellerとなるべく努力することを誓います。

但し、途中で飽きたり、気力が尽きたり、他のことに興味が向いたり、その他諸々の事情があった時は、その限りでありません。

P.5 高階関数 P.5 高階関数 - 星野正利のHaskell日記 を含むブックマーク

高階関数引数 or 戻り値関数関数


Javaでも高階関数的なメソッドがあるような気が。


sortメソッド(java.util.Arrays#sort, java.util.Collections#sort)は、

引数java.util.Comparator の各種実装クラスを渡すことで、ソート順を変えることができる。

これは、”ソート順を決定するための関数を、sort関数に渡している。”と言うこともできる気がする。


これって、高階関数の考え方を、デザインパターンとして取り込んでいるってことかな?

P.7 代入がない P.7 代入がない - 星野正利のHaskell日記 を含むブックマーク

すばらしい。


変数finalを付けまくった僕としては、熱烈歓迎です。

コードが長ったらしくなるので、今ではfinalを付けるのは、

バグが入り込みやすそうなところだけにしていますが。


Javaでも変数デフォルトfinalにできないかな?

あ、Javaのプリコンパイラを作れば良いのか。

再代入可能を表す識別子を作って、それが付いていれば、Java普通変数翻訳

付いていなければ、final宣言付きの変数翻訳


こんなバグ防止Tipsを集めて、Javaのプリコンパイル言語を作っちゃおうかな?

ごじゃっぺ人間による、ごじゃっぺ人間のための、ごじゃっぺJava言語」略して「Goja」


あれ、これってもしかして、アノテーションを使えばできるのかな?

うーん。Javaも、もっと勉強せねば。

P.8 遅延評価 P.8 遅延評価 - 星野正利のHaskell日記 を含むブックマーク

ふーん。Lispは、遅延評価じゃないのか。

Haskellは、純粋関数型言語だけど、Lispは違う。”っていうのは、ここら辺も関係しているのかな?


遅延評価は、メモリCPU節約に効果的な気がする。

Log4JのLogger#isDebugEnabledメソッドなんて、

まさしくJava遅延評価でないために必要となったメ

独書会開幕 独書会開幕 - 星野正利のHaskell日記 を含むブックマーク

関数型言語を覚えたい。ということで、

ここに「ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門」独り読書会の開幕を宣言します。

会員宣誓 会員宣誓 - 星野正利のHaskell日記 を含むブックマーク

宣誓、我々独書会会員一同は、プログラマーシップに乗っ取り、Haskellerとなるべく努力することを誓います。

但し、途中で飽きたり、気力が尽きたり、他のことに興味が向いたり、その他諸々の事情があった時は、その限りでありません。

P.5 高階関数 P.5 高階関数 - 星野正利のHaskell日記 を含むブックマーク

高階関数引数 or 戻り値関数関数


Javaでも高階関数的なメソッドがあるような気が。


sortメソッド(java.util.Arrays#sort, java.util.Collections#sort)は、

引数java.util.Comparator の各種実装クラスを渡すことで、ソート順を変えることができる。

これは、”ソート順を決定するための関数を、sort関数に渡している。”と言うこともできる気がする。


これって、高階関数の考え方を、デザインパターンとして取り込んでいるってことかな?

P.7 代入がない P.7 代入がない - 星野正利のHaskell日記 を含むブックマーク

すばらしい。


変数finalを付けまくった僕としては、熱烈歓迎です。

コードが長ったらしくなるので、今ではfinalを付けるのは、

バグが入り込みやすそうなところだけにしていますが。


Javaでも変数デフォルトfinalにできないかな?

あ、Javaのプリコンパイラを作れば良いのか。

再代入可能を表す識別子を作って、それが付いていれば、Java普通変数翻訳

付いていなければ、final宣言付きの変数翻訳


こんなバグ防止Tipsを集めて、Javaのプリコンパイル言語を作っちゃおうかな?

ごじゃっぺ人間による、ごじゃっぺ人間のための、ごじゃっぺJava言語」略して「Goja」


あれ、これってもしかして、アノテーションを使えばできるのかな?

うーん。Javaも、もっと勉強せねば。

P.8 遅延評価 P.8 遅延評価 - 星野正利のHaskell日記 を含むブックマーク

ふーん。Lispは、遅延評価じゃないのか。

Haskellは、純粋関数型言語だけど、Lispは違う。”っていうのは、ここら辺も関係しているのかな?


遅延評価は、メモリCPU節約に効果的な気がする。

Log4JのLogger#isDebugEnabledメソッドなんて、

まさしくJava遅延評価でないために必要となったメソッドですものね。

1.Logger#debugメソッドは、ログ出力のレベルがDEBUGの時以外、何もしない。

2.だが、Java遅延評価ではない。

3.そのため、debugメソッドで使われなくても、debugメソッドに渡すデバックメッセージを組み立てなければならない。

4。そのデバックメッセージの組み立てが、ボトルネックになる場合がある。

5.そこで、isDebugEnabledメソッドでDEBUGログが出力されるか判定し、出力されないなら、デバックメッセージの組み立てもスキップする。

うーん。長ったらしい説明だ。もっと簡にして要を得た説明をできるようにならないと。

P.25 main P.25 main - 星野正利のHaskell日記 を含むブックマーク

mainが変数で、main変数の値はアクション


なんだか良く判らない。

ま、そのうち判ってくるでしょう。ってことで、次。

P.26 適用(apply) P.26 適用(apply) - 星野正利のHaskell日記 を含むブックマーク

Java(手続き型言語)では、引数xxxで関数yyyを実行(call)する。

Haskell(関数型言語)では、変数xxxに関数yyyを適用(apply)する。


よく違いが判らない。

ま、慣れれば判ってくるかもしれない。ってことで、次。

P.28 Haskellでは入出力が鬼門 P.28 Haskellでは入出力が鬼門 - 星野正利のHaskell日記 を含むブックマーク

メンドクサイってこと?

初心者の混乱の種ってこと?

答えが判るのは、11章か。

P.31 インデント P.31 インデント - 星野正利のHaskell日記 を含むブックマーク

インデントに文法上の意味がある?

えー、なにそれ。それヤダ。


それ位なら、カッコだらけのLispの方が良い気がする。

まあ、Lispのコード書いたことないけど。

書いたらカッコにうなされるのかもしれないけど。

P.32 do式 P.32 do式 - 星野正利のHaskell日記 を含むブックマーク

Haskellは”遅延評価”なので、do式を使わないと実行順序がどうなるかわからない。


do式って、BPELのsequenceと同じ?

ってことは、もしかしてBPEL遅延評価


でも、遅延評価と、実行順序不定がどう関係するのか、判らない。

P.32 「<-」 P.32 「<-」 - 星野正利のHaskell日記 を含むブックマーク

変数 <- 値

で、変数”を”値に束縛(bind)


これって、Java

final 変数 = 値;

と同じ?


あ、遅延評価だから、その変数が使われなければ、

変数を束縛した値を、計算しなくても済むのか。

変数に束縛された値、と書きそうになってしまった。

値が変数を束縛する。って言い方に慣れるには時間がかかりそう)

P.34 catコマンドの謎 P.34 catコマンドの謎 - 星野正利のHaskell日記 を含むブックマーク

ループはどこから来た?

Javaで同じプログラムを作るとしたら、

無限ループの中で、標準入力を1行読み、標準出力に出力。”

となるはず。

P.36 リスト(list) P.36 リスト(list) - 星野正利のHaskell日記 を含むブックマーク

リストには、一種類の値のみが入る。

リストの最後(最後の次?)は、空リスト(empty list)。


Java配列や、ジェネリック付きのListに似ている。

いや、むしろ BufferedReader#readLine の方がもっと似ているかも?

何行のデータを返すか判らないが、データが無くなったら null を返す。

HaskellリストJavaの入力ストリーム


UNIXパイプだと更に似ている?

大きなファイルでも、tailでファイルの末尾を表示するのは、速い。

もしかして、パイプ遅延評価

P.39 「$」演算子 P.39 「$」演算子 - 星野正利のHaskell日記 を含むブックマーク

「()」と同じだが、Haskellでは、「$」演算子が多用される。


Haskellを設計した人は、Lispのカッコに苦労したんだろうな。

高機能なエディタを使えば、括弧を見て自動でインデントしてくれるはずだと思うんけど。

そうでもなければ、きっとLisperの人でも、カッコを愛せはしないでしょう。

P.46 関数の定義 P.46 関数の定義 - 星野正利のHaskell日記 を含むブックマーク

関数名 仮引数1 仮引数2 ... = 本体


ってことは、

main = ....

は、引数なしのmain関数を定義しているってことか。

P.52 2章のまとめ P.52 2章のまとめ - 星野正利のHaskell日記 を含むブックマーク

使用した関数アクションの一覧表

P.53 countbyte P.53 countbyte - 星野正利のHaskell日記 を含むブックマーク

文字列を文字のリストとして扱っても、バイト数でなく文字数しか取れないんでは?

って、思ったんだけど、

文字数取得のつもりで作ったコードで、バイト数が取れてしまった。


GHCiから日本語文字列を入力してみたら、なんかエラーが出た。

GHCは、ASCIIコード以外に対応していないってこと?


Prelude> "あああ"

<interactive>:1:2: lexical error in string/character literal

TODO TODO - 星野正利のHaskell日記 を含むブックマーク

タグとかの使い方を覚えて、もっと読みやすく書かないと。