• code Haskell stg
    f = {} \n {} ->
        let v = {} \n {} -> ...
        in case v of
            _ -> v
    
    Что-то у меня приступ идиотизма. Я правильно понимаю, что в данном случае v настолько реэнтерантно, что вычисляется два раза: один раз в case'е, а второй раз где-то на стороне получателя значения функции?

Replies (2)

  • @ndtimofeev, \n же. Сколько раз вызвано, столько и вычислится.
    Хотя мне кажется, что такой код не должен генериться ни при каких условиях.
  • @rkit, Почему не должен? Вдруг внутри кусок ввода-вывода? На самом деле я сейчас пытаюсь понять когда нужно аллоцировать объекты алгебраических типов, а когда можно просто снять значения их поля со стека аргументов и передать их в следующее продолжение. Пока выходит что значения можно вообще не аллоцировать: значения обновляемых замыканий будут размещены в куче в процессе обновления, а прочие нужно размещать в куче только при связывание значения с паттерном-переменной. Но в этом случае аллокацию можно наверное изобразить уже после case'а.