Alexander
можно ж шарить было сендбоксы
A64m
да, для этого и костыли были специальные, но не начинающему.
Alexander
ну да, у стека более человеческий апи и был и остаётся
A64m
тому надо и так 10 раз через обруч прыгнуть чтоб сендбокс заработал, а не из глобальной базы все было
Aliester
ну я уже с питоном и его пипами игрался
Aliester
там вообще экосистема фрагментирована и есть два бандлера, один из которых даже не трекает зависимости при удалении пакетов а также не имеет нормальных билд тулов, а второй для соентистов и тянет дофига ненужной мишуры
Alexander
ну тет хотя бы механизм внутри один
Alexander
*тут
Alexander
стек его правда руками немного по другому использует
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
и вообще как пользователи 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
согласен
Cheese
Alexander
неа
Alexander
cabal: failed to parse output of 'ghc-pkg dump'
Alexander
но видимо это кабало проблема и там надо что-то удалить и перекачать
Alexander
hvr писал
Alexander
ладно, пасиб, пойду чтоли пообедаю, потом продолжу этот бесмысленный бой
Cheese
Alexander
может старый кабал инсталл, там он чего-то намудрили и надо .cabal очищать
Зигохистоморфный
A64m
просто имплементировать список как АлгТД и все функции которые используются
Зигохистоморфный
Зигохистоморфный
ну хотябы то, что я сделал iterate не вышибает стек
Зигохистоморфный
это наивный порт с хаскелл + Control.Lazy
A64m
да, но он и без оптимизаций все равно быстрее чем в имплементациях где есть SMP
Зигохистоморфный
Зигохистоморфный
нужно походу эту штуку расширить для iterate https://github.com/paf31/purescript-lists-fast
Зигохистоморфный
например через трамполин подход