Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种类似于Python的Haskell的iterable解包方法?_Python_Haskell_Iterable Unpacking - Fatal编程技术网

是否有一种类似于Python的Haskell的iterable解包方法?

是否有一种类似于Python的Haskell的iterable解包方法?,python,haskell,iterable-unpacking,Python,Haskell,Iterable Unpacking,我想知道是否有可能从Haskell中的一组事物中创建变量。当我搜索它时,我发现了它,但我无法根据我的情况调整它。也许这是不可能的,或者因为我是初学者,所以错过了一些东西。基本上,我想知道这样的事情在Haskell是否可行: >>>列表中的列表=[[1,2,3],[4,5,6],[7,8,9]] >>>a,b,c=列表中的列表 >>>版画 [1, 2, 3] 当列表正好有三个元素时,luqui给出的答案有效。但是,它是局部的,这意味着对于任何其他大小的列表,它在运行时都会失败 我认为,更惯用的Ha

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

>>>列表中的列表=[[1,2,3],[4,5,6],[7,8,9]] >>>a,b,c=列表中的列表 >>>版画 [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]

您可以将其解压,例如,让[a,b,c]=[1,2,3],[4,5,6],[7,8,9]]在a中。然而,它并没有什么特别之处,就像在Python中一样,它是简单的模式匹配。对于大多数可折叠文件,如Tree,Maybe等,您可以使用toList。它被称为并与列表一起使用,它适用于许多数据类型。实际上,我确信我的列表将正好有3个元素,因此在这种情况下不会产生任何问题。但我也在想,如果名单的大小不详,我该怎么办。所以这肯定会有帮助,谢谢你的澄清@Asocia如果你确定你有三个元素,一个三元组,将是一个比列表更好的类型。因为它们通常是异构的,所以当用作异构容器时,它们提供的功能远不如列表方便。事实上,我倾向于说元组只应该在将两个未知的、可能是不同类型的元素组合在一起时使用。老实说,列出清单可能是最明智的解决方案。当然,某种类型的保证会很好,但是Haskell不是一种完整的语言,而且通常是不可行的。虽然如果IsString类有一个额外的Nat参数,它实际上应该是可行的。@leftaroundabout可以定义数据Triple a=Triple a,然后……或者使用库参数,例如。
*Q62157846> fmap (\(a, _, _) -> a) $ listToTriple [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Just [1,2,3]