为什么此适用实例不合法?

德米特里

我在阅读有关Monad变压器的文章,发现这篇看似广为人知的文章-Monad Transformers的温和介绍引起我注意的是作者在其中描述了一个临时ExceptT变压器的适用实例,但留下警告说该实例不合法。

这是代码:

data EitherIO e a = EitherIO {
    runEitherIO :: IO (Either e a)
}

instance Functor (EitherIO e) where
    fmap f = EitherIO . fmap (fmap f) . runEitherIO

instance Applicative (EitherIO e) where
    pure    = EitherIO . return . Right
    f <*> x = EitherIO $
        liftA2 (<*>)
            (runEitherIO f)
            (runEitherIO x)

和警告:

警告:非常有远见的读者向我指出,这种适用性实例是非法的。具体地说,它无条件地执行了右侧的副作用。对合法实例的期望是,只有在左侧操作成功的情况下,才应执行右侧的副作用。

我假设具体是实施<*>的问题。

因此,我的主要问题是:该实例不符合哪些法律?

据我所知,这四个适用法则都得到了满足(我当然可能错了)。作者说,问题在于,<*>即使左侧操作不成功(我假设“成功操作”也意味着IO),也会执行右侧的副作用(我假设位于的右侧Right执行时将产生一个值)。

从使用的角度来看,虽然我认为这很有意义,但仍然可以从中看出哪些法律不完全符合要求以及为什么不符合要求。

另外,为什么实例不合法的解释提到了副作用,这使得推理类型仅适用于IO monad?但是,在本文的最后,作为最后的一步,我们将IO monad更改为常规monad,并使其成为所描述数据类型的参数。这就引出了另一个问题:如果我们想象自己是在写这个monad转换器,那么我需要运用什么样的推理才能注意到所描述的应用实例确实是非法的,而无需诉诸于可能是特定的monad的情况。用这个变压器吗?

卢基

Applicative实例是合法的。实际上,它与是相同的实例可应用函子的组成是可应用的(这是应用程序具有单子所没有的很好的东西之一)。Compose IO (Either e)

但是,文档的“法律”部分也列出了以下内容

如果f也是Monad,则应满足

pure = return
(<*>) = ap
(*>) = (>>)

这就是问题所在,因为不可能存在与给定应用程序相对应的monad(这是有关RHS有条件执行的注释开始起作用的地方)。因此,ApplicativeMonad实例虽然彼此独立,但都是合法的,但他们不同意,因此应处以死刑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有名称[spring_web]多于一个的片段被发现。这是不合法的相对排序

将日期字符串解析为java.util.Date时,模式字符'T'不合法

Visual Studio 2017错误:无法启动程序,操作在当前状态下不合法

ggplot2如何处理“类不合法的数据”错误?

为什么引用数组不合法?

为什么此语句仅适用于WHERE?

为什么以下注释在Java中合法但在Groovy中不合法?

C#中的不合法正则表达式

为什么在C#中这不合法?

为什么此循环模板实例合法?

为什么无法解决此HasField实例?

为什么整数类型int64_t不保留此合法值?

即使此转换不合法,为什么std :: is_convertible_v返回true?

错误:稀疏逻辑矩阵的“'不合法'的参数”

为什么这些定义在C语言中不合法?

错误C2601:“ main”:本地函数定义不合法-MS VS 2013编译器

为什么此代码适用于不同类型?

为什么此代码不适用于svg元素?

评估者中的表达不合法(违反访问行为)

使用C ++的extern C是否可以避免在C中合法但在C ++中不合法的未定义行为?

JPGraph错误,地块比例不合法

即使创建INSTEAD OF UPDATE TRIGGER,更新视图也不合法

为什么此过渡属性不适用于 css?

OpenFileDialog 错误:“路径不合法”

为什么不合并对象?

为什么此查询不适用于指定的日期?

嵌套参数扩展:为什么 ${foo%"$bar"} 合法,而 ${$bar} 不合法?

不能使用局部函數。不合法的識別符

Oracle:Gettin 錯誤 ORA-01732:此視圖上的數據操作操作不合法