to post messages and comments.

← All posts tagged ?

Вот в телеграмме есть broadcast каналы, а есть какие-нибудь хорошие автоматизированные решения для feedback-а? А то может туда проще чем в жуйки писать, но без обратной связи это ж бесполезно

давно не было haskell тут:

MAIN = go (replicate 100000000 1)
where
go [] = return ()
go xs0 =
let ~(xs, ys) = span (>0) xs0
in do print $ foldl' (+) 0 xs
go ys

вот такая программа, если запустить её прибивает OOM Killer.
меняем $ на $! и она работает в constant space.

Просмотр stg показывает совсем мало разницы, в падающем случае unboxed tuple возвращаемый span снова боксится:

let blabla = case GHC.List.$wspan lvl1_r71d wild_s71y of _ [Occ=Dead] {
(#,#) ww1_s71D [Occ=Once] ww2_s71E [Occ=Once] ->
(,) [ww1_s71D ww2_s71E];

в обычном просто дальше идёт код.

Так же в падающем варианте идёт ещё одна аллокация:

let {
sat_s71M [Occ=Once, Dmd=<L,1*U>] :: GHC.Base.String
[LclId, Str=DmdType] =
\s srt:SRT:[r2vu :-> GHC.Show.$w$cshowsPrec3, r71e :-> go_r71e] []
case ds1_s71B of _ [Occ=Dead] {
(,) xs_s71G [Occ=Once] _ [Occ=Dead] ->
... бла-бла-бла тут развернутый fold и show

я понимаю почему падающий жрёт больше, но я не понимаю почему это не больше на какой-то множитель, почему ничего не освободжается.

Жуйк а расскажи ситуацию на рынке с умночасами и умнобраслетами.

Чего хотелось бы:
1. треккинг всяких бесполезных активитей, вроде количества шагов, пульса и сна и прочего, если есть всякие бесплатные бонусы вроде сожженых калорий то плюс.
2. пинание меня если я слишком долго сижу на месте
3. waterproof желательно, т.к. есть желание брать с собой в походы, а там есть небольшой шанс неожиданно оказаться в середине речки, и water-resist может при этом кончиться.
4. время жизни от батарейки является плюсом, т.е. если я буду брать в походы, то это ~2 недели без возможности подзарядки и синхронизации.
5. всякие вещи типа уведомления от телефона полезны, но только если можно точно настраивать список приложений.
6. плееры, магазины и прочие приложения наверное не нужны. (хотя если с учетом 1-5 будет ещё и приложения для ингресса/покемонов, то будет интересно).

Ну и вообще какие есть в дополнение вышеописанному характеристики, на которые нужно смотреть?

<rubber-duck-mode>
А как бы задавать неявные методы для решения ОДЕ, так чтобы пользователь мог задать стратегию решения?
После размышления, у меня ощущение, что если в явном методе я могу возвращать (в простом случае без доп структуры):
phi :: x -> f x -> f x
то для неявного я должен писать:
phi :: x -> (f x, f x) -> f x

где теперь мне на вход подается начальная координата и первое приближение, и в ответ я выдаю набор следующих координат. Вроде в этом случае вся свобода, которая должна быть остается в руках у пользователя, можно и начальное приближение удобным способом выбирать, и решать хочется ли fixed point или newton iteration или вообще заанролить метод на нужную глубину.
</rubber-duck-mode>

А как в этом вашем питоне делается расширяемая функциональность, вот например, в этом нашем haskell делается класс типов, в котором перечислены функции, которые должны быть реализованы для типа (упрощенно), потом в разных модулях можно это реализовать причем уже для существующих и для новых типов и для тех которые не я писал.

Как мне что-то похожее в питонах замутить правильным образом?

Т.е. сейчас есть метод, в котором пачка if isinstance(val, ...):
мне нужно сделать это расширяемым, т.е. чтобы а. можно было не свалку в одном файле делать, а как-то расширяемо, б, чтобы юзер мог добавлять свои типы.

В есть например у меня

newtype Foo m a = Foo { runFoo :: ReaderT Q m a }

он является MonadTrans и в нём легко лифтить все вещи. Но при этом реально в проекте используется

type FooM a = Foo ConcreteMonad a

чтобы выполнять действия ConcreteMonad я могу воспользоваться lift. Все нормально, но при этом создание полиморфного стека немного напрягает, т.к. огорчает inliner. А если я
сделаю

newtype FooM a = FooM { runFooM :: ReaderT Q ConcreteMonad a }

то уже у меня не будет lift и или придётся воодить класс для действий ConcreteMonad или делать liftConcreteMonad, а и то и то печально, что делать-то?

Есть
data Foo =
A1 :: forall x . TVar (Either E x) -> ...
A2 :: forall x . TVar (Either E x) -> ...
...

во всех конструкторах есть Either E, у меня есть метод который процессит это Foo, каким бы образом вытащить из него tvar так чтобы туда можно было положить Left E, и не важно какой там x?

Кто-то ведь уже делал тут такую штуку?
есть GADT вида:

data Foo reply where
C1 :: Param1 -> Param2 -> Foo Reply1
C2 :: Param2 -> Param1 -> Foo Reply2
...

есть фунции вида:
handleC1 :: Param1 -> Param2 -> IO Reply1

хочется как-то подешевле в терминах бойлерплейта прицепить эти хэндлеры к C1? Ещё было бы прикольно подешевле их вызывать. Как?

А какие можно найти дешевые IPC и вообще средства для следующего (задачи разные):
1. пнуть другой процесс чтобы посмотрел, чтобы забрал данные (**)
2. заметить, что родительский процесс помер (***)
3. заметить, что дочерний процесс помер (*)

(*) я знаю что для 3 я могу делать waitpid, но я ленивая сволочь и скорее всего double-fork сделаю, чтобы PID 1 за мной подметал.
(**) сейчас там поллинг, но мне не нравится, что висящий и ничего не делающий процесс жрёт CPU
(***) сейчас там polling get_ppid что мне тоже нифига не нравится