数値のリストに対して、基数10の基数変換を実施する関数(dec2int)を定義します。二通りの方法で。
dec2intの動作は、こんな感じ。
>dec2int [2,0,1,4]
2014
一つは、数学的に直感的な再帰的定義による方法、次は、foldlを用いた若干、機械的、機構的な方法で。
dec2intの型定義
dec2int :: [Int] -> Int
整数のリストをとり、整数を返す...関数と定義
んでは、再帰によるdec2intの定義へ。
再帰の基底条件
リストの要素に対しての操作なので、リストの要素がなくなることが、再帰の基底条件ですね。
空リストのとき、0を返す。
再帰のアイディア
リストの先頭に対し、基数変換を実施、位取りは、リスト中での位置を利用。
ついで、再帰を実施。
プログラム
再帰定義によるdec2int
rec_dec2int :: [Int] -> Int
rec_dec2int [] = 0
rec_dec2int (x:xs) = x * (10 ^ length xs) + rec_dec2int xs
はい。出来ました。
次に、foldlを利用したdec2intの実装です。
λ式の定義+何を累積(accumlate)するか?
累積する値は、基数変換の結果を逐次。
λ式の定義は、基数変換の結果に対して、( * 10)を施し、整数のリスト要素を足し合わせる。
イージー。
プログラム
foldlによるdec2int
foldl_dec2int :: [Int] -> Int
foldl_dec2int xs = foldl (\accum x -> accum * 10 + x) 0 xs
foldlによる記述の方が、シンプルですね。