はじめて質問させていただきます。
Haskell学習中の者で、理解が進まない箇所があるのでお力添えいただきたく思います:man-bowing:
(続く...)
Haskell学習中の者で、理解が進まない箇所があるのでお力添えいただきたく思います:man-bowing:
(続く...)
関数の処理の末尾が再起呼び出しで終了している末尾再起最適化することによって関数呼び出しごとにコールスタックを生成しなくなるのでスタックオーバーフローしないa. よく見る末尾再起じゃない定義
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
=======================================================
b. 末尾再起?
fibResult :: (Integer, Integer, Integer) -> Integer
fibResult (x, _, 0) = x
fibResult (x, y, idx) = fibResult (y, x + y, idx - 1)
fib :: Integer -> Integer
fib x = fibResult (0, 1, x)
=======================================================
c. 末尾再起?
fib :: Integer -> Integer
fib n = fib' n 1 0
where
fib' m x y
| m == 0 = 1
| m == 1 = x
| otherwise = fib' (m - 1) (x + y) (x)「末尾再帰」は「手続き」に対してのみ「末尾再帰かどうかが言える」んじゃないかなと思うんですが?すみません、そういった観点は持っておりませんでした。
もしサンクを潰したければ、正格評価にする必要があります。ちなみに、正格評価にするとサンクを使用しなくなると思いますが、この場合はコールスタックを使うことになりますか?
また、Haskellでは再帰を末尾にすることによる最適化もされないと認識していますこれは違ったようです。