Haskell 哈斯克尔*>;排序运算符
我对我的问题的答复提出了一个问题: 我的代码贴在那里 它涉及使用Haskell 哈斯克尔*>;排序运算符,haskell,sequencing,Haskell,Sequencing,我对我的问题的答复提出了一个问题: 我的代码贴在那里 它涉及使用*>排序运算符而不是应用运算符 根据上的解释,我理解*>对操作进行排序,丢弃第一个参数的值。因此,对于我的代码,我尝试了fail6=fail2*>success,这是可行的,但它不应该起作用,因为第一个参数fail2的值应该被丢弃。为什么fail6起作用 fail6的输出是Failure[MooglesChewedWires,StackOverflow],带有“放弃结果”,表示应用程序的结果。所以对于或者这意味着右y(*>)相当于
*>
排序运算符而不是
应用运算符
根据上的解释,我理解*>
对操作进行排序,丢弃第一个参数的值。因此,对于我的代码,我尝试了fail6=fail2*>success
,这是可行的,但它不应该起作用,因为第一个参数fail2的值应该被丢弃。为什么fail6
起作用
fail6
的输出是Failure[MooglesChewedWires,StackOverflow]
,带有“放弃结果”,表示应用程序的结果。所以对于或者这意味着右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
因此,这意味着(*>)
针对或实现为:
-- (*>) 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
如果第一个操作数因此是一个右…
,它将返回第二个操作数,如果第一个操作数是左x
,它将返回左x
,“结果”是一个很模糊的术语,不是吗?当我们谈论函子
、应用程序
和单子
时,我们倾向于在某种“上下文”中引用零个或多个值。所以
IO a
:产生a
类型值的I/O计算
[a]
:类型为a
的零个或多个值的列表
可能是a
:类型为a
的零个或一个元素
ea
:就像可能是a
一样,除了noa
s的箱子是用e
类型的东西“装饰”的
(x,a)
:类型为a
的值用类型为x
的值“修饰”
标识a
:类型为a
的值,无任何上下文
当您“放弃结果”时,这意味着您关心的是上下文,而不是值。因此:
- I/O做了什么
- 这个列表有多少个元素
- 值是
只是
什么还是什么都没有
- 值是
右
还是左
- 装饰是什么
- 没有消息
值为yes,但对于或,这意味着将丢弃右x
。如果fail2
导致左y
,那么这就是结果。因此如果fail2
失败,那么这将是fail6
的结果:发生的错误。@WillemVanOnsem,谢谢,您的意思是在这种情况下第一个参数的值实际上是success
的值吗,哪个等价于或的右侧
?
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> x = x