Назначение нескольких переменных на Haskell

только начало работы в Haskell, и я пытаюсь найти лучший способ назначить несколько переменных на основе одного условия. До сих пор я только собирал и распаковывал кортежи. Есть ли лучший / более идиоматический способ?

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

также любопытно о стоимости упаковки и распаковки кортежей. Если я читаю этой правильно, похоже, что это оптимизируется в функциях, но не уверен, что это так с назначением.

1 ответов


Да, это прекрасно. Если вы компилируете с включенной оптимизацией, кортежи действительно будут "распакованы", поэтому они не несут никаких дополнительных затрат. Код будет преобразован во что-то вроде этого:

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

распакованный 3-Кортеж на самом деле всего три значения-он не имеет какой-либо дополнительной структуры. В результате он не может быть сохранен в структуре данных, но это нормально. Конечно, если foo известно во время компиляции,case будет оптимизировано прочь тоже, и вы просто получите три определения.