Haskell Netwire:电线的电线

2024-02-04

我正在玩 netwire 包,试图了解 FRP,我有一个简单的问题。

从以下简单的电线开始,我能够每 5 秒(大约)发出一个事件

myWire :: (Monad m, HasTime t s) => Wire s () m a Float
myWire = timeF

myWire' :: (Monad m, HasTime t s) => Wire s () m a Int
myWire' = fmap round myWire

myEvent :: (Monad m, HasTime t s) => Wire s () m a (Event Int)
myEvent = periodic 5 . myWire'

这非常好且直接,但我接下来要做的是将生成的每个事件映射到一条线,然后我可以观看更新。我有一个累加器函数,如下所示:

eventList :: (Monad m, HasTime t s) 
            => Wire s () m a (Event [Wire s () m a Int])
eventList = accumE go [] . myEvent
  where go soFar x = f x : soFar
        f x = for 10 . pure x --> pure 0

然后我引入一根新的电线,它将抑制直到eventList开始触发事件,如下所示:

myList :: (Monad m, HasTime t s) => Wire s () m a [Wire s () m a Int]
myList = asSoonAs . eventList

所以我已经从事件转到包含电线列表的电线。最后,我引入一条线来步进每条线并生成结果列表:

myNums :: (Monad m, HasTime t s) => Wire s () m [Wire s () m a Int] [Int]
myNums = mkGen $ \dt wires -> do
  stepped <- mapM (\w -> stepWire w dt $ Right undefined) wires
  let alive = [ (r, w) | (Right r, w) <- stepped ]
  return (Right (map fst alive), myNums)

myNumList :: (Monad m, HasTime t s) => Wire s () m a [Int]
myNumList = myNums . myList

最后,我有一个主要的例程来测试它:

main = testWire clockSession_ myNumList

我期望看到的是一个不断增长的列表,其中列表中的每个元素将显示其创建时间 10 秒,之后该元素将显示零。相反,我得到的是越来越多的静态值列表。例如,我期望在几步之后看到的是

[0]
[5, 0]
[10, 5, 0]
[15, 10, 0, 0]

等等。我实际看到的是

[0]
[5, 0]
[10, 5, 0]
[15, 10, 5, 0]

所以我知道我的累加器功能正在工作:创建的每个事件都被转换为一条线。但我没有看到这些电线随着时间的推移发出不同的值。我的声明for 10 . pure x --> pure 0应该在时间过去后将它们切换为发射 0。

我对 FRP 还是新手,所以我可能从根本上误解了一些重要的事情(可能是这样。)


问题在于事件生成的连线不是持久的。类型的给定值Wire s e m a b实际上是一个时间实例产生类型值的函数b从类型值a。由于 Haskell 使用不可变值,为了步进连线,您必须对生成的连线进行一些操作stepWire否则,相同的输入会得到相同的输出。看一下结果myList:

Event 1: [for 10 . pure 0 --> pure 0]
Event 2: [for 10 . pure 5 --> pure 0, for 10 . pure 0 --> pure 0]
Event 3: [for 10 . pure 10 --> pure 0, for 10 . pure 5 --> pure 0, for 10 . pure 0 --> pure 0]
... etc

当你跨过这些电线时,你只会得到[.., 10, 5, 0]每次都是因为你重用了原始值for 10 . pure x --> pure 0金属丝。看一下签名stepWire:

stepWire :: Monad m => Wire s e m a b -> s -> Either e a -> m (Either e b, Wire s e m a b)

这意味着对于诸如这样的语句

