Haskell勉強会

関数型プログラミングの学習日記

Haskell 関数を定義する構文

Haskellの基本的な関数の作り方を学びます。

 

haskell.hatenablog.com

 

 

1.2 赤ちゃんの最初の関数

(p.5)

 

関数を定義する構文

  • 関数名の後ろにスペースで区切った引数が続きます。
  • 引数の後ろには=演算子が続き、関数の本体を表すコードがそれに続きます。

  

-- 引数が0個の関数
関数名 = 関数の本体

-- 引数が1個の関数
関数名 引数 = 関数の本体

-- 引数が2個の関数
関数名 引数1 引数2 = 関数の本体

 

if式

  • Haskellの「if」は、「文」ではなくて「式」です。
  • 式なので、評価すると何らかの値を返します。
  • Haskellのifは、elseが必須です。(判定が真でも偽でも値を返す必要があるため)

 

Haskellプログラムは関数の集まりです。

関数はデータ値を結果の値に変換するのに使われ、すべての関数は何らかの値を返します。

そしてその値はまた別の関数によって使われます。

だから、すべての関数は何かを返さなければなりません。

これは、すべてのifは対応するelseを持たなければならないことを意味します。

さもなければ、ある条件を満たすときは値を返し、満たさないときは返す値がないというような関数を定義できてしまいます!

簡単に言うと、Haskellのifは必ず値を返す式であって、文ではないのです。

 

関数名に使われる「'」(アポストロフィー)

Haskellでは、関数名に「'」(アポストロフィー)の文字が使えます。

習慣的に、正格版の関数(遅延評価ではない関数)を表したり、少し内容を変更したバージョンの関数に似た名前をつけるために利用されます。

 

-- 消費税8%の価格
taxPrice x = x * 1.08

-- 消費税10%の価格
taxPrice' x = x * 1.10

 

関数名は小文字で始める

Haskellの命名則では、関数名は小文字で始めます。

(大文字で始めると、関数ではないものとして扱われてしまうため)

Haskellでは関数を大文字で始められないことになっています。

 

(参考)Haskell の文法

  • 型の名前と構成子は大文字で始めます。
  • 関数、引数、定数は小文字で始めます。

 

大文字で始めるのは、型の名前など、他のものに割り当てられているんですね!

 

引数がない関数

関数が1つも値を取らないとき、これを定義とか名前とか呼びます。

引数がない場合は、すなわち「定数」を定義していることになります。

 

サンプルコード

以下の内容を「baby.hs」として保存。

--1.2 赤ちゃんの最初の関数

-- 引数が1個の関数
doubleMe x = x + x

-- 引数が2個の関数
-- doubleUs x y = x * 2 + y * 2
doubleUs x y = doubleMe x + doubleMe y

-- if式はelseが必須
doubleSmallNumber x = if x > 100
    then x
    else x * 2

-- 関数名に「'」を使用。少し変更した関数
doubleSmallNumber' x = (if x > 100 then x else x * 2) + 1

-- 引数が0個。定数定義
conanO'Brien = "It's a-me, Conan O'Brien!"

 

GHCiで「baby.hs」を読み込んで、作った関数を使ってみる。

f:id:hamamuratakuo:20170822185651p:plain

 

型注釈

もう少し先に進むと、関数を定義するときに「型注釈」(シグネチャー)も書くようになりますが、現時点では書いていません。

(「型注釈」がないときは、「型推論」でうまく処理してくれるから大丈夫?)

 

-- 型注釈(引数の型 -> 返り値の型)
doubleMe :: Int -> Int
doubleMe x = x + x

 

まとめ

  • 関数名は小文字で始める。(大文字で始めると、関数以外のものとして扱われる)
  • 引数名も小文字で始める。
  • 引数がない関数は、定数になる。(定数名も小文字で始める)
  • 関数名に「'」(アポストロフィー)が使える。
  • 内容が似たような関数に、別名を付けるとき、習慣的に「'」を付けている。
  • Haskellの「if」は文ではなく式。必ず「else」とセットで使う。

 

現場からは以上です。

 

 

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!