如何将Eithers元组转换为Eithers列表?

时间:2018-06-19 13:02:48

标签: haskell

我有一个带有两个值的元组,

(Left "Error1", Right 1, Left "Error2", Right 2) 

如何将其转换为

[Left "Error1", Right 1, Left "Error2", Right 2]

因为我想在列表上做left并从中获取所有Left值

[Left "Error1", Right 1, Left "Error2", Right 2]

我在元组中有38个值,(Left "Error1", Right 1, Left "Error2", Right "NameString")可能只从元组中获得左值吗?

3 个答案:

答案 0 :(得分:7)

此问题与Either没有关系-您也可以问如何将一个元组字符转换为一个字符列表。

答案是:没有标准的方法可以执行此操作,但是您可以编写一个lambda /自定义函数

    \(a,b,c,d) -> [a,b,c,d]

您应该问自己一个问题,为什么首先要有这样的元组。大而同质的元组似乎很腥;也许您应该改为在其来源位置建立一个列表。

答案 1 :(得分:4)

奖励答案:如果您使用的是 lens ,则可以通过each遍历来实现。 each可以处理各种大小的元组,因为它依赖于具有实例的Each类。

GHCi> import Control.Lens
GHCi> toListOf each (Left "Error1", Right 1, Left "Error2", Right 2)
[Left "Error1",Right 1,Left "Error2",Right 2]

然而,另一种可能性是依靠tuples-homogenous-h98包提供的Foldable实例来获取同类元组。

GHCi> import Data.Foldable
GHCi> import Data.Tuple.Homogenous
GHCi> toList (Tuple4 (Left "Error1", Right 1, Left "Error2", Right 2))
[Left "Error1",Right 1,Left "Error2",Right 2]

除了题外话,我订阅leftaroundabout's answer

答案 2 :(得分:2)

您可以将其中具有正好四个值的元组转换为其中具有正好四个值的列表,如:

f :: (a, a, a, a) -> [a]
f (a1, a2, a3, a4) = [a1, a2, a3, a4]

然后您可以继续使用Data.Either中的lefts :: [Either a b] -> [a]

但是正如对相反问题How do I convert a list to a tuple in Haskell?的回答所暗示的那样,总的来说,你不能。通常,当您具有特定数量的元素(元组)时,您应该想知道具体如何处理它们。