Haskellの始め方(3)条件分岐とパターンマッチング
1.パターンマッチング(case式)
式の値がパターンにマッチするかしないかを判定する仕組み。
getValue defval maybe =case maybe ofNothing -> defvalJust x -> x
main = doprint (getValue 0 Nothing) -- 出力: 0print (getValue 0 (Just 5)) -- 出力: 5
Nothing と Just x は maybe型で、
(1) Nothing 値が存在しないとき、
(2) Just x 値xが存在するとき、
使用します。
2.ガード(case式)
パターンの後に、| で、条件式を記述する。
max' :: (Ord a) => a -> a -> amax' a b| a <= b =b| otherwise =a
3.if式
if ... (条件式)then ...(式1) else ...(式2)
と書く。この時、then...else...以下は省略できない。
必ずelse以下も書かなければならないし、式1と式2は型が同じである
必要がある。
また、 if b then e1 else e2 という式は、次のcase式に相当する。
後でたぶん大幅に加筆修正する。(ソース例の部分を)
(参考)
Hakellの始め方(2)ソースコードの実行
昨日は、Haskellの環境を構築するところまで済んでいました。今日は、HaskellのソースファイルをGHCiにロードして、実行する方法を記述していきます。
実行するソースは、入力した数の階乗を求める関数です。
ソースコードは、https://stuff.mit.edu/iap/hackhaskell/の
https://stuff.mit.edu/iap/hackhaskell/examples/sequence.hsを参考にしました。
factorial :: Integer -> Integerfactorial n = if n < 2 then 1 else n * factorial (n-1)
まずGHCiを起動します。
stack exec ghci
ソースコードを保存したディレクトリ(ここではdirとする)に移動して、
:cd dir
:loadコマンドでソースファイルをロードして、実行する。
Prelude> :load sequence
そして、factorialを実行すると、
*Main> factorial 10
3628800
*Main> factorial 30
265252859812191058636308480000000
実行できました。
ついでにフィボナッチ関数も実行してみます。
--(定義)fibo_like :: Integer -> Integer -> [Integer]fibo_like a b = a : fibo_like b (a+b)
fibonacci, lucas :: [Integer]fibonacci = fibo_like 0 1lucas = fibo_like 2 1
*Main> take 15 fibonacci
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]
Haskellの始め方(1)開発環境構築
Haskellの環境構築は、少し前までは鬼のように面倒だったらしいですが、今では(2020.06月)始めるだけならとりあえず容易みたいです。末尾の参考文献に詳しいので、知りたい方は、本文を読まずに参考リンクから飛んでください。
https://docs.haskellstack.org/en/stable/install_and_upgrade/
から、stackと呼ばれるビルトツールを落としてきます。お使いのOSに対応したものをどうぞ。
解凍して、インストールし終えたら、コマンドプロンプトから、
stack setup
と命令することで、GHCというコンパイラツールがインストールされます。
続いて、
stack exec ghci
と打ってやることで、ghci(対話的なHaskellインタプリタ)が立ち上がって、
Hakellを始められるようになります。とりあえず、
Prelude> 1+2
3
とやってみます。いちたすには、さん。
ghciを閉じたくなったら、
:quit
で閉じます。
なぜStackを使うのが好いかというのが知りたければ、
「cabal hell」という単語でググればわかると思います。
(参考)
https://haskell.hatenablog.com/entry/Install-Haskell-with-Stack
https://haskell.e-bigmoon.com/stack/intro/stack-install.html