morioXのCraftお勉強日記 RSSフィード

2006-12-17

[] Introducing functional programming (7日目)  Introducing functional programming (7日目) - morioXのCraftお勉強日記 を含むブックマーク

1.12 Calculation and evaluation

入力値を2倍する掛け算doubleを例に取ってHaskellの計算モデルを説明している。例として挙げられている計算式は下記のとおり。

23 - (double (3+1) )

double関数の定義は下記のとおり。

double :: Int -> Int

double n = 2*n

そして、その計算過程は下記のとおり。

23 - (double (3+1))

→ 23 - (2*(3+1) )

→ 23 - (2*4)

→ 23 - 8

→ 15

Haskellは、このように1行ずつステップバイステップ評価するモデルにとてもよくフィットする。


Summary

これまで見てきた定義のまとめ。

  • 関数はInputをOutputに翻訳するもの。
  • 数や絵の全体のような、性質が似たものの集まりを型という。
  • オブジェクトは明確に型付けされ、定義の際はその型を記述することになる。
  • プログラム内で定義された関数は、式を記述する際に使用される。式は実装によって評価される。
  • 式の値は手計算、ないしはHugsインタープリタによる計算によって導出される。

2006-12-16

[] Introducing functional programming (6日目)  Introducing functional programming (6日目) - morioXのCraftお勉強日記 を含むブックマーク

1.10 Proof

他のプログラミング言語よりも、関数プログラミング言語は証明を行うのに向いている、という話。なお、この本では、全ての場合においてそのことが成立することを、論理的もしくは数学的に示すための記述を証明の定義としている(A proof is a logical or mathematical argument to show thar something holds in all circumstances.)。

このセンテンスには、あまり突っ込んだ話はなく、Chapter 8 Reasoning about programsでちゃんと取り上げるらしい。


1.11 Types and functional programming

型の話。型は、以下の事を教えてくれる。

  • 関数がどのように適用される(applied)かに関する制約(constraint)を表現する
  • 関数が正しく適用された場合の結果は何か

ミスタイピングや取り扱う問題の誤解によるエラーを型チェックで防いでくれるのは、プログラマーにとって大きいよね、と言う話も。

2006-12-15

[] Introducing functional programming (5日目)  Introducing functional programming (5日目) - morioXのCraftお勉強日記 を含むブックマーク

1.9 Looking forward: a model of pictures

馬の図を実際にプログラム上で扱うにあたり、以下のような表記をすることにしました、という話

. . . . . . . ## . . .

. . . . . ## . . # . .

. . . ##. . . . . #.

. . #. . . . . . . #.

. . #. . . #. . . #.

. . #. . . ###. #.

. #. . . . #. . ##.

. . #. . . #. . . . .

. . . #. . . #. . . .

. . . . . #. #. . . .

. . . . . . ##. . . .

アスキーアートみたい。

2006-12-14

[] Introducing functional programming (4日目)  Introducing functional programming (4日目) - morioXのCraftお勉強日記 を含むブックマーク

1.8 Function Definitions

関数の定義に関する説明。1行目は型の定義で、2行目が関数の定義となっている。

square::Int->Int

square n = n * n

となっている式におけるnは、Int型という条件を満たす限りどんな値も認められる。

関数の一般的な定義は以下のようになる。

name x1 x2 ... xk = e

name → 定義された関数名(the name of the function being defined)

・x1 x2 ... xk → パラメータ(the formal parameters)

・e → パラメータによって定義される結果(the result, defined in terms of the formal parameters)

型定義については、以下のとおり

name :: t1 -> t2 -> ... -> tk -> t

name → 定義された関数名(the name of the function being defined)

・t1 t2 ... tkパラメータの型(the types of the formal parameters)

・t → 結果の型(the type of the result)

" . "という記号で関数合成(function composition)が行える、ということも書いてある。

興味深かったのは「型抽象(type abstraction)」という考え方。例えば「絵」のように、それ自体では計算の対象にならないようなものでも、Haskellの式として記述する事はできる、というものらしい。

2006-12-13

[] Introducing functional programming (3日目)  Introducing functional programming (3日目) - morioXのCraftお勉強日記 を含むブックマーク

1.6 Expressions and evaluation

小学生レベルの計算、(7-3) * 2を例に取って考えた場合に、(7-3) * 2を式(expression)、計算結果の8を値(value)、そして(7-3) * 2を8にする事を評価(evaluation)と呼ぶ。

関数プログラミングは、一連の関数と、関数以外の値を定義することから成り立つ。


1.7 Definitions

Haskellにおける関数プログラムは、いくつかの定義から構成される。Haskellにおける定義は、型の値と名前を結びつけるものである。最もシンプルな定義は下記のとおり。

name :: type

name = expression

ちなみに、ここに値をいれてみると下記のようになる。

size :: Int

size = 12+13

命名規則として、関数や値の名前は小文字ではじめ、型名は大文字ではじめること。