如何解决haskell *> 排序运算符
我在回答我的问题时遇到了一个问题: haskell Either and Validation Applicative
我的代码发布在那里。
它涉及使用 *>
排序运算符而不是 <*>
应用运算符。
根据 https://hackage.haskell.org/package/base-4.15.0.0/docs/Control-Applicative.html#v:-42--62- 处的解释,我理解 *>
对动作进行排序,丢弃第一个参数的值。所以对于我的代码,我尝试了 fail6 = fail2 *> success
,它可以工作,但它不应该工作,因为第一个参数的值,即fail2,应该被丢弃。为什么 fail6
有效?
fail6
的输出是 Failure [MooglesChewedWires,StackOverflow]
。
解决方法
“丢弃结果”表示应用程序的结果。所以对于 Either
意味着 Right y
。 (*>)
因此等价于:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = liftA2 (const id) f g
或其他形式:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = (const id) <$> f <*> g
因此它运行两个操作并返回第二个结果,但这在“Applicative
上下文”中。
例如对于 Either
,实现如下:
instance Applicative (Either a) where
pure = Right
Left e <*> _ = Left e
_ <*> Left e = Left e
Right f <*> Right x = Right (f x)
这意味着 (*>)
是为 Either
实现的:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> Left x = Left x
Right _ *> Right x = Right x
或等价物:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> x = x
如果第一个操作数是Right …
,则返回第二个操作数,如果第一个操作数是Left x
,则返回Left x
。
“结果”是一个相当模糊的术语,不是吗?当我们谈论 Functor
、Applicative
和 Monad
时,我们倾向于在某种“上下文”中引用零个或多个值。所以
-
IO a
:I/O 计算产生一个a
类型的值。 -
[a]
:a
类型的零个或多个值的列表。 -
Maybe a
:零个或一个a
类型的元素。 -
Either e a
:就像Maybe a
一样,只是没有a
的情况是用e
类型的东西“装饰”的。 -
(x,a)
:a
类型的值“装饰”了x
类型之一。 -
Identity a
:类型为a
的值,没有任何上下文。
当您“丢弃结果”时,意味着您关心上下文,而不是值。所以:
- I/O 做了什么?
- 列表有多少个元素?
- 值是
Just
还是Nothing
? - 值是
Right
还是Left e
? - 装饰是什么?
- 没有信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。