如何将一个分数转换成Haskell中的数字列表?

如何将一个分数转换成Haskell中的数字列表?,haskell,Haskell,我想取1/7(0.142857142857…)这样的值,并将其转换为“0.142857142857”或“142857142857”[1,4,2,8,5,7,1,4,2,8,5,7]。使用 map ((+) (-48) . ord) . show 当分母较小但分母较大时,Haskell开始使用科学记数法。如何始终将分数转换为数字列表?这不是一个完整的解决方案,但它可以帮助您开始。这将获取介于0和1之间的数字的数字列表。用适当的方法包装它,以获得所需格式的输出 digits :: (RealFra

我想取1/7(0.142857142857…)这样的值,并将其转换为“0.142857142857”或“142857142857”[1,4,2,8,5,7,1,4,2,8,5,7]。使用

map ((+) (-48) . ord) . show

当分母较小但分母较大时,Haskell开始使用科学记数法。如何始终将分数转换为数字列表?

这不是一个完整的解决方案,但它可以帮助您开始。这将获取介于0和1之间的数字的数字列表。用适当的方法包装它,以获得所需格式的输出

digits :: (RealFrac a) => a -> [Int]
digits 0 = []
digits x = d : digits (10*x - fromIntegral d)
    where
    d = floor (10*x)
玩弄它:

ghci> digits (1/4)
[2,5]
ghci> digits (1/3)
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,7,2,7,3,8,6,0,0,9,
 9,9,5,8,2,5,5,8,8,7,0,3,1,5,5,5,1,7,5,7,8,1,2,5]

-- rounding error got us, let's use an exact rational

ghci> import Data.Ratio
ghci> digits (1%3)
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
...

当然,您可以从无限的数字列表中获取前缀。

我想这是最简单的方法

showDigits :: Int -> Double -> String
showDigits n x = show (floor x) ++ "." ++ showRest n x

showRest :: Int -> Double -> String
showRest n x | n <= 0 = ""
             | otherwise = digitToInt dig : showRest (pred n) x'
  where dig = (floor x') `mod` 10
        x' = x * 10
我想你需要:


例如,这将显示1/7到12位小数。它永远不会使用科学符号

Numeric.showFFloat (Just 12) (1/7) ""

顺便说一句,检查一下。另一种方法是,
(+)(-48)
可以写
减法48
。如果你把数字交给1,这个函数有点滑稽<代码>数字(4%3)=[13,3,3,3,…])这个
数字
模块是什么?
import Data.Char
import Text.Printf

getDigits :: Double -> [Int]
getDigits=map ((subtract 48).Data.Char.ord) . (Text.Printf.printf "%f")
Numeric.showFFloat (Just 12) (1/7) ""