Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
在Haskell中分配多个变量_Haskell_Iterable Unpacking - Fatal编程技术网

在Haskell中分配多个变量

在Haskell中分配多个变量,haskell,iterable-unpacking,Haskell,Iterable Unpacking,刚开始学习Haskell,我正试图找出基于单个条件分配多个变量的最佳方法。到目前为止,我一直在打包和解包元组。有更好/更惯用的方法吗 (var1, var2, var3) = if foo > 0 then ("Foo", "Bar", 3) else ("Bar", "Baz", 1) 还对包装和解包元组的成本感到好奇。如果我读得正确,这似乎在函数中得到了优化,但不确定赋值是否如此。是的,这很好。如果在启用优化的情况下编译,元组实际上会被“取消

刚开始学习Haskell,我正试图找出基于单个条件分配多个变量的最佳方法。到目前为止,我一直在打包和解包元组。有更好/更惯用的方法吗

(var1, var2, var3) = 
    if foo > 0
        then ("Foo", "Bar", 3)
        else ("Bar", "Baz", 1)

还对包装和解包元组的成本感到好奇。如果我读得正确,这似乎在函数中得到了优化,但不确定赋值是否如此。

是的,这很好。如果在启用优化的情况下编译,元组实际上会被“取消绑定”,因此不会产生额外的成本。代码将被转换成如下模糊形式:

(# var1, var2, var3 #) = 
    case foo > 0 of
        False -> (# "Bar", "Baz", 1 #)
        True -> (# "Foo", "Bar", 3 #)

一个未装箱的三元组实际上只是三个值,它没有任何额外的结构。因此,它不能存储在数据结构中,但这没关系。当然,如果编译时知道
foo
,那么
case
也将被优化,您将得到三个定义。

您也可以使用列表,正如您所知。您甚至可以使用
(a:b:c:rest)=[1,2,3,4,5,6]
,其中
a=1
b=2
c=3
,以及
rest=[4,5,6]
,在更大的块中对其进行模式匹配。此外,这仅在
let
where
语句中是必需的,而不是在基本表达式级别。您的代码看起来很好,我不会担心成本,除非分析指出了这一点。另外,如果您担心这个元组,您不想知道
“Bar”
在运行时是如何表示的…;-)