uni farm

Haskell勉強メモ1

haskellの概要や用語の説明をまとめておく

ソースコード

iHaskellで試している

Haskell入門

ウォークスルー Haskell

ウォークスルー Haskell - Haskell 入門をiHaskellでやってみた .ipynbに書いておく

https://github.com/uni-3/haskells

用語

気になった語をまとめておく

純粋関数型言語

関数でプログラムを構成する言語を指す

関数とは数学で使う関数と同じで 同じ引数に対して同じ値を返すもののことをいう

f(x)=5xf(1)=5f(x) = 5x \\ f(1) = 5

のような関数のことを言う

このように同じ値を渡したとき、必ず同じ結果が返ってくる性質を参照透過性といったりする。関数が状態を持たないことを保証している

いわゆる変数への副作用がない関数のことを参照透過性を持つというのだろうか

それらを組み合わせた式で構成されるプログラムのことを純粋関数型プログラミングと言ったりする

haskellではこのような書き方が推奨されている

純粋性

純粋とはすべての変数はイミュータブル(変更不能)であること

I/O(入出力)を使用したいときはIOモナドと呼ばれる仕組みを使う必要がある。特にI/Oは副作用を伴う場合が多いので、純粋性を保つために使われるらしい

遅延評価

haskellにおいて式は遅延評価される

他のプログラミング言語(手続き型言語と言ったりする)では関数は呼び出されたときに実行される

haskellでは必要になるまで実行されない

f(1/x)という関数を実行するとき、遅延評価しない場合は、1/xを先に計算し、その結果を引数としてfが呼び出される

haskellでは1/xは計算されずに、fに渡される。実際に引数が使われるタイミングで計算される。これを遅延評価という

メリットとしては、使われない式は評価されなくなるなどがある

デメリットとしては、評価の順番が予測しづらいこと、g(f)のような関数は、g->fの順で実行されるなど直感的でない場合がある。また、未評価の式が溜まっていき、メモリ消費が増えスペースリークという状態になるときがある

I/Oアクション

haskellのような関数型言語は式(関数)を組み合わせてプログラムを記述していく

値を渡して評価するのみだと、何がしかの処理を出力するなど、I/O部分の相互作用はできない そこで

  • ファイルの読み書き
  • 標準入出力
  • HTTP通信
  • 現在時刻の取得

などをおこなう式、I/Oアクションと呼ばれる式を用いる

例えばputStrLnは値を返さない(Unit型が返り値)。値を返さずに、画面に文字列を表示するという副作用(side-effect)を引き起こしている。

式の評価以外の何かを起こす式をI/Oアクションという

参考

2022, Built with Gatsby. This site uses Google Analytics.