当前位置: 首页 > 知识库问答 >
问题:

如何检查,如果一个代数类型在Haskell列表中的所有元素?

慎建本
2023-03-14

如果我有以下代数数据类型

type MyVal = Either String Int

并且有一个包含MyVal类型元素的列表

ls = [Right 1, Right 2, Right 3]
xs = [Right 1, Left "error", Right 3]

现在,我想让write函数找出我的列表中所有的值都是‘Right’,然后它应该返回True,否则返回False。

ls的情况下,它将返回True;而对于xs的情况,它将返回False。

我该怎么做?

我试过使用all功能,但无法正确使用。

共有2个答案

轩辕瑞
2023-03-14

您可以使用isRight::a或b-

因此,您可以通过以下方式实现:

import Data.Either(isRight)

allRight :: Foldable f => f (Either a b) -> Bool
allRight = all isRight

这为我们提供了预期的输出:

Prelude Data.Either> allRight ls
True
Prelude Data.Either> allRight xs
False

轩辕亮
2023-03-14

我不否认这一切都是正确的,作为对所问问题的一个很好的回答,我会在某种程度上质疑这个问题。作为Bool,计算列表中的所有值是否都是正确的,有什么好处?它能让你做什么?一个答案是,它允许您从整个列表中删除Right标记,将整个列表视为无错误。

一个信息更丰富的选项可能是构造某种类型的东西

[Either String Int] -> Either String [Int]

这样,您就可以获得所有未标记的Ints或与第一个讨厌的相关联的消息,而不仅仅是TrueFalse

有一个标准函数可以做到这一点(以及其他许多事情)。它利用了这样一个事实,即列表是一种具有标准遍历模式的数据结构,任一字符串都编码了错误管理计算的概念,具有标准的失败和成功传播模式。这类人已经完成了艰苦的工作。你只需要说。。。

sequenceA

 类似资料:
  • 问题内容: 我有两个清单说 现在,我想找出List2中是否存在List1的所有元素。在这种情况下,就全部存在。我不能使用子集函数,因为我可以在列表中重复元素。我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中的出现次数。有一个更好的方法吗? 谢谢。 问题答案: 当出现次数无关紧要时,您仍可以通过动态创建集合来使用子集功能: 如果需要检查每个元素在第二个列表

  • 问题内容: 如何检查列表中的元素是否属于同一类型,而又尽可能不检查每个元素? 例如,我想要一个函数来检查此列表中的每个元素是否为整数(显然是错误的): 问题答案: 尝试与结合使用: 您甚至可以根据需要检查多种类型: 并不是说这也会选择继承的类。例如: 如果您 需要 将自己限制为整数,可以使用。但这是 非常 罕见的情况。 您可以编写一个有趣的函数,如果所有其他元素都是同一类型,它将返回序列中第一个元

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 我有一个非常简单的界面类型如下 在我的单元测试中,我想检查从API调用返回的对象是否属于这种类型,但我不知道该怎么做。我的API调用如下: 但是,行

  • 开始时,所有标志均为0。我使用while循环来检查是否至少有一个元素的标志为0: 如果返回,那么我将继续处理我的列表: 实际上,我想在迭代my_list时移除元素,但不允许在迭代时移除项。 由于我无法在迭代时删除元素,所以我发明了这些标志。但是包含许多项,循环在每个循环中读取所有项,这会消耗大量时间!你有什么建议吗?

  • 问题内容: 我有3个表,每个表由称为用户名的列组成。在注册部分,我需要检查所请求的用户名是否是新的和唯一的。 在继续之前,我需要一个SQL来告诉我该用户是否存在于任何这些表中。我试过了: 那是路要走吗? 问题答案: