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
    一样,除了no
    a
    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