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