-
2023-09-26 Казань. Митап по функциональному программированию в Казани Регистрация
Темы:
— про software transactional memory (STM) и том, какие проблемы она решает;
— как работать с иммутабельными данными удобно и без боли.
2023-09-26 Казань. Митап по функциональному программированию в Казани Регистрация
Темы:
— про software transactional memory (STM) и том, какие проблемы она решает;
— как работать с иммутабельными данными удобно и без боли.
Надеюсь, что теперь эта специальная олимпиада затихнет, потому что код-победитель только на ~20% уступает простой записи нулей в /dev/null.
При ближайшем рассмотрении, задача оказалась на скорость вывода в stdout, т.е. так как вход у неё довольно маленький (~10K элементов), то парсить практически всё равно как -- на любом языке из использовавшихся.
После понимания этого, задача сводится к эффективной буферизации вывода и размышлениям, почему же нигде не работает стандартная буферизация --- по идее, она должна делать именно
Require Import Coq.Arith.Arith. | |
Require Import Coq.Lists.List. | |
Import ListNotations. | |
Lemma forw_rev_list_ind {A} | |
(P : list A -> Prop) | |
(Pnil : P []) | |
(Psingle : (forall a, P [a])) | |
(Pmore : (forall a b, forall xs, P xs -> P ([a] ++ xs ++ [b]))) | |
(xs : list A) |
Приближается, пожалуй, самое значительное нововведение в хаскеле, со времен FC и превращения хаскеля из ML++ в недоΩmega: модули. Весь этот тектонический сдвиг, правда, остается незамеченным. Даже в Release notes об этом не упомянуто. Есть, только упоминание в руководстве пользователя Также, описания новой системы модулей можно найти на странице Backpack, но установить что из этого уже имплементировано можно только опытным путем.
Представление о ML-модулях можно составить из диссертации Дрейера (pdf)
{-# LANGUAGE OverloadedStrings #-} | |
-- | | |
-- author: Alexander V Vershilov <[email protected]> | |
-- | |
-- Module provides simple and extensible paginator widget that doesn't make any | |
-- assumptions on Route structure or type of page handling and doesn't load entities | |
-- that are not needed. | |
-- | |
-- Basic usage | |
-- |
gauss :: [[Double]] -> [Double] | |
gauss m = let (m',is) = gauss0 m | |
in order is $ gauss2 $ gauss1 m | |
gauss0 :: [[Double]] -> ([[Double]],[Int]) | |
gauss0 m = let ( mt,is) = foldr choose (trns m,straight) straight | |
in (trns mt,is) | |
where choose k (mt,is) = let row = m !! (k-1) | |
q = (+) 1 $ fromJust $ elemIndex (maximum $ init $ drop (k-1) row) row | |
in (swap' k q mt, swap' k q is) |