我得到了一个包含 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 中将列表转换为元组?,通常表明你不能。通常,当您有特定数量的元素(元组(时,您应该想知道如何处理它们。