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

>>=穷人并发单子的实现

池俊茂
2023-03-14
import Control.Monad

data Concurrent a = Concurrent ((a -> Action) -> Action)

data Action 
    = Atom (IO Action)
    | Fork Action Action
    | Stop

instance Monad Concurrent where
    (Concurrent ma) >>= f = Concurrent (\x -> ma(\y -> "Something return a Action")) 
    return x = Concurrent (\c -> c x)

共有1个答案

梁福
2023-03-14

您要查找的定义如下所示

Concurrent h >>= k  =  Concurrent (\f -> h (\x -> runConcurrent (k x) f))

我们怎么到那儿的?像往常一样,我们让类型做工作。:)

让我们首先介绍一个helper函数:

runConcurrent                 :: Concurrent b -> (b -> Action) -> Action
runConcurrent (Concurrent h)  =  h
Concurrent h >>= k  =  ...
Concurrent h >>= k = Concurrent ...
Concurrent h >>= k  =  Concurrent (\f -> ...)
Concurrent h >>= k  =  Concurrent (\f -> h ...)

因此,接下来我们需要为h提供一个类型为a->action的参数。这又是一个函数类型,所以我们再加入一个λ:

Concurrent h >>= k  =  Concurrent (\f -> h (\x -> ...))

因此,我们有X::a,并且需要构造action类型的主体。我们可以用a类型的值做什么?我们可以将它提供给函数k。这为我们提供了一个concurrent b类型的值,然后我们可以将该值传递给帮助器函数runconcurrent:

Concurrent h >>= k  =  Concurrent (\f -> h (\x -> runConcurrent (k x) ...))

这为我们提供了一个(b->Action)->Action类型的函数,并提供f作为参数来完成以下工作:

Concurrent h >>= k  =  Concurrent (\f -> h (\x -> runConcurrent (k x) f))
 类似资料:
  • 本文向大家介绍java实现单人版五子棋游戏,包括了java实现单人版五子棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 效果图: 以上所述就是本文的全部内容了,希望能够对大家熟练掌握java有所帮助。

  • 本文向大家介绍SpringBoot 并发登录人数控制的实现方法,包括了SpringBoot 并发登录人数控制的实现方法的使用技巧和注意事项,需要的朋友参考一下 通常系统都会限制同一个账号的登录人数,多人登录要么限制后者登录,要么踢出前者,Spring Security 提供了这样的功能,本文讲解一下在没有使用Security的时候如何手动实现这个功能 demo 技术选型 SpringBoot JW

  • 我有一个关于使用“永远”类型的穷举开关/情况的问题。 比如说,我有一组字符串:{a,B}(字符串可以是任意长的单词,而且集合本身可能非常大),对于每个子集(比如{},{a,B}),我想创建一个函数:show:Set= 预发伪代码: 是否有可能在编译时保证show函数中包含所有可能的子集?所以把C加到集合{A,B,C}需要我扩充show函数吗?并为{C}、{A,C}、{B,C}和{A,B,C}添加案

  • 问题内容: 经典的单元测试基本上只是将x放入并期望y放入,并使该过程自动化。因此,这对于测试 不涉及时间的 任何事物都是有益的。但是,然后,我遇到的大多数不重要的错误都与计时有关。线程破坏彼此的数据,或导致死锁。不确定性行为的发生率高达百万分之一。辛苦的东西。 对于多线程并发系统的“单元测试”部分,有什么有用的东西吗?这样的测试如何工作?是否有必要长时间运行这种测试的主题并以某种巧妙的方式改变环境

  • Subversion 中的分支、标记和合并 虽然很多开发团队都使用版本控制系统管理代码变更,但当多个开发人员并行地使用不同的代码库进行编码时,还是会出现问题的。在本期的 让开发自动化 中,自动化专家 Paul Duvall 展示了如何运用开源的、免费的 Subversion 版本控制系统来有效地进行标记、分支和合并。 说到源代码分支,可以将大多数的软件开发团队大致划分为两大阵营:有些是根本不分支;

  • 本文向大家介绍Android开发实现SubMenu选项菜单和子菜单示例,包括了Android开发实现SubMenu选项菜单和子菜单示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发实现SubMenu选项菜单和子菜单。分享给大家供大家参考,具体如下: 简介: SubMenu:代表一个子菜单,包含1~N个MenuItem 实现效果: 具体实现方法: 主活动 MainActi