#author("2019-08-28T16:27:01+00:00","default:sagasite","sagasite")
[[プログラミング Haskell 第 2 版 >Programming-in-Haskell-2nd-edition]]
*プログラミング Haskell 第 2 版 [#m4f2fc86]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4908686076/vertex9-22/" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/41Korrd80qL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4908686076/vertex9-22/" target="_blank">プログラミングHaskell 第2版</a><br>Grahum Hutton<br>ラムダノート<br>2019-08-02<br>¥ 3,456</td></tr></table>
}}
*第8章 型と型クラスの定義 [#i902b7f5]
p.93
>この章では、Haskell で新しい型と型クラスを宣言する方法を説明します。
型を宣言する方法を三つ示した後、再帰型について考察してから、&color(red){型クラスとそのインスタンスを宣言する方法};を解説します。
最後に本章の締めくくりとして、恒真式を検査する関数と抽象機械を開発します。
**8.1 typeによる型宣言 [#wdb9cae4]
>新しい型を宣言するいちばん簡単な方法は、既存の型に別名を付けることです。
これには Haskell の typeを使います。
たとえば、プレリュードにある以下の宣言は、String型が文字のリスト [Char]の別名でしかないことを表しています。
#code(haskell){{
type String = [Char]
}}
~
-素朴な疑問
--Haskellのプレリュード内で行われている宣言って、どうやって確認するんだろうか?
--つまり、上記の例で言えば、Stringという型が、どこで宣言されているか?
--ソースコードを見る方法、コマンドなどが用意されているのだろうか?
p.94
**8.2 dataによる型宣言 [#fdf8ef64]
>既存の型に別名を付けるのではなく、完全に新しい型を宣言するには、Haskell のdataを使って型の値を指定します。
たとえば、プレリュードにある以下の宣言は、Bool型が Falseと Trueという二つの値から構成されることを表します。
#code(haskell){{
data Bool = False | True
}}
このような型宣言で使う記号「|」は「または」と読み、型の値は構成子と呼びます。
新しく型を定義する場合と同様に、新しく定義する構成子は先頭を大文字にしなければいけません。
さらに、同じ名前の構成子を複数の型で用いることはできません。
***構成子 [#tef7a9f7]
-Haskell の文法 http://mew.org/~kazu/academic/2013/miyazaki-u/syntax.html
>代数データ型
代数データ型は、直積型の直和型です。すべてにラベルが付きます。このタグを構成子(constructor)と呼びます。以下は、代数データ型が直和型だと分かる例です。
#code(haskell){{
data Bool = False | True
}}
Bool が型、False と True が構成子です。"|" が直和(または)を表します。
p.95
>GHCi で試す場合には、新しい型の値を GHC が表示できるように、data宣言の最後に deriving Showを追加する必要があります。
>引数を取ることから、構成子は関数だといえます。
>普通の関数と構成子関数との違いは、後者は定義に等式を持たず、純粋にデータを作るために存在していることです。