Edited at

すごいH本読んだからまとめ 1 「関数の呼び方、関数の定義の仕方」


はじめに


ghciを使ってみる


  • この本ではghciを使ってコードの説明をしている。

  • ghciはHaskellのインタラクティブ実行環境


    • pythonのjupyter notebookとか、javascriptのコンソールのようなもの。



  • 今どきのHaskellerはstackとかいうものを使っているらしいのでghciを使うためにstackをインストールすると良いらしい。

  • stackからghciを起動するコマンドはstack ghci


計算をやってみる


数の計算

ghci> 6 + 2 * 3 -- ちゃんと掛け算から計算してくれるかチェック

12 -- 計算には優先順位がある

ghci>(6 + 2) * 3 --()をつけたときの実行順をチェック
24 -- ()でくくられると優先的に計算される。


論理演算子

ghci> True && False -- AND

False
ghci> True && True -- AND
True
ghci> False || True -- OR
True
ghci> not False -- OR
True
ghci> not (True && True) -- NOT
False -- NOT (True)


等しいかどうか

ghci> 5 == 5  

True
ghci> 1 == 0
False
ghci> 5 /= 5
False
ghci> 5 /= 4
True
ghci> "hello" == "hello"
True

ghci> 1 == '1' -- 別の型を比較
<interactive>:5:1: error: -- エラー出る。素敵
? No instance for (Num Char) arising from the literal 1
? In the first argument of (==), namely 1
In the expression: 1 == '1'
In an equation for it: it = 1 == '1'


  • ある型の値がを持って等しいとするかの定義を型クラスで行う事ができる。


関数呼び出し


関数の呼び方


  • succは引数の「次の値」を返す関数

  • ある型の値がを持って次の値とするかの定義を型クラスで行う事ができる。

ghci> succ 8 -- スペース区切りで引数を渡せる。  

9 -- 9は8の次の数
ghci> min 9 10 -- 複数渡すこともできる。
9


関数の優先順位

ghci> succ 9 + max 5 4 + 1 -- まずsuccとmax関数が実行される

16
ghci> (succ 9) + (max 5 4) + 1
16
ghci> succ 9 * 8 -- 9*8(=72)の次の値を計算しようとする
80 -- 先にsuccが効いちゃって、10*8の値が返ってきちゃう(10はsucc 9)
ghci> succ (9 * 8) -- ()でくくると上手く計算できる
73


  • 四則演算子とかは他の関数より実行順位が遅めに設定されている模様


引数が2つのときの便利記法

ghci> div 10 2

5
ghci> 10 `div` 2 -- バッククォートで中起き演算子になる。(直感的にわかりやすい)
5


計算順関連でなんかつまったところ

ghci> succ succ 8 -- 10の出力を期待

<interactive>:13:1: error: -- 左から実行するのでまずsuccにsuccをやっちゃう
? Non type-variable argument in the constraint: Enum (a -> a)
(Use FlexibleContexts to permit this)
? When checking the inferred type
it :: forall a. (Enum a, Enum (a -> a), Num a) => a

ghci> succ (succ 8) -- 計算の優先順を変更
10 -- 成功


関数を定義する

ghci起動した場所と同じディレクトリに.hs拡張子のファイルを置いて書く

-- 足し算

myPlus x y = x + y

-- 差の絶対値
myNumericalDifference x y = if x > y -- Haskellもif文使える
then x - y
else y - x -- Haskellではelse節が必須(Haskellの関数はなにか返さないといけない)

関数をロードして実行。

ghci> :l <定義したファイルの名前> -- ファイルロード

[1 of 1] Compiling Main ( myfunction.hs, interpreted )
Ok, one module loaded.]
ghci> myPlus 3 2 --関数実行
5
ghci> myNumericalDifference 5 6 -- 関数実行
1
ghci> myNumericalDifference 6 5
1