- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定我是否理解 purescript-coroutines 中有一个 connect
和一个 pullFrom
函数的原因。 ,以及何时使用它们。看看这些类型,它们似乎已经习惯了改变“通信方向”(我不确定这是否是正确的思考方式)。
pullFrom :: forall o m a. MonadRec m => Consumer o m a -> Producer o m a -> Process m a
connect :: forall o f m a. (MonadRec m, Parallel f m) => Producer o m a -> Consumer o m a -> Process m a
所以如果我有一个消费者和一个生产者......
consumer :: forall e a. (Show a) => Consumer a (Eff (console :: CONSOLE | e)) Unit
consumer = forever do
s <- await
lift (log $ show s)
numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
where
go i = do emit i
go (i + 1)
对我来说,消费者可以从生产者那里获取数据是有意义的,如果我运行它,我可以看到显示的数字...
main = do
runProcess (pullFrom consumer numberProducer)
但是,如果我connect
生产者和消费者,它似乎什么也没做。我假设当您将生产者连接到消费者时,信号与 pullFrom
的方向相反,但我不确定这个想法是否正确。
main = do
runProcess (connect producer consumer)
最佳答案
好吧,这里面有一个有趣的小惊喜……不过我会在一分钟内谈到这一点。
pullFrom
的引入是为了让消费者在流程形成时“负责”- 只要消费者处于打开状态(等待输入),流程就会存在。
connect
只要生产者或消费者打开就运行,并且该过程仅在它们都完成时终止。
为了实现这一点,connect
有一个 Parallel
类约束,因为创建的进程同时依赖于消费者和生产者 - pullFrom
不需要这是因为该过程仅依赖于消费者
。
这就是“有趣”惊喜的来源 - 让我困惑了一分钟。 Eff
不是 Parallel
...那么您的代码如何工作?这是因为它正在为 main
推断这种类型:
main :: forall t. (Parallel t (Eff (console :: CONSOLE))) => Eff (console :: CONSOLE) Unit
所以当你的程序运行时没有任何反应,因为在 JS 中,main
期望为 Parallel
约束传递一个字典,然后是 Eff
进行评估。生成的对 main 的调用只是 Main.main();
,因此它从未实际评估 Eff
,因为它需要是 Main.main(impossibleParallelDictionary )();
.
尝试将此类型添加到您的main
:
main :: Eff (console :: CONSOLE) Unit
而且您会看到它不再进行类型检查。
尽管如此,您可以使用 Aff
,并且使用 Aff
时,connect
和 pullFrom
之间的区别是无法区分的对于这个例子:
import Prelude
import Control.Coroutine (Consumer, Producer, await, connect, emit, runProcess)
import Control.Monad.Aff (Aff, launchAff)
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Rec.Class (forever)
import Control.Monad.Trans.Class (lift)
consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = forever do
s <- await
lift (log $ show s)
numberProducer :: forall m. (Monad m) => Producer Int m Unit
numberProducer = go 0
where
go i = do emit i
go (i + 1)
main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)
如果我们稍微修改示例,我们可以看到差异的图示:
import Prelude
import Control.Coroutine (Consumer, Producer, await, emit, connect, runProcess)
import Control.Monad.Aff (Aff, launchAff, later')
import Control.Monad.Aff.Console (CONSOLE, log)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION)
import Control.Monad.Trans.Class (lift)
consumer :: forall e a. (Show a) => Consumer a (Aff (console :: CONSOLE | e)) Unit
consumer = do
s <- await
lift (log $ show s)
numberProducer :: forall eff. Producer Int (Aff eff) Unit
numberProducer = do
emit 0
lift $ later' 10000 $ pure unit
main :: Eff (err :: EXCEPTION, console :: CONSOLE) Unit
main = void $ launchAff $ runProcess (connect numberProducer consumer)
这样,程序将打印 0,等待 10 秒,然后退出。如果您将 connect numberProducer consumer
切换为 consumer `pullFrom` numberProducer
,程序将打印 0 并立即退出。
关于coroutine - purescript-coroutines 中的 `pullFrom` 和 `connect` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42725880/
来自 F# 世界,我习惯使用 |>将数据通过管道传输到函数中: [1..10] |> List.filter (fun n -> n % 2 = 0) |> List.map (fun n -> n
是否可以对 Purescript 中的类型构造函数施加某些限制?例如: newtype Name = Name String -- where length of String is > 5 最
我刚刚开始学习 Purescript,所以我希望这不是一个愚蠢的问题。 假设我们有一个对象 a = {x:1,y:2} 我们想要将 x 更改为等于 2。据我所知,如果我们使用 ST monad,我们将
我想知道如何在 PureScript 代码中添加注释。 在 Python 中,等价的是: # Here is a comment 或JavaScript // Another comment Pure
当在缩进位置使用三引号时,我肯定也会在输出 js 字符串中缩进: 在嵌套的 let 中比较这两个 let input1 = "T1\nX55.555Y-44.444\nX52.324Y-40.386"
PureScript by Example,在 The Eff Monad -> Handlers and Actions 部分指出“[效果]处理程序通常从集合中减去效果”。但是,这些示例相当不透明,
纯脚本列表中是否有 foreach 方法? foreach 方法获取列表的每一项并返回一个单位。 它是打印列表中每个项目的好方法。 编辑:我正在尝试下面建议的 traverse 方法,但出现错误 im
我首先是关于 Purescript 的。 我要将新字段添加到 Object 并将其作为函数参数发送。 但我找不到一个好的解决方案。 例如。 oldFiled = { title : "title",
我正在使用 Purescript 做第一步并复制 "hello world" app . 测试通过。我故意破坏了测试。 module Test.Main where import Prelude im
我是 Purescript 的新手,所以这可能是一个幼稚的问题。 我想编写一个 Purescript 函数,它从浏览器上的 HTML 输入元素读取输入,并将一些输出写入另一个 HTML 输入元素。 使
我想制作一个非常人性化的开发环境,我正在考虑使用 PureScript 来提供语言部分。我看到开箱即用,Show不适用于作为 Show 实例的事物的记录: log (show {a:5}) “试试 P
有没有办法做类似的事情 first = {x:0} second = {x:1,y:1} both = [first, second] 使得 both推断为 {x::Int | r}或类似的东西? 我
我正在使用 purescript-halogen,当捕获到子组件的消息时,我想滚动到 div 的底部。 但是,在 Halogen 中似乎不存在滚动 Action 控制。 那么,我该如何 Scroll
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
我有一个类型为 Either String (Either String Int) 的对象.我想将其折叠为 Either String Int 类型的对象. PureScript 中是否有为此提供的函
我想使用 Purescript 的 Halogen 编写前端的特定组件。 例如,我想使用卤素创建一个注册表单。它看起来像下面这样: module RegistrationForm where impo
这对我来说似乎是一个奇怪的问题,但我已经通过了 purescript-datetime和 purescript-js-date而我就是找不到获取当前信息的方法 DateTime .是否有一些隐藏的库函
当目标平台是 JavaScript 时,我正在寻找一种控制 Purescript 代码翻译格式的方法。 “spago bundle-app”为 ES5 版本生成 JavaScript 代码。 spag
我正在使用 purescript-halogen 构建类似电子表格的表格(类似于 Handsontable )。如果您双击一个单元格,一个 html 输入元素将呈现为相应表格单元格的子元素(并且不会为
我是一名优秀的程序员,十分优秀!