Обновить
25
ApeCoder@ApeCoder

Разработчик

0,1
Рейтинг
6
Подписчики
Отправить сообщение
Да, извиняюсь, я говорил про монады в контексте состояний. Про монады вообще я сам не понимаю :)
Вернее наоборот

Тип IO a это функция, которая берет состояние RealWord и возвращает пару из нового состояния и значения.

type IO a  =  RealWorld -> (a, RealWorld)


So, 'main' just has type «IO ()», 'getChar' has type «IO Char» and so on. You can think of the type «IO Char» as meaning «take the current RealWorld, do something to it, and return a Char and a (possibly changed) RealWorld». Let's look at 'main' calling 'getChar' two times:

getChar :: RealWorld -> (Char, RealWorld)
 
main :: RealWorld -> ((), RealWorld)
main world0 = let (a, world1) = getChar world0
                  (b, world2) = getChar world1
              in ((), world2)


Это из www.haskell.org/haskellwiki/IO_inside#Welcome_to_the_RealWorld.2C_baby

Монадическая функция это функция которая возвращает функцию которая из одного состояния объекта и аргумента переводит в другое состояния объекта. Частный случай объекта — это весь мир.
У меня тут возникла мысль: как бы мы смоделировали multiverse?
Клавиатурные вегетарианцы — те, кто не прикасаются к мыши
Клавиатурные веганы — те, вегетарианцы, которые не прикасаются еще и к стрелочным клавишам.
Дальше наверное можно построить редактор, который управляется одним пробелом.
И наверняка есть еще редактор для впавших в клавиатурную нирвану — не прикасаться ни к чему.
Это зависит от того, насколько полную модель мы захотим составить — если нам надо иметь возможность «записать число по адресу XXX» то как это не моделируй оно небезопасно. Надо как-то переходить к друг им понятиям типа «присвоить значение элементу массива». Но все равно надо будет как-то объяснять процессору, какие адреса он будет читать и писать и на этом этапе будет возможна ошибка.

Вряд ли есть язык, который от этого избавлен.
5. В чем странность этого haskell? только в том, что есть некие типы данных, описывающие предметную область «модель компьютера». Еще мы знаем о том, что если мы наложим некоторые ограничения на вид функции, то это будет выполняться существенно быстрее. Можно так же сделать другую реализацию такого класса типов которая будет вычисляться внутри Haskell безо всяких монад IO.
Я думаю параллельность можно представить как то, что у нас есть n потоковфункций меняющих real world и мы можем их перемешивать. (либо вставлять кусочки одного потока после кусочков другого, либо выполнять две функции от одного состояния а потом объединять миры)
Вот этот товарищ принимает участие в IFCFPC в составе команды «Lazy Bottoms» users.livejournal.com/_adept_/24049.html
Насколько я понял в хзаскеле нет функции генерации псевдослучайного числа без аргументов

www.haskell.org/haskellwiki/IO_inside#Welcome_to_the_RealWorld.2C_baby

IO Int это функция без аргументов, которая возвращает функцию которая берет состояние мира и возвращает следующее состояие мира и число

>>>Ну, да… Можно и так. Но это уже выводит нас из концепции компилятора, выдающего безопасный код.

1. Безопасный код — это некий устоявшийся компромисс. Например в случае C# передать документы пользователя в АНБ — это безопасный код, а Acess Violation небезопасный. Если мы генерируем код для реальной машины в любом случае решение будет не гарантированно безопасным. Не важно как это делается — в помощью монады IO или чистыми функциями так как может быть ошибка.

2. Мы можем ввести ключ компилятора -enable_asm и тогда мы не сможем скомпилировать такой код для реальной машины если не включим этот ключ (например мы не будем предоставлять в монаде IO функцию runAsm)

3. так как asm.hs выполняющийся на настоящей машине у нас явно помечается соотетсвующим типом, мы можем изолировать unsafe код и постепенно уменьшать его количества.

4. Система типов может позволить нам вводит более и более безопасный ассемблер вводя какие-то более высокоуровневые операции (типа циклов) и какие-то правила композиции этих операций

«Но это ничем не отличается тогда от Си… Profit только в том, что эти взаимодействия будут ограничены определёнными функциями.»

Мне кажется невозможно написать такой компилятор, для которого программы гарантированно безопасны. Профит именно в том, что небезопасные операции изолированны в маленьких кусочках и сравнительно просты, так, что вероятность внесения в них ошибки минимальна.

Можно их изолировать при помощи написания на другом языке или при помощи описания на Haskell — разница в том, что на каких-то других беднее система типов и меньше возможности отключить то, что нам не нужно. Ну и конечно, экосистема для C есть большая готовая, а для asm.hs ее нет :)
«Американский кибернетик Данциг ввёл в компьютер сведения о калорийности различных пищевых продуктов и о сезонных колебаниях их стоимости. А машина должна была составить наиболее экономичное меню. После длительных и сложных расчётов она ответила: «18 литров уксуса в сутки». Сначала Данциг подумал, что в программе какая-то ошибка. Он повторил расчёт, но машина выдала прежний ответ. Действительно в 18 л. уксуса заключено 1800 калорий – величина, принятая за основу суточного питания. Данциг изменил программу, введя в неё показатели о взаимной заменимости различных продуктов. Компьютер после долгих раздумий рекомендовала наиболее экономичное меню – 32 стакана кофе с молоком.
»
Добавляем в компилятор условие, что если код соответствует ограничениям asm.hs и мы его вызываем для особого типа, который мы обозначим как «реальная машина», то такой код мы переводим в машинный код, и вставляем в место его вызова call.

Делаем единственный способ получения типа «реальная машина» из Io.

Потом переписываем на asm.hs те части Io, которые еще не на самом Haskell.

То есть нам ее обязательно выполнять функции шаг за шагом — мы можем выполнить над кодом любые преобразования, так, чтобы только результат был такой же. Как, например, jit для байткода Java не обязан эмулировать все промежуточные вычисления, а может для каких-то частных случаев преобразовать стековый jбайткод в регистровый машинный, ничего ее знающий о стеке, а оптимизатор SQL не обязан сначала выполнять декартовое произведение таблиц, а потом фильтровать результат, а может поменял местами
Что означает «по бжу»?
Не, я имел ввиду не это, а подход как у asm.js — определить семантику машины как частный случай монады state, затем определить программу как последовательность известных преобразований состояния, затем скомпилировать вычислитель этой последовательности в эквивалентный код для существующего процессора
«Ну, как бы да, но… Мы просто написали ещё один компилятор. И компилятора, всё равно, два.»

Дык после переписывания Io на Haskell и интеграции компилятора в asm.hs, старый можно выкинуть и у нас просто будет один компилятор который сам себя компилирует только для частного случая когда код соответствует ограничению из asm.hs мы его можем хорошо оптимизировать
ну таким же образом — выделяем подмножество чистого Haskell, которое транслируется легко в машкод.
для этого подмножества делаем компилятор в машкод.

просто в asm.js вводятся ограничения что программа должна работать с большим типизированным массивом и для каждой инструкции типы должны быть выводимы. А в asm.hs — что программа должна быть функцией возвращающей последовательность функций СостояникМашиныДо -> СостояниеМашиныПосле.

При этом даже можно не использовать монаду IO достаточно просто абстрактно определить семантику этих функций.

То есть семантику asm определяем как частный случай семантики Haskell относительно модельной машины
Это способ писать такой ограниченный Js чтоб его было легко транслировать в машкод ну или в C но при этом эти программы остаются js

Информация

В рейтинге
4 866-й
Откуда
Россия
Дата рождения
Зарегистрирован
Активность