Alexander
можно ж шарить было сендбоксы
A64m
да, для этого и костыли были специальные, но не начинающему.
Alexander
ну да, у стека более человеческий апи и был и остаётся
A64m
тому надо и так 10 раз через обруч прыгнуть чтоб сендбокс заработал, а не из глобальной базы все было
Aliester
ну я уже с питоном и его пипами игрался
Aliester
там вообще экосистема фрагментирована и есть два бандлера, один из которых даже не трекает зависимости при удалении пакетов а также не имеет нормальных билд тулов, а второй для соентистов и тянет дофига ненужной мишуры
Alexander
ну тет хотя бы механизм внутри один
Alexander
*тут
Alexander
стек его правда руками немного по другому использует
Sergey
(надеюсь это была не контрольная в универе..)
Нет, это была не контрольная, это одна из домашек по ФП, я по-своему решил, если что) мне очень помогла функция repicateM за нее еще раз спасибо
Alexander
ну хоть по своему :)
Alexander
я там выше ошибся немного, у меня как-то так получилось: import Data.List import Control.Monad solve n = id $ length $ filter and $ filter (not.null) $ map (\t -> zipWith3 (\a b c -> not a || not b || c) t (drop 1 t) (drop 2 t)) $ replicateM n [True,False]
Alexander
вроде даже лишнего не должно аллоцироваться особо
Alexander
а не, аллоцирует :/
Alexander
на -O0
Sergey
я потом обязательно погляжу решение) потому что мое подлиннее вроде вышло) countSolution :: Int -> Int countSolution n | n < 3 = error "n must be >= 3" | otherwise = length [solve | solve <- replicateM n [True, False], isSolve solve] isSolve :: [Bool] -> Bool isSolve (x:y:z:xs) | null xs = boolResult | otherwise = boolResult && isSolve (y:z:xs) where boolResult = not x || not y || z я на haskell всего неделю прогаю, полегче только благодаря прологу)
A64m
ФЯ 90-х | comp | VM | t | | --------------------- | --------------- | ------ | | ghc 8.2.2 (O2) llvm 6 | stg ghc x64 | 7 | | clean | abc | 40 | | ocaml 4.04 flambda O3 | | 72 | против ФЯ 2010-х | idris 0.99 | | 54308 | | purescript 0.11.4 | node v7.10.0 V8 | 128369 |
A64m
поразительный прогресс в избегании успеха, конечно
Aleksey
а что за t ?
A64m
время в секундах
кана
количество секунд
кана
результат паразительный конечно
A64m
я когда начал разные имплементации ФЯ бенчмаркать, думал разница будет порядка три. К такому меня жизнь не готовила
sherzod
а что это за бенчмарк?
sherzod
в целом это же объяснимо (хотя нисколько не умаляет поразительности и грусти по этому поводу) пока есть возможность идём экстенсивным путём, это привело к смещению фокуса на архитектуру, простоту разработки, поддержки и масштабирования, и уходу фокуса с вычислительной эффективности. Теперь когда есть мощные компы. много памяти и гор. масштабирование, вычислительная эффективность - нишевая область определённых библиотек и движков.
Kir
Интересно, что окамл в 10 раз медленнее хаскелл оказался
A64m
Интересно, что окамл в 10 раз медленнее хаскелл оказался
во первых, там авторы библиотеки ленивых списков чего-то перемудрили, я писал "наивный" код который где-то в два раза быстрее. Во вторых фьюжена нету, но и без фьюжена хаскель будет 20, мои ленивые списки на окамле 40, разница в два раза остающаяся - простая имплементация ленивости в окамле против СТГ. Так что тут все понятно более-менее
A64m
с идрисом тоже понятно, там Lazy не записывает вычисления а перевычисляет всякий раз заново, так что там асимптотика хуже
A64m
но это не случай пурскрипта. там лази как в окамле, а не как в идрисе: exports.defer = function () { function Defer(thunk) { if (this instanceof Defer) { this.thunk = thunk; return this; } else { return new Defer(thunk); } } Defer.prototype.force = function () { var value = this.thunk(); this.thunk = null; this.force = function () { return value; }; return value; }; return Defer; }();
A64m
надо будет на пурскрипте наивную имплементацию написать
A64m
а что это за бенчмарк?
primes = 2:3:filter isPrime [5,7..] :: [Int] isPrime x = all (/= 0) . map (rem x) . takeWhile ((<= x) . (^2)) $ primes main = print . length . takeWhile (<= 2^24) $ primes
Konstantin
ох уж эти синтетические бенчмарки
A64m
у синтетического бенчмарка обычно как раз другие проблемы: для всех статтипизированных результаты одинаковые, си в три раза быстрее, скрипты в 10 раз медленее
A64m
тут ФЯ в разы и на порядки отличаются и главное обычно понятно почему
Alexander
как в этом вашем стеке сделать cabal init?
Cheese
я делаю так: > package.yaml
Alexander
sh-4.4$ cabal init cabal: Use of GHC's environment variable GHC_PACKAGE_PATH is incompatible with Cabal. Use the flag --package-db to specify a package database (it can be used multiple times).
Alexander
@cblp_su и что оно зависимости с все other-extensions оно за тебя заполняет:
Alexander
?
Cheese
нет, это stack init, наверное, делает
Cheese
зависимости я руками заполняю. зачем это автоматизировать?
Alexander
stack init ничего не делает
Alexander
оно ругается что stack init сделан выше
Alexander
зависимости я руками заполняю. зачем это автоматизировать?
за тем, что я не хочу руками выписывать все пакеты откуда у меня импортированы модули
Alexander
и я хочу это автоматизировать, руками я только если границы потом прописывать буду
Alexander
и вообще как пользователи hpack могут спрашивать зачем что-то автоматизировать
Alexander
если пользуешься системой, которая автоматизирует все подряд (типа exposed/other-modules выписывания), то вопрос почему кто-то хочет что-то автоматизировать возникать не должен
Alexander
хочет и все
Cheese
вообще, в stack script есть гадалка по пакетам, но не уверен, что они её вроде ещё не встроили в другие места
Cheese
а cabal init уже умеет гадать на пакетах?
Alexander
поидее stack exec --no-ghc-package-path -- cabal init should work
Alexander
гадать по пакетам? уже очень давно умеет смотреть в ghcpkg в из каких пакетов модуль
Alexander
и вставлять это в build-dependencies
Alexander
в общем-то это даже ghc умеет делать, т.к. ему это нужно чтобы ghci/ghc работало
Alexander
гадать на пакетах
Cheese
один модуль может быть в разных пакетах
Alexander
вспомни что делает ghc в этом случае
Cheese
у тебя локально есть список модулей со всего хакаджа?
Alexander
ты мне хочешь доказать что автоматизация плохо?
Alexander
не трать время
Alexander
я считаю, что хорошо, а corner cases я разрулю руками
Cheese
ок
Cheese
согласен
Alexander
неа
Alexander
cabal: failed to parse output of 'ghc-pkg dump'
Alexander
но видимо это кабало проблема и там надо что-то удалить и перекачать
Alexander
hvr писал
Alexander
ладно, пасиб, пойду чтоли пообедаю, потом продолжу этот бесмысленный бой
Cheese
cabal: failed to parse output of 'ghc-pkg dump'
что-то не так с версиями?
Alexander
может старый кабал инсталл, там он чего-то намудрили и надо .cabal очищать
Зигохистоморфный
A64m
просто имплементировать список как АлгТД и все функции которые используются
Зигохистоморфный
Зигохистоморфный
ну хотябы то, что я сделал iterate не вышибает стек
Зигохистоморфный
это наивный порт с хаскелл + Control.Lazy
A64m
да, но он и без оптимизаций все равно быстрее чем в имплементациях где есть SMP
Зигохистоморфный
нужно походу эту штуку расширить для iterate https://github.com/paf31/purescript-lists-fast
Зигохистоморфный
например через трамполин подход