【问题标题】:Infinite lists in haskell using predefined functions使用预定义函数的haskell中的无限列表
【发布时间】:2016-06-18 16:38:01
【问题描述】:

我是 Haskell 的初学者,我正在尝试制作一个简单的程序,它需要一个列表,例如 [-3,8] 并生成无限列表:[-3,8,-3,8,-3,8,...]

感谢 Haskell 的惰性计算,我编写了一个非常简单的程序来计算它:

period :: [a]->[a]
period p = p ++ period p

我想知道是否存在使用高阶函数(迭代、映射、...)的更简单的解决方案

【问题讨论】:

  • 下次考虑使用hoogle。它是 Haskell 的搜索引擎。您可以按名称或类型进行搜索(请参阅链接搜索以及第一个结果如何准确地为 cycle)。

标签: haskell


【解决方案1】:

一般来说,查找列表函数的第一个位置是Data.List。在那里你会发现

cycle :: [a] -> [a]

这正是你想要的。但是,它的定义略有不同,以便制作循环链表而不是无限链表。类似的东西

cycle xs = ys where ys = xs ++ ys

这样可以避免大量不必要的内存分配。你可以使用Data.Function.fix来表达这个定义:

cycle xs = fix (xs ++)

如果你喜欢过度概括,你可以为一般的Semigroups 定义这个使用

cycle xs = fix (xs <>)

尽管这对于大多数半群来说会有所不同。

如果你是一个无积分的狂热者,你可以把它翻译成

cycle xs = fix ((<>) xs)

然后你可以看到是

cycle = fix . (<>)

【讨论】:

  • fix . (&lt;&gt;) 的美丽让我内心的无意义狂热者哭了,但即使从实用的角度来看,这也很整洁。
  • forever :: Applicative f =&gt; f a -&gt; f b 如果我们想象能够使用它via the behaviour of Const 我们得到cycle = forever @(via Const) :: Monoid m =&gt; m -&gt; m
  • @Iceland_jack 没有它,它仍然一点也不坏。 cycle = getConst . forever . Const,或cycle = under Const forever。说起来,你见过my latest creation吗?改进错误消息存在一些挑战,但我认为这已经很有趣了。
  • 是的,我看到了 dfeuer,这是一个很好的 coerce 和组合解决方案。此外,McBride 提供类型信息和其他被忽略的参数的想法是我迄今为止找到的最佳解决方案
  • @Iceland_jack,我自己的创新仅限于Similar 类;其他一切都是在别处发明的。顺便说一句,可以添加一个版本的 ala' 来传递一个有用的多态打包程序。我想我会补充一点....
猜你喜欢
  • 2015-08-06
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2017-09-28
  • 2015-12-24
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多