为了账号安全,请及时绑定邮箱和手机立即绑定

什么是Haskell的流融合

什么是Haskell的流融合

慕斯709654 2019-12-25 14:44:51
什么是Haskell的Stream Fusion,该如何使用?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

Logan指向的论文很棒,但是有点困难。(只问我的学生。)“流融合的工作原理”也很重要,而“流融合是什么以及如何使用它”只是很小一部分。


流融合解决的问题是,编写的功能代码经常分配中间列表,例如,为了创建节点号的无限列表,您可能会编写


nodenames = map ("n"++) $ map show [1..]

天真的代码会分配一个无限的整数列表[1, 2, 3, ...],一个无限的字符串列表["1", "2", "3", ...],最后是一个无限的名称列表["n1", "n2", "n3", ...]。分配太多了。


流融合的作用是将类似的定义nodenames转换为使用递归函数的定义,该递归函数仅分配结果所需的内容。通常,消除中间列表的分配称为砍伐森林。


要使用流融合,您需要编写非递归列表函数,这些函数使用GHC票务915(map,foldr等)中描述的流融合库中的函数,而不是显式递归。该库包含所有Prelude函数的新版本,这些函数已被重写以利用流融合。显然,这些内容将使它成为下一个GHC版本(6.12)的组成部分,但不在当前的稳定版本(6.10)中。如果您想使用库,Porges的回答中有一个很好的简单解释。


如果您实际上想要解释流融合的工作原理,请提出另一个问题-但这要困难得多。


查看完整回答
反对 回复 2019-12-25
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

据我所知,与诺曼所说的相反,流融合目前不是在GHC的基础上实现的(即,您不能仅使用Prelude函数)。有关更多信息,请参见GHC票务915。


要使用流融合,您需要安装流融合库,导入Data.List.Stream(也可以导入Control.Monad.Stream),并且仅使用该模块中的函数而不是Prelude函数。这意味着导入Prelude隐藏所有默认列表函数,而不使用[x..y]构造或列表推导。


查看完整回答
反对 回复 2019-12-25
?
森栏

TA贡献1810条经验 获得超5个赞

是不是正确的,当GHC在6.12中默认使用这些新函数时,它们也将以非递归方式实现[x..y]并列出理解吗?因为它们不是正确的行,唯一的原因是它们是内部的,不是真正用Haskell编写的,而是出于速度和/或因为您无法重新定义该语法而更像关键字。


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 416 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信