在Haskell中分配多个变量

时间:2015-01-25 17:35:56

标签: haskell iterable-unpacking

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

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

还对包装和拆开元组的成本感到好奇。如果我正确地阅读this,似乎这会在函数中得到优化,但不确定是否属于赋值。

1 个答案:

答案 0 :(得分:6)

是的,这完全没问题。如果在启用优化的情况下进行编译,则元组确实会被“取消装箱”,因此它们不会产生额外费用。代码将变成类似这样的东西:

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

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