ЭТО БЛОГ НБРК
ДБРО ПОЖА В МОЙ БЛОГ . ТУТ Я ПУБЛ ВСЯК РАЗН ЗПСИ И ЗМТК О ПРОГ , ЯЗКЕ ИЛИ ДАЖЕ О ЖИЗН . В ОСНО ДЛЯ СЕБЯ , ЧТОБ ПТОМ СМТР ИЗ БУДЩ .
НЕКТ МОИ ТЕХН ПРОЭ ЕСТЬ НА ГТХБ , И ТУТ Я ИНГД ПУБЛ ПРОЧ ИДЕИ ИЛИ ДОП ТЕОР ДОКИ ПО НИМ . В НАСТ МОМТ Я ИССЛ ВОЕН ИГРЫ И КОМП СИМУ .
КСТА , ОЧЕН МНОГ ХОРШ СЛОВ УМЕЩ ВСГО В ЧТРЕ СИМВ , НАПР 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, снабжающий ядро программы некоторыми входными данными (стимулами) из внешнего мира. Моделируется “нечистыми” вычислениями, т.