• ベストアンサー
  • 困ってます

Haskell 整数の各桁を要素とするリストを返す

  • 質問No.9753529
  • 閲覧数71
  • ありがとう数1
  • 回答数1

お礼率 92% (24/26)

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

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 65% (830/1268)

整数同士の除算であればdivまたはquotを使えばいいので、fの定義は単純にこんな感じでどうですか。nが負の値の場合は考慮していません。

f n b
| n == 0 = b
| otherwise = mod n 10 : f (div n 10) b

この場合、a 123を計算すると[3, 2, 1]という結果になります。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