无限懒惰的数字列表

时间:2014-01-14 20:40:51

标签: haskell lazy-evaluation number-theory

所以我正在尝试做一些数论工作,我正在使用Mathematica,但认为Haskell更适合处理无限列表(因为AFAIK Mathematica没有懒惰的评估)。我想要做的是让Haskell在无限懒惰列表中存储1 / x的所有数字。到目前为止,我的搜索还没有找到一种方法将比率分成数字,返回数字列表而不是实际的浮点数。

2 个答案:

答案 0 :(得分:6)

我们也可以将其实现为简单的流生成器​​:

divDigits :: Int -> Int -> [Int]
divDigits x y = x `div` y : divDigits (10 * (x `mod` y)) y

实际上存在使用惰性列表的这种“无限” - 精确数字表示的库,请参阅Haskell Wiki

答案 1 :(得分:2)

非常感谢Sam Yonnou,他提供的链接具有正确的公式 使用的公式:
x / y的第n位是(10 ^(n-1)* x mod y)/ y = floor(10 *(10 ^(n-1)* x mod y)/ y)mod 10的第1位数

结尾代码如下所示:

nDigRat :: Int -> Int -> Int -> Int
nDigRat num denom n = floor (fromIntegral (10*(10^(n-1)*num `rem` denom)) / 
                             fromIntegral denom) 
                      `rem` 10

decExpansionRecipRat :: Int -> [Int]
decExpansionRecipRat n = map (nDigRat 1 n) [1..]