Haskellを使ってみよう1

Haskellを使ってみよう1

目次

はじめに

突然ですが関数型プログラミングをご存じでしょうか?

我々が普段使っているC#やJava、pythonなどは命令型プログラミングの言語です。

筆者は関数型言語には今まで触れたことがないのですが、興味があったのでこの場を借りて使ってみたいと思います。

今回は純粋型関数型言語のHaskellを使っていきます。

関数型プログラミングとは

命令型プログラミングと比較すると関数型プログラミングでは7つの特徴があります。

  1. 関数を組み合わせてプログラムを組み上げる
  2. すべての式が戻り値を返す
  3. 関数を値として扱うことができる→ある関数の引数やコレクション、配列に関数を入れることができる
  4. 関数を柔軟に組み合わせることができる→2つ以上の引数を持つ関数で一部の引数のみ入れると別の関数として使うことができる(部分適用)
  5. 副作用を起こさない→変数は定数のように扱われ、遅延評価が可能
  6. 場合分けと再帰でループ処理を行う
  7. コンパイラが自動的に型を推論する

このブロックは「オブジェクト指向でなぜつくるのか」の補章の要約に詳しい内容が載っているので、気になる方はちらをご覧ください。

環境構築

実際にVSCodeで環境構築からHello Worldを表示するまでをやってみたいと思います。

1.Haskellをインストール

power shellを起動して公式サイトに記載されているスクリプトを実行します。

Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; try { & ([ScriptBlock]::Create((Invoke-WebRequest https://www.haskell.org/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing))) -Interactive -DisableCurl } catch { Write-Error $_ }

いくつか選択肢が出るのでy/nを選択します。

別ウィンドウが自動で起動するのでこちらもダウンロードが終わるまで待ちましょう。

(筆者はせっかちなので、最初これを待たずに消してしまいbin配下が空になってしまったため再インストールする羽目になりました)

2. VSCodeの拡張機能をインストール

VSCodeを立ち上げ、拡張機能からHaskellをインストールします。

これをインストールすると自動でHaskell Syntax Highlightingもインストールされます。

Hello Worldを出力する

\haskell-test配下にtest.hsファイルを作成しました。

このtest.hsファイルに下記のように記述します。

main = do
    -- テスト出力
    print "Hello World!"

すると

main::IO ()

上記のコードが自動補完されました。これは型宣言です。

main関数はプログラムが実行を開始するためのエントリーポイントです。

::の後ろには型を書きます。(stringやintなど)

IO ()IOは「入出力アクション」を表すモナドであり、()は「値がない」ことを表す型です。

つまり、IO ()は、「副作用(入出力)を伴うアクションであり、戻り値を持たない」という意味になります。

では、作成したプログラムを実行します。

ターミナルを開いてtest.hsを配置したフォルダへ移動します。

ghc .\test.hs を叩きます。

無理でした。

パスが通ってないようです。

通ってました。

Haskellをインストールした後に自動で追加されますのでVSCodeを再起動してください。

もう一度ghc .\test.hs を叩きます。 

できました。コンパイルされて.exeファイルが作成されます。

.exeファイルを実行します。

Hello Worldを出力できました。

良かったですね。

ちなみに

GHCにはインタラクティブな対話シェルが用意されているため、ターミナル上で直接実行することも可能です。

ghci test.hsを実行し、GHUIが起動しますので実行したい関数を 入力します。

今回は main と入力すると、 Hello Worldと出すことができました。

最後に

今回はHaskellをインストールしてHello Worldを出力するところまでをやりました。

これだけではまだまだ関数型プログラミングの特徴や良さは分かりませんでした。

また引き続きHaskellを使った記事を書いていきたいと思います。