首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我们谈论Monad的时候(一)

先前我某群提到,从Optional(也就是Haskell的Maybe)理解Monad会是一个很不错的方式。...之后,用Haskell作为过渡,最后讲讲理论相关的内容。而第一篇作为工程部分,自然用的是大家最喜欢的Java主要是我最喜欢来讲解了。...Monad是层数很高的抽象 Runnable一样,Monad是一个功能的抽象。Java,我们可以用接口类来描述它。就像你说Thread是Runnable一样,我们也同样可以说XX类是Monad。...不光如此,join函数,我们还可以很简单的构造出flatMap函数。...下一篇文章,我将简单介绍HaskellMonad实现与一些有趣的Monad,作为过渡。再下一篇,我将从理论角度(主要是范畴论)介绍Monad

39810
您找到你想要的搜索结果了吗?
是的
没有找到

【DB笔试面试595】Oracle,IO CalibrationDOP什么关系

♣ 题目部分 Oracle,I/O CalibrationDOP什么关系?...当PARALLEL_DEGREE_POLICY被设置为AUTO时,Oracle数据库将会基于执行计划操作的成本硬件特性来判断是否使用并行。...如果一个PARALLEL Hint语句级被使用,那么无论PARALLEL_DEGREE_POLICY的值设置成什么,自动并行度都将被开启。...若使用了DOP,则可以执行计划的Note部分可以看到类似于“automatic DOP: Computed Degree of Parallelism is 2”的信息。...如果是使用ASM来管理数据库文件,那么就是指存储数据的磁盘组,那么只有存储数据的磁盘组的物理磁盘作为num_disks变量值,不包含FRA磁盘组的物理磁盘。

67330

什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

一个特殊幺元,能够任何元素组合,导致的结果是不改变这些元素。 函子到底是什么? 一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...image.png fmap的输入参数是a->b函数我们这个案例是(+3),然后定义一个函子Functor,这里是Haskell的Just 2,最后返回一个新的函子,我们案例,使用Haskell...image.png 图中范畴C1范畴C2之间映射关系,C1Int映射到C2的List[Int],C1String映射到C2的List[String]。...Haskell,函子是在其上可以map over的东西。稍微一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...Haskell这类的强类型语言中,我们甚至可以组装自己的Tuple Monad

4.1K30

Kotlin版图解Functor、Applicative与Monad

但是 fmap 怎么知道如何应用该函数的呢? 究竟什么是 Functor 呢? Haskell Functor 是一个类型类。 其定义如下: ?...Applicative 定义了 (*)( Haskell 是 ),它知道如何将一个 包装在上下文中的 函数应用到一个 包装在上下文中的 值上: ?...然后把它扔掉,因为本节你并不需要! Monad 增加了一个新的转变。 Functor 将一个函数应用到一个已包装的值上: ?...Monad 一个函数 ))=( Haskell 是 >>=,读作“绑定”)来做这个。 让我们来看个示例。 老搭档 Maybe 是一个 monad: ?... Kotlin ,可以认为 Monad 是一种定义了这样中缀函数的类型: infix fun Monad.`))=`(f: ((T) -> Monad)): Monad<R

1.2K20

Monadic Function_Haskell笔记12

并且对于遵守Functor lawsMonad laws的类型,这两个函数是完全等价的,例如: > liftM (+1) (Just 1) Just 2 > fmap (+1) (Just 1) Just...) 我们知道liftA2(直到liftA3),用来应对“多参”函数: liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA3...可以用join函数join :: Monad m => m (m a) -> m a 试玩一下: > join (Just (Just 1)) Just 1 > join Nothing Nothing...> join (Just (Just (Just 1))) Just (Just 1) 注意,类型上要求内层外层的Monad相同(都是m),所以join (Just [1])之类的是无法正常工作的...的k就是id,所以仅原样取出内层Maybe值 P.S.另外,一个有趣的东西: m >>= f = join (fmap f m) 也就是说>>=等价于用转换函数(f :: a -> m b)对monadic

90030

