关于函数式编程:使用Haskell子集的无限权力列表

Infinite list of powers using subset of Haskell

我需要做一个函数"powers",它接受一个数字n,并将该数字的无限列表返回到每个数字的幂,例如。

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

我需要使用非常特定的语言子集来完成这项工作,其中我唯一可用的内置函数是:div、mod、even、odd、head、tail、not、null、length、reverse、elem、map、filter、folder、sum、product、take、drop、takewhile、dropwhile、zipwith和from。

该子集也没有^运算符。

还有一些更重要的限制:

  • 代码不能超过80个字符的1行
  • 不允许使用"helper函数",即我不能在此定义中编写要使用的其他函数。

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

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

但是如果没有助手函数,我就无法理解如何让函数完成这项工作。

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

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

但是我不能这样做,因为我不能使用这个函数。

抱歉,如果符号不同于普通的haskell,它是一个非常严格的核心haskell子集,使用了这个符号。


这是一个递归问题。

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

(允许使用:吗?)


当洞察来临时,这是有趣和有趣的。在列表中连续生成2个较长的重复

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

然后取每个列表的乘积。

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

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

如果允许迭代。

1
take 24 $ iterate (2*) 2

将生成列表。

编辑:2018年4月4日

一个无限递归函数,可能是您想要填充函数的内容。可能是:

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

要生成一个列表,绝对需要组装一个列表,并且必须使用列表的最后一个元素来依次计算下一个元素。这也必须与take一起运行。下面的命令以1开始列表。它可以以任何数字开始,如64或63。我尝试将最后一个值作为参数传递,但函数不会生成列表。有一个选项,使用":"而不是"++",但它将生成列表中的每个元素。若要生成值列表而不是列表,请在"take"之前使用"concat$"将其清除。

1
take 10 $ pow [1]