Haskellの特徴や基本をわかりやすく解説!導入のメリットは?
こんにちは!
toiroフリーランス編集部です。
技術ブログやコミュニティサイトで時々話題に上るあのHaskellです。
前半ではHaskellとは何か・どんなことができるのかについて解説していきます。特徴やメリット・デメリットも見ていきましょう。
後半ではHaskellを使うのに必要なStackについてと、環境構築手順について説明していきます。
Haskellとは
Haskell(ハスケル)は1985年に発表された純粋関数型プログラミング言語です。
Haskell 2010以降目立ったバージョンの変更はありませんが、今でも現役で活躍しています。
以下は解説に必要な最低限の知識です。基本的な分類・性質を頭の隅にでも入れておきましょう。
純粋関数型プログラミング言語とは
関数型言語は大きく分けると以下の2種類です。
- 純粋関数型(Purely Functional)
- 非純粋関数型(impure functional)
一般的にプログラミング言語に用いられているのは非純粋型言語で、純粋型言語にはHaskellの他にMercury・Clean・Elmなどがあります。
参照透過性とは
Haskellでは変数を一度定義すると再代入は行えません。例えばxに10を代入したら未来永劫10です。故にこれを束縛と呼びます。
単純にある値や関数に名前を付け、判別しやすくしただけと考えると分かりやすいでしょうか。
また同じ考えが関数にも適用されます。関数に指定する引数に同じものを指定すれば、何回繰り返しても同じ結果になるという具合です。
このような状態を参照透過性が高いといい、純粋関数型プログラミング言語はこの性質を持っています。
Haskellでできること
Haskellがどのような用途に使われており、何が作れるのか知らない方も多いのではないでしょうか。
ここではHaskellが得意とするできることを紹介します。
他にもゲーム・デスクトップアプリケーションなど、様々な種類のプロダクトを作れるのがHaskellの魅力です。
個々の事例はHaskell Wikiの「Haskell in industry」を参照して下さい。
金融関連
Haskellで構築するシステムは信頼性の高いものです。
このため投資銀行・金融取引所などの金融関連において、厳格なシステムを構築する際に採用されます。
また財務分析・投資支援・信用取引などのWebサービスも、言語としてHaskellの選択を視野に入れる代表的なものでしょう。
認証・セキュリティ関連
同様の理由で認証サーバーやセキュリティ基盤の用途にも有用です。
オンライン上の契約・予約などの手続き、電子入札などにも利用されることがあります。
数学・科学・医療分野
数学的に厳密な検証ができるHaskellは研究分野においても使用可能です。
バイオテクノロジーにおけるデータ分析や数学的・科学的な解析に用いられます。
また暗号解析やデジタル信号処理、プロダクトの検証用プログラムなどもHaskellの活用シーンです。
医療分野では電子カルテなどにも採用された事例があります。
Haskellの特徴
Haskellの特徴として既に以下の2点について触れました。
- 純粋関数型プログラミング言語である
- 参照透過性がある
ここでは更に踏み入った解説をしていきましょう。
関数型・手続き型兼用
Haskellは関数型のプログラミング言語ですが、手続き型言語としてプログラミングもできます。
多くの記事では関数型言語であるという点が全面的に押し出されていますが、関数型言語しか書けないということではありません。
モナド
モナド(Monad)の概念を理解するのは難しく、多くのチュートリアルや解説記事が別々の観点からアプローチをかけています。
それでも簡単に一言で説明するならば、値を操作しようとするのではなく、操作手順を組み立てて一連の計算を行う仕組みです。
代表的なモナドには以下のような種類があります。リファレンスを読めば他にも沢山のモナドがリストアップされているでしょう。
- Maybe型モナド
- List型モナド
- State型モナド
- Reader型モナド
- I/O型モナド
もしモナドについて学習を行う場合は、個々のモナドを把握してから全体を見渡すようにした方が早いかもしれません。
ただでさえ馴染みのない抽象的な概念を、例え話を交えて説明されても頭の中が混乱しますので、まずは慣れるところから始めましょう。
遅延評価
Haskellにおける遅延評価は他の言語と同様の定義で合っています。
基本的に必要になるまでは関数の評価・実行を行いません。
ちなみに遅延評価の反対語は正格評価です。
Haskellのメリット
Haskellを習得するとスキルが向上し、既知の他の言語でのプログラミングにも大きな影響を与えるでしょう。
プログラミングスキルが向上する
Haskellは純粋関数型のプログラミング言語なので、必然的に純粋関数と非純粋関数の区別を付けて書く癖が身に付きます。
また意図的に正しい書き方・考え方をしなければならないよう設計された言語です。
このため一般的な他の言語と比較した場合、勉強不足や認識違いなどがもろにエラーとなって返ってきます。
開発スピードが速い
Haskellを真に理解したプログラマーが開発をすると、他の言語よりも遥かに速いスピードで複雑なシステムを構築できるでしょう。
Haskellには豊富な関数やライブラリが揃っており、これらを組み合わせれば短時間で込み入った機能を実装できます。
Haskellの標準モジュールがPrelude(プレリュード)です。
PreludeにはInt・String・Bool・Eitherなどの様々な定義が含まれています。
Haskellのデメリット
Haskellのデメリットは学習コストが異様に高いことでしょう。これはどの記事や質問版でも必ず指摘されている事実です。
学習コストが高い
他のプログラミング言語とはかなり異なる言語のため、他の言語の知識から流用できる部分が少なくなります。
またモナドをはじめとするHaskell特有の仕組みを使いこなせるようになるまでには、それなりの時間と実践を要するでしょう。
Haskellを触ったことのあるエンジニアは学習意欲が高く、新しい言語に挑戦することに対してハードルをあまり感じないようです。
遅延評価が御しがたい
Haskellの遅延評価は多くの場合、実装において優れています。
しかし使用方法を誤るとパフォーマンスボトルネックが発生する可能性があり、改善のためのデバッグ作業は少々厄介です。
Haskell Stackとは
Haskell Stack(ハスケル スタック)はHaskellを扱うのに必要なクロスプラットフォームの開発ツールになります。
具体的には以下のような機能の詰め合わせです。基本的な機能は概ね揃っているでしょう。
- GHCの自動インストール
- パッケージのインストール
- Haskellプロジェクトのビルド・テスト
- Haskellプロジェクトのベンチマーク
GHC(Glasgow Haskell Compiler・グラスゴー ハスケル コンパイラ)はHaskellコンパイラです。
プロジェクトに合わせてコンパイラバージョンを自動選択します。
Haskell Stackのセットアップ
Haskell Stackをセットアップして開発環境を手に入れましょう。以降は下記の環境で検証を行います。
- Windows 10 Pro
Haskell Stackのダウンロード
HaskellのWindowsインストーラーは公式ドキュメントのダウンロードリンクから取得可能です。
ちなみにその他の多くのオペレーティングシステムの場合は、以下のコマンドを打てば自動でインストールされるようになっています。
- $ curl -sSL https://get.haskellstack.org/ | sh
Haskell Stackのインストール
ダウンロードしたEXEファイル(stack-X.X.X-windows-x86_64-installer.exe)を実行しインストールです。
基本的にデフォルトの設定で問題ありません。
インストールが終了したらPowerShellを起動し、以下のコマンドを実行して正しく完了しているかを確認しましょう。
- $ stack –version
- Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2
HaskellでHello World!
試しにHaskellで「Hello World!」です。
プロジェクトの作成
Haskellプロジェクトは「stack new プロジェクト名」コマンドで作成することができます。
- $ stack new hw-project
- $ cd hw-project
プロジェクトのセットアップ
「stack setup」はプロジェクトに必要なコンパイラをダウンロードするコマンドです。「stack path」で場所を確認できます。
初回だとそれなりに時間がかかりますので昼休み前に実行しておくか、コーヒーでも飲んで待ちましょう。
- $ stack setup
- $ stack path
プロジェクトのビルドと実行
「stack build」でプロジェクトのビルドを実行します。
- $ stack build
「stack exec プロジェクト名-exe」でコンパイルしたプログラムを実行可能です。
- $ stack exec hw-project-exe
- Stack has not been tested with GHC versions above 8.6, and using 8.8.3, this may fail
- Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
- someFunc
Hello World!
「hw-project/app/Main.hs」を開いて「someFunc」になっている箇所を以下のように修正して下さい。
- module Main where
- import Lib
- main :: IO ()
- main = putStrLn “Hello World!”
その後、プロジェクトのビルドと実行を行って下さい。
- $ stack exec hw-project-exe
- Stack has not been tested with GHC versions above 8.6, and using 8.8.3, this may fail
- Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
- Hello World!
Haskellの将来性
「Haskellでできること」でも確認した通り、信頼性の高い言語Haskellだからこそできるシステムが一定数存在しています。
最近まではこれら金融やセキュリティの分野の案件・求人が細々と市場に出てくる状況でした。
そもそも学習コストが高い上に他言語でも代替可能ということで、Haskellの採用企業自体が少なかったのが原因と考えられています。
しかし最近Haskellが元々得意としていたセキュリティの分野において、その価値が再評価され始めました。
また開発速度の観点からHaskellを採用するベンチャー企業なども増えています。
以前に比べて市場の状況は改善傾向にあるといえるでしょう。
違うところではプログラミングスキルを向上させるのに優れた言語のため、セミナーや勉強会の開催なども活発になり始めています。
おわりに
Haskellに対しては学習コストが高いというイメージばかりが取り上げられがちです。
しかしプログラミングスキルを向上させることができるというメリットも合わせて考えると、辻褄が合っているとも捉えられます。
Haskellを扱える人材は少ないため、希少価値のあるITエンジニアであるともいえるでしょう。
またHaskellを使いこなせるということは、数学的な知識とプログラミング学習に対するモチベーションが高いことの証明にもなります。
この機会に少しずつでも勉強を始めてみてはいかがでしょうか。
toiroフリーランスはフリーランスエンジニア向けのSHIFTグループ案件・求人情報サイトです。
プライムベンダーだからこそ、商流が深い多重下請けや不要な中抜きは一切なく、高単価・適正単価で業務委託案件をご案内しています。
アカウント登録後には、さまざまなサービスや機能を無料でご利用いただけます。
- 登録面談にてキャリア相談や案件マッチングのコツ、市場トレンドや耳寄りな情報をお伝えします
- 本サイトでは公開していない非公開案件をすべて確認可能
- ご希望条件に合うエージェントおすすめの案件を随時ご案内
個人事業主やフリーランスで活躍されている方、これから目指している方、少しでもご興味がある方はぜひお気軽にお問い合わせください!