Hatena::Grouphaskell

haskell の学習 by codo RSSフィード


『ふつうのHaskellプログラミング』をテキストに、Haskellを学んでいます。

2007-05-21

束縛 14:22 束縛 - haskell の学習 by codo を含むブックマーク はてなブックマーク - 束縛 - haskell の学習 by codo

id:taninsw:20060614:p1 さんの「束縛」について

束縛とは代入ではなくて名前を付けているって感じなのかな。

値に名前を付けたり関数に名前を付けたりしてるだけ。


ふつける」32ページには、

変数と値を結び付ける(変数初期化する)ことを、Haskellでは「変数を値に束縛する(bind)」と言います。

変数を値に束縛する」のであって、「変数が値を束縛する」のではありません。変数は束縛される側です。

とあります。

変数が主ではなくて、値が主、という感じ?

値や関数は、それだけで名前がなくても存在しうる。

だから、変数名や関数名は、名札みたいなものなのでしょう。

ということは、

値へのポインタを格納しているような感じでしょうか。

JavaScriptだと参照型のようなイメージでしょうか。


map 関数(1) 12:44 map 関数(1) - haskell の学習 by codo を含むブックマーク はてなブックマーク - map 関数(1) - haskell の学習 by codo

map :: (a -> b) -> [a] -> [b]
関数map
第1引数(a -> b)
第2引数[a]
返す値[b]

aリストにmap関数適用してbリストを返します。

関数適用の仕方を記述した関数を第1引数で指定します。

JavaScriptのsort関数みたいな感じかな。

関数引数にする、これぞ、高階関数(^-^)/

変数の定義 09:52 変数の定義 - haskell の学習 by codo を含むブックマーク はてなブックマーク - 変数の定義 - haskell の学習 by codo

第2章第2項...

まず、「main = ...」は変数mainの定義です。イコールの左の「main」が変数名で、右の「putStrLn "Hello, World!"」がその値です。

とありますが、ふつう、これって定義というか、変数初期化ですよね。ところがhaskellでは値の再代入ができないので、これを定義というようです。でも再代入ができないなら、変数というより定数といったほうがよいのではないか? う~む。

変数mainの値が関数ではないことに注意してください。では何かというと、これはアクション(action)なのです。アクションHaskellの値ですが、不思議なことに、その値を評価すると入出力などが実行されます。

ここ、なにがなんだかちっともわかりません。

ただ、いままで読んだところでは、変数の値には、

がありえるようです。

まだ読んではいないんですが、62ページの「値としての関数」というところに、

実は、Haskell関数を定義するとは、こういうことです。つまり、関数名はすべて変数であって、その変数関数に束縛されているのです。

頭がごちゃごちゃしてきます。でも、「値としての関数」という言葉、なんかもうちょっとでわかりそうな気がして、悩んでいたら、id:m_konishi1981:20061024 さんの記事を読んで開眼!

関数や、変数は(変数引数のない関数だと私は思っているが)

変数と説明には書いてあるけど、ようは

a = 3

というのは、常に3を返す関数を定義しているわけであって

aという箱に3という値が入っているという、CやJavaなんかの変数とは違うという事に気がつきました。

たしかに、値を返すものを関数と呼ぶならば...

あ!

3を評価すると、3って返ってくるのでは!!

評価する対象に名前をつけてるだけなんだ。

で、こんな感じにまとめてみました。

  • 評価する対象」に名前をつけようとつけまいと勝手ですが、その評価された対象はかならず値を返します。
  • 評価の対象に基本的な型(整数値、文字、文字列、真偽値、○○のリスト)ならそのまま返します。(もしこれに名前をつけるなら、変数となります)
  • 評価の対象が関数なら、与えられた値に関数適用して値を返します。(もしこれに名前をつけるなら、与えられる値を仮引数とします)
  • 評価の対象がアクションなら。どうなるんでしょう...これはまだわかりませんm(_ _)m

関数の型 08:16 関数の型 - haskell の学習 by codo を含むブックマーク はてなブックマーク - 関数の型 - haskell の学習 by codo

変数の型ならわかるけれども、関数の型ってなんだろう?

関数にも種類があるのかな?

とおもって読み進んでみると、なんのことはない、どうやら関数の仮引数と返す値の型のようでした。

実は、Haskellには型推論(type inference)という機能があり、引数や返り値の型宣言を省略しても、言語処理系がその型を推論して補ってくれるのです。

(56ページ)とありますが、

型を宣言しておけば意図した通りに型がチェックされていることが確認できますし、ソースコードを読む人にとっての情報が増え、ソースコードが読みやすくなります。

(61ページ)ともあります。

書式は、

関数名 :: 仮引数の型 -> 返り値の型

第1章の冒頭にこうありました。

Haskell関数とは、引数と返り値の対応関係を記述したものです。

また、関数は常に値を返します。つまり、返り値がvoidであるような関数は存在しません。

ということは、どんな関数でもこの書式で定義できるはずです。

引数がいくつもある場合は、繰り返して書けばよいようです。たとえば2つある場合は、

関数名 :: 第1仮引数の型 -> 第2仮引数の型 -> 返り値の型

返り値が2つ以上の場合はどうするのでしょう。この書式だと値は一つしか返せませんよね。もしかしたら配列(リストっていうのかな?)で返せばいいのかな?

CamiCami2012/01/06 12:23I'm out of league here. Too much brain power on dspilay!

wdfwjbasbwdfwjbasb2012/01/06 19:06Mc4Egc <a href="http://yhxozsgqumiv.com/">yhxozsgqumiv</a>

godmkkiypazgodmkkiypaz2012/01/09 23:38Uqzw8k <a href="http://ohmypzhyphqs.com/">ohmypzhyphqs</a>

prgnplsmbobprgnplsmbob2012/01/11 04:36mnBLIr , [url=http://bljmfmfrvxfu.com/]bljmfmfrvxfu[/url], [link=http://cmrclzzegoxg.com/]cmrclzzegoxg[/link], http://ucrrirxzzutz.com/

トラックバック - http://haskell.g.hatena.ne.jp/codo/20070521