gpt4 book ai didi

Haskell - 在 Applicative 的情况下,效果顺序是否确定?

转载 作者:行者123 更新时间:2023-12-02 01:32:11 24 4
gpt4 key购买 nike

执行 someFun <$> (a :: IO ()) <$> (b :: IO ()) 定义的 IO Action 时, 是 a 的执行和 b下令采取的行动?也就是说,我可以指望 ab 之前执行是?

对于 GHC,我可以看到 IO 是使用 State 实现的,另见 here它是一个 Applicative 实例,但找不到实际实例声明的来源。通过 State 实现表明不同的 IO 效果需要是顺序的,但不需要定义它们的顺序。

在 GHCi 中玩耍似乎 Appliative 保留了效果顺序,但这是一些普遍的保证,还是 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 的仿函数以及 Applicative ,预计(根据规范,因为这不能在代码中强制执行), Applicative将从左到右工作,因此 do阻止 liftM2liftA2 f x y = f <$> x <*> y 做同样的事情.

由于上述原因,即使对于 Applicative没有对应 Monad 的实例,按照惯例,效果通常也是从左到右排序的。

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

关于Haskell - 在 Applicative 的情况下,效果顺序是否确定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com