Haskell 入門してみた

こんにちは、情報システムの横山です。
今回はHaskellについて書きます。と言っても私ははじめてさわります。
知人に「いいよ!面白いよ!」と言われたのを思い出し、入門してみました。
また、もう一つの理由としては私が今まで開発してきた思想とはかなり異なっているのではないかと思ったからです。

■Haskellとは
純粋関数型言語(破壊的代入や副作用をなくしたプログラミングスタイル)で、関数や変数の再代入(変数の再代入は許可されず、束縛)を無くし、遅延評価(値は必要になるまで評価されない)をデフォルトとした言語です。
キーワードとして3つ「純粋関数型」「束縛」「遅延評価」を入れました。
あくまで私が持ったHaskellのイメージです。

■開発環境
開発環境ですがHaskell Platformを以下からインストールしました。
対話型インタプリンタやスクリプト実行などセットでインストールできるのでオススメです。また、編集する際のエディタはご自由に。
インストールが完了するとbinの中にghci.exeがあり、これが対話型インタプリンタで最初はこれで慣れるのが良いのかな、と思います。
また、書いたコードはrunghc.exeというスクリプトの実行ファイルで確認することができます。

■基本構文、使い方
入門にあたりまずはHaskellでどんなことをやったのか書きます。
 ・四則演算
  特別難しいことはありませんでした。いくつか書き方があり、対話型インタプリンタを使用して実行しました。

 ・関数
  min,max,take…括弧でくくらないのは少し慣れませんでした。やっていくうちに結構きれいに見えてきましたし、コード量も少なく済みます。
  ほとんどの関数が前置関数なので、中置関数は1回も使いませんでしたがバッククォートでくくることで出来るようです。
  >max 1 10 → 10
  >1 `max` 10 →10

 ・リスト
  リスト表記は[]。リストに対して使用する関数はtake(頭から何文字を取得)、++(リスト同士の結合)などを実行しました。
  リスト内は全て同じ型でないといけません。
  >take 3 [1..] → [1,2,3] ※[1..]は無限リストです。
  >[1,11,111] ++ [2,22,222] → [1,11,111,2,22,222] 

 ・入出力
  print、putStrLnどちらも同じ出力ですがprintは文字列(改行つき)で出力、putStrLnは引数を文字列に変換し出力します。
  例えばユーザーに入力してもらい、入力値をコード上で使用する場合はgetLineを使用します。

 ・遅延評価
  1行目のconstとは定数関数で常に第一引数を返します。よって、numberにはconstの第一引数である10が代入され、2行目のprintで、
  結果が3行目に10と出力されています。もう一度1行目に戻り、よく見てみると第二引数がありますね。
  20 / 0 はゼロ割をしていますので、評価されていればエラーになるはずです。これが「必要とされるまで評価されない」遅延評価です。
  >numer = const 10 (20/0)
  >print number
  >10

■作ってみた
例題でよく見かけるうるう年判定をやってみました。
・西暦が400で割り切れれば、うるう年
・西暦が100で割り切れれば、うるう年でない
・西暦が4で割り切れれば、うるう年
ということで実行するコードは以下です。

だらーっと書きましたがそんなに難しくはないですね。
それでは実行します。2016は4で割り切れますのでうるう年ですね。

と、こんな感じになります。

■ここまでで苦労したこと
苦労というと大げさですがやはり関数の括弧なしに目も手もまだ慣れません。思っていたより命令型→関数型の壁は大きいなあと感じました。
また、コーディングや概念部分ではありませんが今まで私が使用した言語(PHP,vb.net,JS...)に比べ情報が少ないと思います。特に初心者向けの!
なので同じ関数を調べるにもある書籍やあるサイトだけで完結しませんでした。

正直なところ超初心者としてやってはみたものの、
「遅延評価」で何ができて、何をもたらしてくれるのか?
「カリー化」で何ができて、何をもたらしてくれるのか?
「モナド」で何ができて、何をもたらしてくれるのか?
ぼんやりも浮かんできません。

■とりあえずここまでやってみた感想
関数型言語の面白さは「垣間見た」くらいです。よりシンプルでよりスマートに書きましょうという思想や構造は私はとても好きです。
例えばループ処理は他と比べかなり行数は削減できるもののなんかコツ、理解が必要です。。。が、まだ私はコツを掴んでいません。
Haskellを使って一瞬でパズルや迷路を解くようなコード書いてみたいなんて密かに考えています。もっと「面白い」と感じれると思います。

苦労したことに何をもたらしてくれるのか、なんて書きましたが今回Haskellに入門した理由にある通り、もたらしてくれる何かを期待して入門したわけではありません。エンジニアとして新しい言語を学ぶことはとても刺激になります。新しい言語にふれることで視野を広げ、今までと異なる思想を感じることはとても重要だと思います。

Haskellに入門しましたが、あくまで入門しただけなので次回もう少し深い記事がかけるように引き続き勉強していきたいと思います。


エンジニア募集

エキサイトではエンジニアとして一緒に働いてくださる方を新卒採用と中途採用で募集しています。詳しくは、こちらの採用情報ページをご覧ください。


by ex-engineer | 2016-12-13 15:00