Haskell を試してみたいと思い、ちょうど計算したいこともあったのでWebを見ながらプログラミングをはじめました。
とりあえず、正の整数を引数として、その整数の各桁を要素とするリストを返すような関数が必要だったので、見よう見まねで下のプログラムを書きました。
しかし、エラーが解消されずとん挫してしまいました。整数の割り算が良くなかったようですが、どのように直せばよいでしょうか。
どうぞよろしくお願いします。
main=((putStrLn . show) . a) 123
a :: Int -> [Int]
a n = f n []
where
f :: Int -> [Int] -> [Int]
f n b
| n == 0 = b
| n /= 0 = mod n 10 : f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10) ) b
エラーメッセージは次のようでした。
paiza.io というホームページで提供されている環境を使いました。
[1 of 1] Compiling Main ( Main.hs, Main.o )
Main.hs:9:31: error:
? No instance for (Fractional Int) arising from a use of ‘/’
? In the first argument of ‘f’, namely
‘((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10))’
In the second argument of ‘(:)’, namely
‘f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10)) b’
In the expression:
mod n 10
: f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10)) b
整数同士の除算であればdivまたはquotを使えばいいので、fの定義は単純にこんな感じでどうですか。nが負の値の場合は考慮していません。
f n b
| n == 0 = b
| otherwise = mod n 10 : f (div n 10) b
この場合、a 123を計算すると[3, 2, 1]という結果になります。