5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-03

はじめに

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
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?