アルゴリズム自体には触れませんが、再帰関数を構築する方法についてのアドバイスを以下に示します。
まず、コードを別のファイルにフォーマットする方法を次に示します
fibo :: Integral x => [x]->x->x->x->[x]
fibo l x y 0 = l
fibo l x y n = fibo (l ++ [y+x] ++ [y+x+y]) (x+y) (y+x+y) (n-1)
これを fibo.hs として保存すると、次のコマンドで GHCi を起動できます。
ghci fibo.hs
開始時にファイルをロードします。コマンドでGHCiを起動した後にファイルをロードすることもできます
:l fibo.hs
(fibo.hsを保存したのと同じディレクトリでGHCiを起動すると仮定します)
もう 1 つの優れた機能は、ファイルを編集するときに、次のように入力するだけですべての変更をリロードできることです。
:r
GHCiプロンプトで。
さて、余分なパラメータを取り除くために、Haskell の通常のパターンは、再帰部分を独自のヘルパー関数にリファクタリングし、メイン関数を必要なパラメータのみを取るエントリ ポイントとして持つことです。例えば、
fibo :: Integral x => x -> [x]
fibo n = fiboHelper [0,1] 0 1 n
fiboHelper :: Integral x => [x]->x->x->x->[x]
fiboHelper l x y 0 = l
fiboHelper l x y n = fiboHelper (l ++ [y+x] ++ [y+x+y]) (x+y) (y+x+y) (n-1)
fibo
これで、次のように簡単に呼び出すことができます
> fibo 3
[0,1,1,2,3,5,8,13]
let
また、このような単独では役に立たないヘルパー関数は、通常、またはを使用して内部関数としてメイン関数内に隠されますwhere
。
fibo :: Integral x => x -> [x]
fibo n = fiboHelper [0,1] 0 1 n where
fiboHelper l x y 0 = l
fiboHelper l x y n = fiboHelper (l ++ [y+x] ++ [y+x+y]) (x+y) (y+x+y) (n-1)
このような内部関数には通常、短い名前が付けられます。これは、コンテキストがその目的を明確にするためです。そのため、名前を eg に変更できますfibo'
。
go
は、再帰ヘルパー関数の別の一般的な名前です。