有没有像 Python 那样的 Haskell 等效的可迭代拆包方式?
Is there a Haskell equivalent way of iterable unpacking like in Python?
我想知道是否可以从 Haskell 中的可迭代事物创建变量。我在搜索时找到了 ,但无法根据我的情况进行调整。也许这是不可能的,或者因为我是初学者,所以我错过了一些东西。基本上,我想知道在 Haskell:
中是否可能出现这样的事情
>>> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a, b, c = list_of_lists
>>> print(a)
[1, 2, 3]
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]
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]
我想知道是否可以从 Haskell 中的可迭代事物创建变量。我在搜索时找到了
>>> list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a, b, c = list_of_lists
>>> print(a)
[1, 2, 3]
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]
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]