如何将任一项元组转换为任性列表?



我得到了一个包含 Or 值的元组,

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

我怎样才能将其转换为

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

因为我想在列表中做左边并从中获取所有左值

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

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

这个问题与Either无关——你也可以问如何将一个字符元组转换为一个字符列表。

答案是:没有标准的方法可以做到这一点,但你可以只写一个lambda/自定义函数

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

你应该问自己为什么首先有这样的元组。大而均匀的元组看起来很腥;也许你应该在它的来源处建立一个列表。

奖励答案:如果您使用的是镜头,则可以使用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]

另一种可能性是依赖元组-同构-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的答案。

您可以将包含四个值的元组转换为包含四个值的列表,如下所示:

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

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

但是作为相反问题的答案,如何在 Haskell 中将列表转换为元组?,通常表明你不能。通常,当您有特定数量的元素(元组(时,您应该想知道如何处理它们。

最新更新