使用Haskell子集的无限权力列表

时间:2012-11-21 07:39:10

标签: haskell functional-programming

我需要创建一个带有数字n的函数“powers”,并将该数字的无限列表返回给每个数字的幂。例如。

powers 2 = 2,4,8,16,32......

我需要使用非常特定的语言子集来执行此操作,其中我唯一可用的内置函数是:div,mod,even,odd,head,tail,not,null,length,reverse,elem,map,filter, foldr,sum,product,take,drop,takewhile,dropWhile,zipWith and from。

该子集也没有^运算符。

还有一些重要的限制因素:

  • 代码不得超过1行,超过80个字符
  • 不允许使用“辅助函数”,即我无法在此定义中编写另一个函数。

到目前为止,我的想法是这样的:

powers = \n -> map (\x -> "some function to get n to the power of x") (from 1)

但是我无法弄清楚如何在没有辅助函数的情况下让函数执行此操作。

例如,如果我要使用返回数字x的无限列表的函数inflist,那么我可以执行以下操作。

powers = \n -> map (\x -> product(take x (inflist n))) (from 1)

但我无法做到这一点或类似的事情,因为我无法使用该功能。

很抱歉,如果符号与普通的haskell不同,它是一个非常严格的核心haskell子集,它使用这种表示法。

2 个答案:

答案 0 :(得分:3)

这是一个递归问题。

powers n = n : map (* n) (powers n)

(您是否可以使用:?)

答案 1 :(得分:0)

当洞察力出现时,这很有趣,也很有趣。 使用

在列表中连续生成2个较长的重复项
[ [ 2 | y <- [1..x]] | x <- [1..]]

然后取每个列表的产品。

map product [ [ 2 | y <- [1..x]] | x <- [1..]]

确保在调用之前使用take x 我努力使用mod和多个mod函数来限制列表。

如果允许迭代。

take 24 $ iterate (2*) 2

会生成列表。

编辑4/4/2018

无限的递归函数,可能就是您要填写的功能。它可能是:

pow l = l ++ pow [(last l * 2)]

要生成列表,必须组装一个列表,并且必须使用列表的最后一个元素按顺序计算下一个元素。这也必须与take一起运行。此外,以下命令以1开始列表。它可以使用任何数字(例如64或63)启动。我尝试将最后一个值作为参数传递但是该函数不会生成列表。有一个选择,使用':'而不是'++',但它会在列表中生成每个元素。要生成一个值列表而不是在'take'之前使用'concat $'的列表列表来清理它。

take 10 $ pow [1]