如果我有以下代数数据类型
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
功能,但无法正确使用。
您可以使用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
我不否认这一切都是正确的,作为对所问问题的一个很好的回答,我会在某种程度上质疑这个问题。作为Bool
,计算列表中的所有或
值是否都是
正确的
,有什么好处?它能让你做什么?一个答案是,它允许您从整个列表中删除Right
标记,将整个列表视为无错误。
一个信息更丰富的选项可能是构造某种类型的东西
[Either String Int] -> Either String [Int]
这样,您就可以获得所有未标记的
Int
s或与第一个讨厌的左
相关联的消息,而不仅仅是
True
或False
。
有一个标准函数可以做到这一点(以及其他许多事情)。它利用了这样一个事实,即列表是一种具有标准遍历模式的数据结构,
任一字符串
都编码了错误管理计算的概念,具有标准的失败和成功传播模式。这类人已经完成了艰苦的工作。你只需要说。。。
sequenceA
问题内容: 我有两个清单说 现在,我想找出List2中是否存在List1的所有元素。在这种情况下,就全部存在。我不能使用子集函数,因为我可以在列表中重复元素。我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中的出现次数。有一个更好的方法吗? 谢谢。 问题答案: 当出现次数无关紧要时,您仍可以通过动态创建集合来使用子集功能: 如果需要检查每个元素在第二个列表
问题内容: 如何检查列表中的元素是否属于同一类型,而又尽可能不检查每个元素? 例如,我想要一个函数来检查此列表中的每个元素是否为整数(显然是错误的): 问题答案: 尝试与结合使用: 您甚至可以根据需要检查多种类型: 并不是说这也会选择继承的类。例如: 如果您 需要 将自己限制为整数,可以使用。但这是 非常 罕见的情况。 您可以编写一个有趣的函数,如果所有其他元素都是同一类型,它将返回序列中第一个元
问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:
我有一个非常简单的界面类型如下 在我的单元测试中,我想检查从API调用返回的对象是否属于这种类型,但我不知道该怎么做。我的API调用如下: 但是,行
开始时,所有标志均为0。我使用while循环来检查是否至少有一个元素的标志为0: 如果返回,那么我将继续处理我的列表: 实际上,我想在迭代my_list时移除元素,但不允许在迭代时移除项。 由于我无法在迭代时删除元素,所以我发明了这些标志。但是包含许多项,循环在每个循环中读取所有项,这会消耗大量时间!你有什么建议吗?
问题内容: 我有3个表,每个表由称为用户名的列组成。在注册部分,我需要检查所请求的用户名是否是新的和唯一的。 在继续之前,我需要一个SQL来告诉我该用户是否存在于任何这些表中。我试过了: 那是路要走吗? 问题答案: