haskell *> 排序运算符

haskell *> sequencing operator

我对我的问题的回答有一个问题:

我的代码发布在那里。

它涉及使用 *> 排序运算符而不是 <*> 应用运算符。

根据 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,Whosebug]

discard the result是指一个applicative的结果。所以对于 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

它因此运行了两个操作,return 是第二个结果,但这是在“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 …,它将return第二个操作数,如果第一个操作数是Left x,它将return[=23] =].

“结果”是一个相当模糊的术语,不是吗?当我们谈论 FunctorApplicativeMonad 时,我们倾向于在某种“上下文”中指代零个或多个值。所以

  • 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
  • 装修是什么?
  • 没有信息。