はじめて質問させていただきます。
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では再帰を末尾にすることによる最適化もされないと認識していますこれは違ったようです。