(result, w') <- stepWire w dt (Right underfined)

... the w'应该在您下次需要调用时使用stepWire,因为它是下一个时间点的行为。如果您有一条可以生产电线的电线,那么您需要将生产的电线卸载到某个地方,以便可以单独处理它们。

对于(我相信)为您提供所需行为的程序,请参阅这段代码 https://gist.github.com/Mokosha/6a78c84a26971251c771.

$ ghc -o test test.hs
[1 of 1] Compiling Main             ( test.hs, test.o )
Linking test ...
$ ./test
[0]
[5,0]
[10,5,0]
[15,10,0,0]
[20,15,0,0,0]
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell Netwire:电线的电线 的相关文章

  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell:Data.Numbers.Primes 库在哪里?

    我尝试导入 Data Numbers Primes import Data Numbers Primes 伦哈斯克尔给了我 5 hs 1 8 Could not find module Data Numbers Primes Use v t
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现

随机推荐

  • 每种方法的 ASP.NET WebAPI 支持的媒体类型

    给定控制器中的一个方法 public class CustomerController ApiController HttpGet public CustomerDto GetById FromUri int id return custo
  • 关于 iPhone 的 Cocoa/Objective-C 命名约定的问题(关于发布和自动发布)

    您能否描述返回为调用者分配的对象 调用者应释放的对象 的方法与返回自动释放对象的方法之间的命名约定差异 返回保留对象 调用者应释放该对象 的方法应包含单词copy new mutableCopy or alloc 如在alloc init一
  • Apache DBUtils - 存储过程

    apache dbutils库是否可以调用oracle存储过程 Yes QueryRunner run JDBCConnectionFactory getQueryRunner database Connection conn run ge
  • phantomjs exit() 不会终止进程

    我在 Windows 7 上使用 phantom js 已经有一段时间了 我认为 v1 4 0 是我使用的第一个版本 一切都很好 但由于某种原因 当调用 phantom exit 时 该进程不再正确终止 我绝对不知道为什么 这个问题从v1
  • Javascript - 提升的优先级

    在提升中 变量优先于函数定义还是反之亦然 请看下面的代码 function a var x 10 function x return 20 return x 这不是一个优先于另一个的问题 存在优先级 但这在很大程度上只是语义问题 这里重要的
  • 禁用 Android 日期选择器中的特定日期

    我正在使用 datePicker 我可以通过以下代码禁用今天的最后几天和 30 天后的几天 DatePickerDialog datePicker new DatePickerDialog Calendar calender Calenda
  • 自定义属性错误 - Android Studio 1.2

    在我的 Android 项目中 我有几个使用自定义属性的自定义组件 attrs xml 文件如下所示
  • SAVON是否支持客户端证书认证

    我正在评估 savon 的消费 Web 服务 但我没有找到任何信息 如果我可以使用 SSL 客户端证书对提供 SOAP Web 服务的服务器进行身份验证 我阅读了文档但没有找到任何相关内容 有谁知道SAVON是否支持客户端证书认证 问候 法
  • WCF 客户端端点压缩

    我正在尝试使用 netTCP 端点为我们的 WCF 服务实现压缩 我已经阅读了几乎所有开发者网络帖子以及 SO 上的帖子 但无济于事 如何配置客户端端点CompressionFormat 参见压缩和二进制编码器 http msdn micr
  • 删除 csv 文件中的字段内引号

    假设我们有一个逗号分隔的文件 csv 如下所示 name of movie starring director release year dark knight rises christian bale anna hathaway chri
  • 如何取消PHP中的CURL时间限制?

    我正在运行一个相当长的脚本 它获取指定域的内容并解析 html 然后再对所述 html 运行一系列测试 无论如何 脚本在一段时间后超时 我尝试将其放在页面顶部 但仍然没有成功 set time limit 0 这是有问题的错误 cURL e
  • 在数组中存储2个不同的对象

    如何在数组中存储两个不同的对象 因此 当我有例如对象工人 姓名 年龄 工资单 时 另一个对象是计算机 价格 规格 我将这些对象存储在一个类中 class Record top 1 private Worker array w private
  • 为什么我们不能在 NSFetchedResultsController 中更改 FetchRequest?

    示例我在名为 FetchController 的 ListController 处调用了 NSFetchedResultsController NSFetchRequest fetchRequestInContext NSString en
  • 什么是 ^= 运算符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚在这里找到了一个答案 其中一个代码示例 我认为是java 使用了一个我以前从未见过的运算符 我搜索了 google 和 SO 但在其
  • “NaTType”对象没有属性“days”

    我的数据集中有一列代表以毫秒为单位的日期 有时它的值是nan 实际上我的专栏是类型str有时它的值是 nan 我想计算本专栏的纪元 以天为单位 问题是在计算两个日期的差异时 pd to datetime now pd to datetime
  • 使用 jQuery 将 div 附加到文档末尾?

    我想使用 jQuery 编写一个函数来附加div到网页的末尾 我希望能够在许多不同的页面上使用该功能 我写了下面的代码 但它不起作用 document append div div helloDiv html hello does noth
  • 街景进入信息窗口[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在信息窗口中显示街景视图 但我
  • 使用预先填充的意图插入联系人

    我正在尝试使用意图插入联系人 并且我尝试了这段代码 取自 Android Sdk 请参阅here http developer android com reference android provider ContactsContract
  • RichEdit 2.0 使用单个 CR 字符作为换行符会导致 SelStart 计算失败 (Delphi XE2)

    当从 Delphi 2006 过渡到 Delphi XE2 时 我们了解到的一件事是 RichEdit 2 0 在内部进行了替换CRLF与单个配对CR特点 这会带来不幸的结果 即放弃基于 VCL 端实际文本字符串的所有字符索引计算 通过跟踪
  • Haskell Netwire:电线的电线

    我正在玩 netwire 包 试图了解 FRP 我有一个简单的问题 从以下简单的电线开始 我能够每 5 秒 大约 发出一个事件 myWire Monad m HasTime t s gt Wire s m a Float myWire ti