ЭТО БЛОГ НБРК

ДБРО ПОЖА В МОЙ БЛОГ . ТУТ Я ПУБЛ ВСЯК РАЗН ЗПСИ И ЗМТК О ПРОГ , ЯЗКЕ ИЛИ ДАЖЕ О ЖИЗН . В ОСНО ДЛЯ СЕБЯ , ЧТОБ ПТОМ СМТР ИЗ БУДЩ .

НЕКТ МОИ ТЕХН ПРОЭ ЕСТЬ НА ГТХБ , И ТУТ Я ИНГД ПУБЛ ПРОЧ ИДЕИ ИЛИ ДОП ТЕОР ДОКИ ПО НИМ . В НАСТ МОМТ Я ИССЛ ВОЕН ИГРЫ И КОМП СИМУ .

КСТА , ОЧЕН МНОГ ХОРШ СЛОВ УМЕЩ ВСГО В ЧТРЕ СИМВ , НАПР UNIX, СИ++ ИЛИ НБРК .

Аппликативный комонадический (анти)контекст: ComonadApply

Типы Предположим, что мы программируем некую компьютерную симуляцию и решили выделить следующие типы в нашей программе: Тип, моделирующий внутреннее состояние сущности (допустим, юнита в компьютерной игрей): data Unit = Unit { _unitName :: String , _unitPosition :: L.V2 Double } Тип, моделирующий более абстрактную, внешнюю (например, административную) информацию, присущую вообще всем объектам симуляции: data Object s = forall d . Object { _objectId :: Int , _objectState :: s , _objectIntelDB :: [d] -- , .
ЧТАТ ПОЛН →

Свободная монада для функтора или изоляция сайд-эффектов в программе

На основе англоязычной статьи Gabriel Gonzalez. Предположим, что мы написали простейшую компьютерную программу, делающую некий ввод-вывод (т.е. имеющую сайд-эффекты): module Main where import Data.Char (toUpper) import System.Exit (exitSuccess) main = do x <- getLine putStrLn (map toUpper x) putStrLn "Finished" exitSuccess Всё бы ничего, но данный код смешивает “чистую” логику (не имеющую сторонних эффектов чистую трансформацию строки в верхний регистр: строка -> СТРОКА) и “грязный” ввод-вывод с терминала (имеющий сторонние эффекты вроде ожидания клавиатурного ввода, разрыв терминальной линии и т.
ЧТАТ ПОЛН →

Эффективный, оптимальный, типизированный diff между данными произвольного типа

Глубокие теоретико-математические основания и лаконичный синтаксис Haskell делают этот язык одним из наиболее совершенных средств осмысления и составления компьютерных программ за всю историю кибернетики. В данной короткой заметке мы воспользуемся пакетами для Обобщённого Программирования (Generic Programming) и покажем, как можно получать разницу (diff) между данными некоторого типа, а также накладывать эту разницу (patch) для получения эндоморфизма типа. Задача Положим, мы имеем следующий тип автомобилей: data Color = White | Black data Car = Car { carMaker :: String , carColor :: Color , carPrice :: Int } Наша задача состоит в получении разницы (диффа, дельты) между двумя автомобилями, белым “Volvo” и чёрным “BMW”:
ЧТАТ ПОЛН →

Haskell: Применение паттерна MVC для программ с GTK+

Введение В данной заметке мы исследуем один из способов структурирования на Haskell графических программ (GTK3) архитектурным паттерном Model-View-Controller. Для этих целей мы будем применять пакет mvc и Haskell-биндинги к GTK3 gi-gtk. Поскольку поток выполнения любой GTK+ программы обычно (после инициализации, настройки коллбэков, и т.д.) рано или поздно входит в бесконечный библиотечный цикл gtk_main(), нам придётся что-то придумать для одновременного применения графической подсистемы вместе с пакетом mvc. Любой GUI является лишь частью некоторой программы, но не наоборот, поэтому мы считаем запуск и выполнение MVC более общим и первичным, а GTK+ – вторичным и потому запускаемым и выполняемым “внутри” нашей архитектуры MVC.
ЧТАТ ПОЛН →

mvc: архитектурный паттерн Model-View-Controller в Haskell

Для Haskell существует замечательная библиотека mvc, реализующая архитектуру Model-View-Controller для проектирования многопоточных программ. Библиотека построена на базе поточных процессоров pipes, async и других известных абстракций. ![/img/500px-MVC-Process.svg.png) В данной заметке мы познакомимся с mvc и спроектируем простенькую графическую программу на SDL. Компоненты mvc Библиотека mvc преднамеренно форсирует нас расщеплять дизайн программы на три фундаментальных компонента: Тип Controller, снабжающий ядро программы некоторыми входными данными (стимулами) из внешнего мира. Моделируется “нечистыми” вычислениями, т.
ЧТАТ ПОЛН →