1. Top » 
  2. スポンサー広告 » 
  3. 【Haskell】関数の定義とパターンマッチについて語る(一度目)
  4. プログラミング全般 » 
  5. Haskell » 
  6. 【Haskell】関数の定義とパターンマッチについて語る(一度目)

スポンサーサイト

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

【Haskell】関数の定義とパターンマッチについて語る(一度目)

Haskellというのはいわゆる関数型言語と呼ばれるモノで、ひたすら関数が大事。
まぁ自分も詳しく分かっている訳ではないけれども

関数を中心に考えて関数を大事にする言語=関数型言語


という認識でとりあえずは大丈夫だと思う。
またHaskellには代入がない。
ついでに言えばfor文もwhile文もswitch文もない。
変数はちゃんと使えるのだけれども、代入するという概念がない。
一般的な手続き型言語のCなどでは代入文を

int x = 10


のように書くのだけれども、代入がないため、このような文は出てこない。
よってHaskellで=が出てきたらそれは関数であることがほとんどということになる。


それではパターンマッチと関数宣言の話をする。
ある関数 function の定義は次のように書く。

function :: 第一引数の型 -> 第二引数の型 -> ・・・ -> 第n引数の型 -> 返り値の型
function args1 args2 ・・・ argsn = 本体


ただ例示は理解への試金石、あまり一般的な話でも分からないので具体的な例を書く。
まずはじめに、ある値の絶対値を返す関数getAbsとする。

test = -10
main = print $ getAbs test
getAbs :: Int -> Int
getAbs n = if n < 0 then -n
else n

いわゆる普通の書き方であり、10が出力される。

さて、ここからHaskell話に入る。
今、式としてgetAbs n = ...というような関数定義をしている。
今引数を1つだけなので、この場合、引数一つ分という意味でnと書いてある。
その引数として与えられた値をnとして利用できる。

このように値のパターンによる場合分けのことをパターンマッチと呼ぶ。
これだけでは意味がまだ分からないので次の例を見る。自分で割り算を作ろう。
ちなみにHaskellで割り算をするとき、x / y は div x y と書く。

mdiv :: Int -> Int -> Int
mdiv x y = div x y

このように通常のdivをただ置き換えただけの関数では、たとえばyに0が入るとエラーが起きる。
(ゼロ割ができないため)
ここでこれを省くには次のようにする方法がまず考えられる。

mdiv :: Int -> Int -> Int
mdiv x y = if y /= 0 then div x y else x

通常の考え方でif文を使って0割を省く。
この書き方で問題ないのだけれども、パターンマッチを使うと次のように書ける。

mdiv :: Int -> Int -> Int
mdiv x 0 = x
mdiv x y = div x y

パターンマッチは上から順番にチェックされ、この書き方の時

引数が ある値xと0で渡ってくる場合 → 0 を返す
引数が ある値xとyで渡ってくる場合 → div x yを返す


と書いていることになる。

今、xと書いたとき、引数をxに束縛して利用するため、これを変数パターンと呼ぶことがある。
今、0と書くと、引数として0が渡された場合にマッチする。これをリテラルパターンと呼ぶことがある。
(たぶんリテラルパターンと呼んでもいい。)
また数値0のようなものだけではなく、文字列""や文字''もリテラルパターンとして利用できる。

あれ、結局パターンマッチというのはif文とかswitch文の代わりに入っているようなものなのだろうか。
また次回、語ります。
また、次回は他のパターンも使ってプログラムを書いてみます。


category of Haskell:
【Haskell】とても簡単なHaskellプログラムについて
【Haskell】標準入力(stdin)を読み込むために
【Haskell】結構頻繁に使う関数などの話
【Haskell】高階関数と型の定義について
【Haskell】リストの処理について
【Haskell】コマンドライン引数を得る方法
【Haskell】C言語の構造体のようなものをHaskellで利用する
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.0)
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.1)
【Haskell】コマンドライン引数の取得を活用する。
【Haskell】絶対パスからファイル名だけを取り出す
【Haskell】Haskellを使ってブログに微妙に役立つプログラムを書きたい(Ver.2)
【Haskell】ディレクトリ内を表示するlsをHaskellで書く
関連記事
スポンサーサイト

Comment

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

Page Top

Trackback

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

Page Top

訪問者

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

プロフィール

parabola0

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

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

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

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