Size: a a a

2021 January 06

к

кана in Haskell
Alexander Smirnov
Можно попробовать print (b :: [Int])
такое я пробовал, не отпимизирует
источник

к

кана in Haskell
источник

NI

Nick Ivanych in Haskell
Kirill Valyavin
Если определить на топлевеле с конкретным типом, то должно мемоизироваться
Не обязательно на топлевеле.
Достаточно, чтоб было в одной и той же области видимости для всех тех мест, что будут это использовать.
Ну и отсутствие всяких прагм строгости по умолчанию.
источник

IO

I O in Haskell
Maxim Koltsov
я думаю с оптимизацией он сначала специализирует полиморфное, а потом уже мемоизирует как обычное
Там не специализация, там простое cse. Причем оно не только в мейне вызовы джойнит, но и например b с c на топлевеле, так что даже первый вызов c не дает трейса. С -fno-cse все встает на свои места.
источник

IO

I O in Haskell
Maxim Koltsov
я думаю с оптимизацией он сначала специализирует полиморфное, а потом уже мемоизирует как обычное
источник

MK

Maxim Koltsov in Haskell
интересно, спасибо
источник

MK

Maxim Koltsov in Haskell
в итоге получилось иллюcтрация взаимодействия unsafe perform io с CSE
источник

IO

I O in Haskell
C c :: () -> [Int] кстати все не так просто как мне казалось. Я сначала заменил там [1..5], которое в примере @kana_sama было, на [1,2], чтобы вывода поменьше было, и тогда трейс действительно только один раз вычислялся, но если написать [1..2] станет вычисляться дважды. Насколько я понял из кора, при [1,2] гхц выносит на топлевел _1 = trace "1" 1; _2 = trace "2" 2 и работает уже с ними, а с [1..2] ничего такого не происходит, c инлайнится дважды, на топлевеле получаются две(!) копии c (cse отключен поэтому их не соединяет), каждая из которых трейсит. C NOINLINE все опять меморизуется. Так что да, мораль - бойтесь unsafePerformIO
источник

к

кана in Haskell
в моем случае я так понимаю выносится на топлевел [traceShowId i | i <- [1..5]] целиком
источник
2021 January 07

IO

I O in Haskell
Там что при компрехеншене, что при фмапе на топлевеле в итогe получаеться идентичный код типа

c_worker = ...
c_body = c_worker 1#
c = \() -> c_body


Но при компрехеншене принты в мейне будут сразу делать show c_body, а при фмапе похоже каждый принт инлайнит c еще до того как появился c_body, и уже от каждой этой копии получиться своя копия воркера. Так что тут дело именно в инлайне, версия с фмапом похоже достаточно дешевая чтобы гхц заинлайнил сразу, а компрехеншен нет.
источник

IO

I O in Haskell
В принципе какая разница, в real-world все равно будет cse, который все починит сломает приведет в полный хаос
источник

A

Aleksandr Khristenko in Haskell
Jerzy Syrowiecki
без проекта и песочниц промежуточные файлы складываются в ~/.cabal независимо от конфигурации, поэтому разные конфигурации мешают друг другу
Разве мешают? Там же сделали nix style билды. Когда пакет определяется параметрами сборки и исходниками. Поэтому разные версии сосуществуют и шарятся просто. Поэтому и песочницы больше не нужны.
источник

DB

Danil Braun in Haskell
А есть чатик русскоязычный отдельно для nix/nixos?
источник

С

Сергей in Haskell
Danil Braun
А есть чатик русскоязычный отдельно для nix/nixos?
источник

DB

Danil Braun in Haskell
Сергей благодарочка
источник

G

GNU/Vsevolod in Haskell
Почему в prelude нету flip (.) в виде оператора, если есть <&> в Data.Functor (base), к примеру?
источник

G

GNU/Vsevolod in Haskell
Вернее, есть в Control.Arrow, но приоритет там аж 9 (
источник

AS

Alexander Smirnov in Haskell
Потому что прелюдия невкусная
источник

AS

Alexander Smirnov in Haskell
Там ничего нет
источник

С

Сергей in Haskell
источник