是否有类似Python的Haskell可迭代解包方式?

问题描述 投票:0回答:2

我想知道是否有可能从Haskell中的可迭代事物创建变量。我在搜索this时发现了它,但无法适应我的情况。也许这是不可能的,或者因为我是初学者,所以我错过了一些东西。基本上,我想知道在Haskell中是否可以进行这样的操作:

>>> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a, b, c = list_of_lists
>>> print(a)
[1, 2, 3]
python haskell iterable-unpacking
2个回答
6
投票
ghci> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ghci> [a,b,c] = list_of_lists
ghci> print a
[1,2,3]

2
投票

luqui给出的答案仅在列表中包含三个元素时有效。但是,它是部分的,这意味着它将在运行时针对任何其他大小的列表失败。

我认为,Haskell更惯用的解决方案将是这样的功能:

listToTriple :: [a] -> Maybe (a, a, a)
listToTriple [a, b, c] = Just (a, b, c)
listToTriple _ = Nothing

您可以用任意长度的列表安全地调用它:

*Q62157846> listToTriple [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Just ([1,2,3],[4,5,6],[7,8,9])
*Q62157846> listToTriple [[1, 2, 3], [4, 5, 6]]
Nothing
*Q62157846> listToTriple [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
Nothing

如果在第一种情况下,您只想要这三个列表中的第一个,则可以在三元组上进行模式匹配:

*Q62157846> fmap (\(a, _, _) -> a) $ listToTriple [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Just [1,2,3]
© www.soinside.com 2019 - 2024. All rights reserved.