成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

すごいHaskellたのしく学んでみる-その1

勉強会に参加する事や、TL上でよく見る本だったので、買ってみました。

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

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


元々関数型には興味があったので、
Scalaもやってますが、
未だにぼやーっとしか分からないので、
これを期にHaskellデビューしてみて、
分かったことや興味深かった事をメモって行こうかなと思います。


今日勉強したこと…

  • HaskellPlatformをインストールしてghciで少しいじってみた
  • 関数呼び出し(前置関数、中置関数)
  • 演算の優先度
  • haskellのif式

なんか中途半端な所で終わってますが、気にしないw


とりあえず、
1.HaskellPlatformをインストール

Download Haskell

ここから、自分の環境にあった物をインストールします。
HaskellPlatformは、
もっとも広く使われているコンパイラGHCやHaskellのライブラリなどが同包されているようです。

インストールしたら、早速

ghci

で対話環境を起動。

Prelude> 1*2
2
Prelude> 3*2
6
Prelude> True && False 
False
Prelude> 2 == 3
False
Prelude> 2 != 2

<interactive>:1:3: Not in scope: `!='
Prelude> 2 /= 2
False

ちょっと「へぇー」と思ったのが

  • bool値の頭文字が大文字
  • not equalが「/=」


では次に進んでみます。

2.関数呼び出し(前置関数、中置関数)

  • 前置関数

 関数名を前に置く関数(いわゆる普通に呼び出す関数) ex) max 10 20

  • 中置関数

 関数名を引数の間に置く関数 ex) 1 * 2 (←これの*のこと)

この言葉は初めて聞きました。
そういう名前があるんですね。(haskell特有の名前なんでしょうか?)


前置関数の例

Prelude> max 10 30
30
Prelude> min 10 20
10
Prelude> div 10 20
0
Prelude> div 20 2
10
Prelude> divMod 20 3
(6,2)

中置関数の例

Prelude> 1 + 2
3
Prelude> 2 - 1
1
Prelude> 3 * 4
12
Prelude> 10 / 2
5.0
Prelude> 10 `div` 2
5

面白いのは

  • 「`(バッククオート)」を使うと前置関数を中置関数に出来る
  • 「div」は結果が整数になるのに対して「/」は少数


3.演算の優先度

haskellでは、
関数の適用、が演算の中で最も高い優先度を持つそうです。
もちろん演算子にも優先度があります。
確かめてみましょう。

Prelude> succ 9 + 10
20
Prelude> succ 9 * 10
100
Prelude> succ 9 + 10 * 2
30

式と結果を見ると、

  1. succ
  2. *
  3. +

という優先度になっている事がわかります。
ココで一つ疑問に思いました。
「関数の適用が最も高い優先度」だとしても、「*」や「+」も関数なのでは、、、?
本にもそう書いてる。
演算子は特別扱いされるということなんでしょうか。
(※後日調べてみます)

4.haskellのif式

haskellのif式は

if 条件
then 条件にマッチした時
else 条件にマッチしない時

と、書くようです。
ここで、興味深いのは、
「else節が必須」な所です。


haskellでは、プログラムは関数の集まり、として考えます。
関数はデータをもらって結果を返します。
その結果はまた別の関数に渡されます。
なので、すべての関数はなにかしら結果を返さなければなりません。
だから、ifは必ずelseが必要で、
条件に一致しない場合の「結果」を返さなければならないのです。
なので、haskellのifは「文」ではなく、「式」なんだそうです。

これはすばらしい。うん。


というわけで、今日はここまで。
内容はうすっぺらいですが、まぁ、徐々にやってきます。。