Monad_Haskell笔记10

P.S.关于computation context的详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算的另一个场景:怎样把一个具有context的函数应用到具有...context的值 (>>=) :: (Monad m) => m a -> (a -> m b) -> m b 如果你一个具有context的值m a,你能如何把他丢进一个只接受普通值a的函数,并回传一个具有...Just 1 >>=登场: > Just 1 >>= \x -> Just (x + 1) Just 2 三者的关联 从接口行为来看,这三个东西都是围绕具有context的值函数搞事情(即,context...>=>相当于Monad函数之间的组合运算(monadic function),这些函数输入普通值,输出monadic值。...因为applicative functor并不允许applicative value之间弹性的交互 这,怎么理解?

70650

Monad来得更猛烈些吧_Haskell笔记11

Monad实现来看,从左侧取出值a附加信息w,将右侧函数应用到a上,并从结果取出值b附加信息w',结果值为b,附加信息为w `mappend` w',最后用return包装结果返回m类型的值,作为...其中,共享环境指的是Maintaining variable bindings,即do block里的每一个monadic value,都共享这个大函数的参数,function之间传值的含义类似于“取出他们未来的值...P.S.能够从共享环境读取值,这也是称之为Reader Monad的原因 三.State Monad 除日志追踪、共享环境外,还有一类最常见的问题是状态维护 然而,一些领域的问题根本上就是依赖于随着时间而改变的状态...这让我们 Haskell 可以容易地处理状态性的问题,并让其他部份的程序还是保持纯粹性。...五.Monad的魅力 Monad能够赋予计算一些额外的能力,比如: Writer Monad:能够把函数转换成带日志的版本,用来追踪执行过程,或者给数据变换添加额外的信息 Reader Monad:能够让一系列函数一个可控的共享环境协同工作

1.5K40

深入理解函数式编程(下)

实际函数式编程语言实现,Maybe确实只是一个类型(称为代数类型),具体的一个值具体类型Just或Nothing,就像数字可以分为有理数无理数一样。...现在,如果我们一个单子叫IO,并且它有如下表现: 图 64 我们把这种类型的Monad称为IO,我们IO处理打印(副作用)。...关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高的领域重要的应用,像LispHaskell就是因上一波人工智能热而火起来的,后来也一些特殊的领域(银行、水利、航空航天等...你仍然可以.then函数写纯粹的函数,也可以.then函数调用其他的Promise,这就和IO Monad的行为非常像。...相比于面向对象,这种方式组合上更方便简洁,更容易把复杂度降低,比如面向对象可能对象之间的相互引用调用是没有限制的,这种模式带来的是思考逻辑的时候思维会发散。

89230

深入理解函数式编程(下)

实际函数式编程语言实现,Maybe确实只是一个类型(称为代数类型),具体的一个值具体类型Just或Nothing,就像数字可以分为有理数无理数一样。...现在,如果我们一个单子叫IO,并且它有如下表现: 我们把这种类型的Monad称为IO,我们IO处理打印(副作用)。...关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高的领域重要的应用,像LispHaskell就是因上一波人工智能热而火起来的,后来也一些特殊的领域(银行、水利、航空航天等...你仍然可以.then函数写纯粹的函数,也可以.then函数调用其他的Promise,这就和IO Monad的行为非常像。...相比于面向对象,这种方式组合上更方便简洁,更容易把复杂度降低,比如面向对象可能对象之间的相互引用调用是没有限制的,这种模式带来的是思考逻辑的时候思维会发散。

43710

不可变的状态

在这个简单的例子,这样的处理似乎没有什么问题,因为只有 labelTree 修改 i,但是,如果放在一个更加复杂的场景,这样做是很大风险的。...但是,共享可变变量的实现还有一个灵活之处,就是它可以很方便地获取修改状态,例如,在给多棵树打连续的标签的过程,我们可能需要在两棵树之间隔开一个标签,也就是说我们想在给一棵树打上标签后先令标签 +...前面提到了,副作用并不止是修改变量一种,它还包括读写文件、读入用户输入、控制台打印输出等等,总之,一个函数如果除了接收参数返回结果之外做了任何事情,它都产生了副作用。...只不过 IO 所管理的状态不是一个变量而是程序与整个世界之间交互的所有 IO 操作。 Haskell ,IO Monad 是一个基础的 Monad 6。...但在 Haskell ,并没有这样的方法,唯一能运行的方式是通过 main 运行,而 main 函数的类型就是 IO (),这样就保证了 Haskell 的「纯」。

97020

铁定不纯的IO_Haskell笔记5

写在前面 一直个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...Haskell的做法其实类似于React的componentDidMount()等组件生命周期函数,React建议(道德约束)保持render()是纯函数,带有副作用的操作挪到componentDidMount...圈定不纯环境类似于async function,I/O Action只能出现在do语句块,这一点类似于await P.S.实际上,执行I/O Action3种方式: 绑定给main时,作为入口函数...IO (FilePath, Handle) -- 定义System.Directory模块,用来删除指定文件 removeFile :: FilePath -> IO () -- 定义System.Directory...模块,用来重命名指定文件 renameFile :: FilePath -> FilePath -> IO () 注意,其中removeFilerenameFile都是System.Directory

1.3K30

来看看几种 Monad来看看几种 Monad

但的确每个 monad 都是 applicative functor,即使 Monad 并没有这么声明。 Monad typeclass 定义的第一个函数是 return。...因为 applicative functor 并不允许 applicative value 之间弹性的交互。他们最多就是让我们可以用 applicative style 来传递参数给函数。...do 表示法 Monad Haskell 是十分重要的,所以我们还特别为了操作他设置了特别的语法:do 表示法。...至于 do 表示法模式匹配失败的话,那就会调用 fail 函数。他定义 Monad 的 type class 定义猪。...Haskell 允许任何型态是任何 type class 的 instance。但他不会检查单子律是否被遵守,所以如果我们要写一个 Monad 的 instance,那最好我们确定他遵守单子律。

98720

【DB笔试面试592】Oracle,表之间的关联方式哪几种?

♣ 题目部分 Oracle,表之间的关联方式哪几种?...对于Oracle 6提供的群集连接(Cluster JoinOracle 8提供的索引连接(Index Join),本书不做介绍。...Oracle数据库中有一个隐含参数“_OPTIMIZER_SORTMERGE_JOIN_ENABLED”控制着SMJ的启用关闭,该参数默认值是TRUE,表示启用SMJ连接。...嵌套循环连接,Oracle读取驱动表(外部表)的每一行,然后在被驱动表(内部表)检查是否匹配的行,所有被匹配的行都被放到结果集中,然后处理驱动表的下一行。...Oracle数据库中有一个隐含参数“_HASH_JOIN_ENABLED”控制着HJ的启用关闭,该参数默认值是TRUE,表示启用HJ连接。

2.1K10

实现TypeScript运行时类型检查

我们将异常像数据一样由函数返回, 类似于Golang 的错误处理方式.但直接通过union type进行抽象一个弊端: 我们将难以分辨解析器返回的数据是属于成功分支的A呢, 还是失败分支的E呢?..., 这个上下文既是"可能成功的异步返回值".得力于这种抽象, 我们可以摆脱call back hell对状态的手动断言(GoLang 的r, err := f()).让我们思考一下, 其实上文中提到的..., 一个常用的函数 -- pipe, compose函数与其类似, 不同之处在于函数的组合顺序:pipe(f1, f2, f3);等价于:compose(f3, f2, f1);即, pipe 是从左到右结合..., 本节中会化一些篇幅对其推导, 最终将改抽象对应到Haskell 的sequenceA函数.为了Either[] => Either的转换逻辑更加清晰, 我们不妨声明一个...Applicative f =>是Haskell 的类型约束, 余下篇幅中会对其重点讲解, 可以暂时对其忽略.即, Haskell 已经我们所需要的类型转行的抽象, 函数名为sequenceA.我们先记下有

2.4K30
领券