haskell *> 排序运算符

如何解决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
  • 装饰是什么?
  • 没有信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?