1. Top » 
  2. スポンサー広告 » 
  3. 【Haskell】C言語の構造体のようなものをHaskellで利用する
  4. プログラミング全般 » 
  5. Haskell » 
  6. 【Haskell】C言語の構造体のようなものをHaskellで利用する

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

【Haskell】C言語の構造体のようなものをHaskellで利用する

Haskellは関数型言語であって、代入という概念がない
Schemeでも基本的にそうなのだけれども、Schemeの場合 set! などのように
!マークがついた命令=書き換えの命令というものが存在したので、代入のようなことは出来る。

HaskellもC言語のようにInt、Char、String、Boolなどいろいろな型がある。
それらを組み合わせて一つの型のように、C言語で言う構造体のように使うことも出来る。
ただし代入は出来ないので、最初に設定した値を変えることは出来ない。


まずC言語の構造体
typedef struct book{
char* name;
int pages;
} Book;

このように書けば、新しいBook型のデータの固まりが使える。
それぞれ

Book book;
strcpy(book.name, "Test Book Name");
book.pages = 100;

のように使える。

Haskellの場合
data Book = Book { name   :: String,
pages :: Int}

このように書く。ただ単にStringとIntの組ですよーということが言いたいのならば

data Book = Book String Int

とも書けるが、少し扱いにくくなる。
結局、扱いやすくするなら上のように、変数名にラベルをつけておくのがいい。

このとき
=の左辺にあるBookは新しい型の名前である。
=の右辺にあるBookをBook型のデータコンストラクタと呼ぶ。
型の名前もデータコンストラクタも、英大文字で始まる必要がある。

データコンストラクタは関連づけられている値を作成するときに使う関数のようなもの。
(細かいこと:データコンストラクタ自体も値を持つ。)
この場合、データコンストラクタBookはBook型の値を作るのに利用できる。
ただしデータコンストラクタの名前と型の名前は一致する必要はない。
ここでは分かりやすくするために一致させて書いている。

実際に値を作る
Haskellには代入がない。
よって最初に作成したときの値がずっと使われる。
最初に作成するのは、データコンストラクタを利用して次のように書ける。

book :: Book
book = Book "Usual Haskell Programming" 372

まずbook::Bookによって、変数bookがBook型であることを示す。なくてもいい。
次の一文によってデータを作成する。

Book "Usual Haskell Programming" 372


によって、nameの値がUsual Haskell Programmin、pagesの値が372であるBook型の固まりを作成している。
これをbookというBook型の変数に束縛することで、データを作成したことになる。

作成した型を利用する
型をdata構文によって作成したとき、自動的にアクセサが作られる。
アクセサとは型からそれぞれのメンバの値を取ってくるための関数のようなもの。
アクセサはメンバの名前と同じ名前の関数によって利用できる。つまり

name → name :: String を取得する関数
pages → pages :: Int を取得する関数


となる。

この関数は次のように利用できる。

main = do putStrLn $ show $ pages book
putStrLn $ name book
printBook

printBook = do putStr $ name book ++ " all pages:"
putStrLn $ show $ pages book

実行結果は次のようになる。

372
Usual Haskell Programming
Usual Haskell Programming all pages:372



372はpages関数で、次の名前はname関数で出力したモノ。
最後の文は自分で作った関数で出力したモノである。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
関連記事
スポンサーサイト

Comment

コメントフォーム
このエントリへコメントを書く
(任意)
(任意)
(任意)
(必須) HTMLタグは使用できません
(任意) ID生成と編集に使用します
(任意) 非公開コメントにする

Page Top

Trackback

Trackback URI
http://parabola0.blog86.fc2.com/tb.php/509-99c73d54 この記事にトラックバックする(FC2ブログユーザーのみ)

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。