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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有类似Python的Haskell可迭代解包方式?相关的知识,希望对你有一定的参考价值。

我想知道是否有可能从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]
答案
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]

以上是关于是否有类似Python的Haskell可迭代解包方式?的主要内容,如果未能解决你的问题,请参考以下文章

Common Lisp:在 first、rest、last 中解构列表(如 Python 可迭代解包)

Python中的解包用法

是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?

Python中的参数解包:`*`表达式和`**`表达式

条件循环及其它语句

Python