0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

参照透明性と遅延評価 - Haskellで学ぶ関数型の魅力

Posted at

関数型プログラミングを学び始めると、よく耳にするキーワードが「参照透明性」と「遅延評価」です。この記事では、これらの概念が何を意味し、Haskellではどのように活用されているのかを、サンプルコードとともに解説します。

参照透明性とは?

参照透明性(Referential Transparency) とは、同じ式が常に同じ結果を返す性質のことを指します。副作用がなく、関数の出力は入力だけに依存している状態です。

例えば、次のHaskell関数は参照透明です:

add :: Int -> Int -> Int
add x y = x + y

この add 2 3 はどこで呼び出しても常に 5 を返します。これが参照透明性の特徴です。

逆に、IO操作を含む関数は参照透明ではありません。

getCurrentTime :: IO UTCTime

これは呼び出すたびに異なる結果を返します。

遅延評価とは?

遅延評価(Lazy Evaluation) は、値が必要になるまで計算を行わない評価戦略です。Haskellではデフォルトで遅延評価が採用されています。

これにより、無限リストの定義や、パフォーマンス最適化が可能になります。

naturals :: [Integer]
naturals = [0..]  -- 無限リスト

takeFive :: [Integer]
takeFive = take 5 naturals  -- [0,1,2,3,4]

このように、naturals は無限に続くリストですが、take 5 により最初の5つだけが評価されます。

両者の組み合わせが生む強力さ

参照透明性と遅延評価が組み合わさることで、以下のような利点があります:

  • メモ化(Memoization) が自然に可能になる
  • 安全な並列処理 がしやすい
  • 簡潔で効率的なコード が書ける

例:フィボナッチ数列(メモ化あり)

fibs :: [Integer]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

take 10 fibs  -- [0,1,1,2,3,5,8,13,21,34]

このコードでは、過去の計算結果が自動的に再利用されるため、高速かつメモリ効率の良い実装になります。

おわりに

Haskellの「参照透明性」と「遅延評価」は、関数型プログラミングの魅力を最大限に引き出す要素です。これらを理解することで、より予測可能で安全なコードを書くことができるようになります。

これを機に、ぜひHaskellの世界に足を踏み入れてみてください!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?