Haskell – 应用程序中的效果顺序确定性?

栏目: 编程语言 · 发布时间: 6年前

内容简介:http://stackoverflow.com/questions/14259195/haskell-is-effect-order-deterministic-in-case-of-applicative
当执行由someFun<$>定义的IO操作时(a :: IO())<

$> (b :: IO()),是执行a和b操作的顺序吗?也就是说,我可以指望在b之前执行a.

对于GHC,我可以看到IO是使用State实现的,也可以看到 here 是一个应用实例,但找不到实际实例声明的来源.通过州实施表明,不同的IO效应需要是顺序的,但并不是必须的.

在GHCi玩耍似乎应用保留效果顺序,但是有一些普遍的保证,还是GHC具体?我会对细节感兴趣

import System.Time
import Control.Concurrent
import Data.Traversable
let prec (TOD a b) = b
fmap (map prec) (sequenceA $replicate 5 (threadDelay 1000 >> getClockTime))

[641934000000,642934000000,643934000000,644934000000,645934000000]

谢谢!

肯定是肯定的.对于任何具体的实例,它总是会做同样的事情.然而,没有任何固有的原因从左到右从左到右选择效果的顺序.

不过从 the documentation for Applicative

If f is also a Monad , it should satisfy pure = return and (<*>) = ap (which implies that pure and <*> satisfy the applicative functor laws).

ap的定义是这个,来自Control.Monad:

ap :: (Monad m) => m (a -> b) -> m a -> m b
ap =  liftM2 id

而LiftM2是以明显的方式定义的:

liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

这意味着,对于任何一个Monad以及一个应用程序的函子,预期(通过规范,由于这不能在代码中执行),该应用程序将从左到右工作,以便liftM2中的do块与liftA2 fxy = f $相同. x *年.

由于上述原因,即使对于没有相应的Monad的应用实例,按照惯例,效果通常是从左到右排列的.

更广泛地说,由于应用计算的结构必然与“效应”无关,您通常可以独立于应用效果如何 排序 来分析程序的含义.例如,如果[]的实例被更改为从右到左的顺序,则使用它的任何代码将给出相同的结果,只是与不同顺序的列表元素.

http://stackoverflow.com/questions/14259195/haskell-is-effect-order-deterministic-in-case-of-applicative


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

未来是湿的

未来是湿的

[美] 克莱·舍基 / 胡泳、沈满琳 / 中国人民大学出版社 / 2009-5 / 39.80

一位妇女丢掉了手机,但征召了一群志愿者将其从盗窃者手中夺回。一个旅客在乘坐飞机时领受恶劣服务,她通过自己的博客发动了一场全民运动。在伦敦地铁爆炸案和印度洋海啸中,公民们用可拍照手机提供了比摄影记者更完备的记录。世界上最大的百科全书是由管理甚少的参与者们撰写的…… 不论在何处,你都能看见人们走到一起彼此分享,共同工作,或是发起某种公共行动。一部集众人之力的百科全书、一个丢失手机的传奇,这些事情......一起来看看 《未来是湿的》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码