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

,

“结果”是一个相当模糊的术语,不是吗?当我们谈论 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
  • 装饰是什么?
  • 没有信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...