刚开始使用Haskell,我试图找出基于单一条件分配多个变量的最佳方法。到目前为止,我一直在打包和打开元组。是否有更好/更惯用的方式?
(var1, var2, var3) =
if foo > 0
then ("Foo", "Bar", 3)
else ("Bar", "Baz", 1)
还对包装和拆开元组的成本感到好奇。如果我正确地阅读this,似乎这会在函数中得到优化,但不确定是否属于赋值。
答案 0 :(得分:6)
是的,这完全没问题。如果在启用优化的情况下进行编译,则元组确实会被“取消装箱”,因此它们不会产生额外费用。代码将变成类似这样的东西:
(# var1, var2, var3 #) =
case foo > 0 of
False -> (# "Bar", "Baz", 1 #)
True -> (# "Foo", "Bar", 3 #)
一个未装箱的3元组实际上只有三个值 - 它没有任何额外的结构。因此,它无法存储在数据结构中,但这没关系。当然,如果在编译时知道foo
,那么case
也会被优化掉,你只会得到三个定义。