当前位置: 首页 > 知识库问答 >
问题:

流融合是如何在Haskell工作的?

范峰
2023-03-14

我可以在Haskell中编写受流融合影响的自己的地图函数吗?

为什么列表上的递归迭代不需要融合?这完全破坏了Haskell模式匹配的良好表达能力:foo(x:xx)...

前奏循环功能融合了吗?

共有1个答案

南门志
2023-03-14

Haskell中的流融合是使用重写规则完成的(有关更多信息,请参阅ghc文档)。这些规则可以使用rulespragma在代码中指定。

rewirte规则的基本思想是,指定一组在编译时重写代码的方法(例如,如果您将map自己的版本定义map'),则可以执行以下操作:

{-# RULES 
   "map'/map'" forall f g xs. map' f (map' g xs) = map' (f . g) xs
  #-}

这将引入一个称为map'/map'的重写规则。这个规则的作用是,它将把函数f在一个列表上的每个映射重写为(f.g)在一些xs上映射的单个映射。

使用重写规则还有许多进一步的子特性。例如,您可以指定在编译器的哪个阶段应用规则,而编译器没有方法检查这些规则是否正确。

重写结果仍然是typechecked的,但是如果您在重写规则中做了语义错误的事情,那完全是您的责任。

 类似资料:
  • 我觉得我的知识的函数式编程是有点缺乏所以我决定看看网上并按照教程得到更好的当我凸轮通过它的状态在第一页 “假设您有一个不可变的数字列表xs=[1,2,3,4,5,6,7,8]和一个函数doubleMe,该函数将每个元素乘以2,然后返回一个新列表。如果我们想用命令式语言将列表乘以8,并执行doubleMe(doubleMe(xs)))),它可能会通过列表一次,复制一份,然后返回。然后,它将再次通过列

  • 我很难理解窗口在Kafka Streams中是如何工作的。到目前为止,结果似乎与我所阅读和理解的不一致。 我已经创建了一个带有支持主题的KSQL流。KSQL SELECT语句中的“列”之一已被指定为该主题的TIMESTAMP。 my-stream主题中的记录按键(PARTITION_KEY)分组,并用跳转窗口窗口 记录通过 然后我通过 组中的第一个窗口转换为7:00-7:05 当我通过控制台消费者

  • 我目前正在撰写硕士论文,涉及使用Drools Fusion来处理来自多个XML文件流的事件(因此我将每个文件“重放”为一个流)。这些文件记录的是一场足球比赛,比赛中球员身上安装了GPS传感器,监测他们的加速度和速度,以及球员负荷等其他信息。 每个XML文件都包含事件实例,声明ID、开始时间、结束时间和代码,如下所示: 我有9个这样的文件,它们都需要同时处理,并将这些事件同时输入到引擎中。我当前的实

  • 问题内容: 我对Node.js流有疑问-特别是它们在概念上如何工作。 不缺少有关如何使用流的文档。但是我很难找到流在数据级别如何工作。 我对Web通信HTTP的有限理解是,来回发送完整的数据“包”。类似于个人订购公司目录,客户端向服务器发送GET(目录)请求,然后服务器以目录进行响应。浏览器不会收到目录的页面,而是会收到整本书。 节点流可能是多部分消息吗? 我喜欢REST模型- 尤其是它是无状态的

  • 我在网上搜索了很多,但我没有找到任何明确的答案。到目前为止,我的理解是: < li >消费者手动为每个提供者编写合同(也许他们为合同添加了版本控制?) < li >消费者与提供商共享合同 < li >提供商使用Spring Cloud Contract Verifier依赖项和插件来生成几个测试文件 < li >提供商针对其服务运行测试文件并生成测试结果 < li >提供程序通过运行测试生成单个存