Форум программистов, компьютерный форум, киберфорум
Наши страницы

ООП и паттерны

Войти
Регистрация
Восстановить пароль
 
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
#1

Типы, как наборы функций с параметрами, удовлетворяющие условиям - ООП и паттерны

07.03.2015, 04:15. Просмотров 622. Ответов 11
Метки нет (Все метки)

Просветите дилетанта и помогите внести хотя бы малую ясность в таком вопросе. Я до последнего времени жил в представлениях, что есть ОЗУ/ЕЕПРОМ с линейной адресацией и определенной разрядностью, набор регистров и система команд процессора. И все было просто и понятно - навалил кучу байт - это ДАННЫЕ, трактуешь их как хочешь, загружаешь в регистры, ИЗМЕНЯЕШЬ командами, пишешь обратно... Последовательность псевдокоманд в ОЗУ - это тоже ДАННЫЕ, хоть и можно их последовательно считывать и в зависимости от содержимого выполнять разные инструкции, изменяющие другие данные... И всякие Си/Паскали и т.п. воспринимались как ОБЕРТКИ над этой стройной картиной - наш друг компилятор, который нафигачит кучу инструкций для кратких абстракций в коде, ну появились ТИПЫ - некоторые соглашения как мы интерпретируем байты ДАННЫХ, параметры/возвращаемые значения функций - но стек то и так уже был...
Несколько месяцев назад эта идиллия несколько трансформировалась с открытием "функций как объектов первого класса" - ну допустим это понятно, чанки - те же паттерны кодирования инструкций в ячейках памяти данных/стеке. Всякий страх из серии "ТИПЫ - это неподвижные точки специальных объектов, называемых алгебрами функторов" пока вообще не ассоциируется ни с какой концепцией, и отложен до лучших времен. Но вчера взялся за простую книжку "для юных сурков" - SICP, до определенного момента было все понятно и хорошо, но разрыв шаблона случился при прочтении следующего откровения:
Мы ведь ни разу не сказали, что такое пара, и указывали только, что для работы с
парами язык дает нам процедуры cons, car и cdr. Но единственное, что нам надо
знать об этих процедурах — это что если мы склеиваем два объекта при помощи cons,
то с помощью car и cdr мы можем получить их обратно. То есть эти операции удовле-
творяют условию, что для любых объектов x и y, если z есть (cons x y), то (car
z) есть x, а (cdr z) есть y. Действительно, мы упомянули, что три эти процедуры
включены в наш язык как примитивы. Однако любая тройка процедур, которая удовле-
творяет вышеуказанному условию, может использоваться как основа реализации пар.

Эта идея ярко иллюстрируется тем, что мы могли бы реализовать cons, car и cdr без
использования каких-либо структур данных, а только при помощи одних процедур. Вот
эти определения:
(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "Аргумент не 0 или 1 -- CONS" m))))
dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
Такое использование процедур совершенно не соответствует нашему интуитивному по-
нятию о том, как должны выглядеть данные. Однако для того, чтобы показать, что это
законный способ представления пар, требуется только проверить, что эти процедуры
удовлетворяют вышеуказанному условию.
Это что теперь - все можно, режь-коли, души гусей? Если функции как данные и как объекты первого класса я еще могу представить как чанки в ОЗУ, а тут данные как функции или аргументы, спрятанные в их параметрах... Зачем тогда в том же Haskell есть АТД как основа всего сущего? Если там тоже функции - объекты первого класса, можно ли там также реализовать данные как функции без АТД и другие функции на них? В общем, помогите непротиворечиво совместить в голове все эти концепции...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2015, 04:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Типы, как наборы функций с параметрами, удовлетворяющие условиям (ООП и паттерны):

Как выбирать последовательности, удовлетворяющие определенным условиям? - C++
Подскажите, пожалуйста, как вот этот кусочек (в приложении) запрограммировать - очень сильно туплю... забыла написать, что r=143,...

Найти 3 точки, наиболее удовлетворяющие условиям - Геометрия
Приветствую. Помогите найти решение. Даны отрезки AB=8, AC=16, AD=11, AE=12, AF=12 см. Из точек B, C, D, E, F построены окружности...

Выборка из 1 таблицы суммы значений, удовлетворяющие условиям - SQL Server
Здравствуйте, уважаемые форумчане. Весь день ломал голову, но так и не победил. Суть вопроса такова: возьмем 4 поля таблицы - 0....

Из одной последовательности сделать две, удовлетворяющие условиям. Help(( - Pascal
по заданной последовательности а1,а2,....аn(n<=20) построить 2 последовательности х1,х2...хn и y1,y2...yn элементы которых определяются...

Найти целые числа удовлетворяющие заданным условиям - C++
Пользователь вводит любое целое число А. Необходимо вывести все целые числа В, для которых А делиться без остатка на В*В и не делиться без...

Отобрать строки в таблице, удовлетворяющие нескольким условиям - 1С
Привет всем. Отобрать строки таблицы по значению колонки легко - ОтборСтрок метод использовать. Но мне нужно по нескольким...

11
korvin_
2075 / 1566 / 251
Регистрация: 28.04.2012
Сообщений: 5,605
07.03.2015, 10:35 #2
Lisp
1
2
3
4
5
6
7
8
(define (cons x y)
  (lambda (m) (m x y)))
 
(define (car p)
  (p (lambda (x y) x)))
 
(define (cdr p)
  (p (lambda (x y) y)))
=)

Цитата Сообщение от _Ivana Посмотреть сообщение
Зачем тогда в том же Haskell есть АТД как основа всего сущего?
Для удобства, строгости, типизации. Как ты отличишь такой λ-cons-объект от любого другого λ-объекта? Как ты будешь сопоставление с образцом проводить над λ-объектом?
0
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
07.03.2015, 16:09  [ТС] #3
Я пока ничего не понимаю в этом, поэтому развернуто ответить не могу, но и обсуждение терять не хочется. "Отличишь" - это конечно вопрос. Я могу создать 2 "одинаковые" функции (как объекты первого класса) с разными параметрами - и получу 2 разных значения одного и того же типа, если я правильно понимаю - надо поиграться в интерпретаторе. А "с образцом" - это не обязательно, сказано - у нас есть 3 метода: конструктор конс и геттеры фст/снд - все, больше ничего нет, и реализация скрыта - работайте в рамках этих методов.
0
korvin_
2075 / 1566 / 251
Регистрация: 28.04.2012
Сообщений: 5,605
07.03.2015, 18:02 #4
Цитата Сообщение от _Ivana Посмотреть сообщение
А "с образцом" - это не обязательно
Это удобно. Я же писал про удобство.
0
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
09.03.2015, 03:42  [ТС] #5
Вести с полей - почитав пару статей для юных сурков, я наконец-то осознал, что мои любимые биты и байты - тоже абстрактные типы данных, которые полностью определяются перечнем определенных на них функций типа or, xor или композиционных для байтов - add и rol, а физически могут быть реализованы хоть в виде полных-пустых стаканчиков с песком и бедуина, насыпающего-высыпающего песок из них по тексту программы. Так что с абстрактными типами данных более-менее все ясно.

Но это не отвечает на вопрос - как функции могут быть объектами первого класса и тем более данными - мне трудно отойти от теоретико-множественной интерпретации "множество-операция на нем" к лямбда-самцовым "терм-аппликация-редукция".

Добавлено через 4 минуты
ЗЫ кстати, АТД-пару из SICP опробовал, работает:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--cons x y = (x,y)
--car = fst
--cdr = snd
 
cons x y z = z x y
car p = p (\x y -> x)
cdr p = p (\x y -> y)
 
f p x = cons (car p + x) (cdr p + 1)
g p = (car p) `div` (cdr p)
mean = g . foldl f (cons 0 0)
 
main = do
    print $ mean [1..10]
А вот список таким образом не могу построить - сидящие в Хаскеле Хиндли с Милнером все время мне выводят бесконечно увеличивающийся тип при попытке комбинировать пары в список, а там жесткая статическая типизация и этот тип прожует только специально заточенная под него функция - своя для каждой длины списка, а это не гуд. В Лиспе вышеупомянутых товарищей нет и никто не мешает составлять и разбирать подобные конструкции.

Добавлено через 40 минут
5 минут знакомства с волшебным функциональным языком Ela - и все работает, что не удается сделать в хаскеле - вот кот:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
mycons x y = \m -> if m==0 then x else y
mycar z = z 0
mycdr z = z 1
mynil = id
isnil l = (mycar l)==0
 
myfold f a l = if isnil l then a else myfold f (f a $ mycar l) (mycdr l)
mymap f l = if isnil l then mynil else (f $ mycar l) `mycons` mymap f (mycdr l)
 
int2mylist 0 = mynil
int2mylist n = mycons n $ int2mylist ((-) n 1)
 
myfold (+) 0 ( mymap (*10) ( int2mylist 10 ) )
набираем в онлайн интерпретаторе http://elalang.net/elac.aspx и радуемся - вот оно, завещанное SICP счастье абстрактного списка через функции Синтаксиса Ela на форуме нет, поместил в тег Хаскеля.
Правда, условие на конец списка глупое - но делал навскидку, верю что можно сделать и нормально - не по первому аргументу пары. Просто с Ela до сего момента не встречался, не знаю синтаксис и повадки еще.
0
korvin_
2075 / 1566 / 251
Регистрация: 28.04.2012
Сообщений: 5,605
09.03.2015, 09:10 #6
Цитата Сообщение от _Ivana Посмотреть сообщение
Синтаксиса Ela на форуме нет, поместил в тег Хаскеля.
Судя по синтаксису, это Хаскелл и есть. Только с поддержкой динамической типизации.
0
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
09.03.2015, 21:01  [ТС] #7
Ну почти. Например, выражение (n-1) трактовать как инфиксную операцию отказался, пришлось поступить по-Лисповому: ((-) n 1), но это не принципиально конечно.

ЗЫ кстати, если кого интересует, я накопал некоторое количество материала и ссылок по теме, пытаюсь разобраться, могу поделиться. Хотя я не вижу активного обсуждения в этой теме, даже Лисперы молчат
0
korvin_
2075 / 1566 / 251
Регистрация: 28.04.2012
Сообщений: 5,605
10.03.2015, 08:01 #8
Цитата Сообщение от _Ivana Посмотреть сообщение
Хотя я не вижу активного обсуждения
А что тут обсуждать? http://habrahabr.ru/post/248331/
1
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
10.03.2015, 17:33  [ТС] #9
Ну все для кого-то уже давно известно, а для кого-то в первый раз. Спасибо за ссылку.
0
castorsky
1972 / 1075 / 79
Регистрация: 29.11.2013
Сообщений: 3,354
14.03.2015, 22:18 #10
Цитата Сообщение от _Ivana Посмотреть сообщение
Хотя я не вижу активного обсуждения в этой теме, даже Лисперы молчат
Хм, впервые заглянул в эту ветку, а тут такое =)) Я плохо осиляю многотекстов, опишите просто и коротко конценпцию, которая рвет Ваши шаблоны.
P.S. SICP очень хорошо умеет рвать шаблоны.
0
_Ivana
3227 / 1855 / 156
Регистрация: 01.03.2013
Сообщений: 5,080
Записей в блоге: 5
14.03.2015, 22:33  [ТС] #11
Цитата Сообщение от castorsky Посмотреть сообщение
опишите просто и коротко конценпцию, которая рвет Ваши шаблоны
Концепция реализации типов данных (абстрактных, с доступом через интерфейсные функции), в т.ч. бесконечных, через функции. И реализация этого на нижнем аппаратном уровне.

ЗЫ абстракции вроде частичного применения функции к нескольким аргументам, в результате чего они оказываются "обернутыми" в эту функцию с последующей возможностью обратного извлечения их путем применения этой конструкции к еще одному параметру - функции, вытаскивающей ранее засунутые аргументы более-менее понимаю. Идеи, что "нет типизированных множеств и операций над их элементами и функций на них, а только лямбды и ничего кроме лямбд" и концепции, выражаемые словами "замыкание" и т.п. - уже хуже.
0
castorsky
1972 / 1075 / 79
Регистрация: 29.11.2013
Сообщений: 3,354
14.03.2015, 23:18 #12
Цитата Сообщение от _Ivana Посмотреть сообщение
Идеи, что "нет типизированных множеств и операций над их элементами и функций на них, а только лямбды и ничего кроме лямбд" и концепции, выражаемые словами "замыкание" и т.п. - уже хуже
Да, в схеме типизация динамическая, элементы множеств не обязаны быть однотипными. Тут ничего странного, а в хацкелях разве нет замыканий? IORef и монады никто не отменял.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 23:18
Привет! Вот еще темы с ответами:

Получить в файле g все компоненты файла f, удовлетворяющие условиям - C++
Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f: 1. являющиеся четными числами; ...

Файл. Вывести на экран записи, удовлетворяющие заданным условиям. - Turbo Pascal
Для файла f1 содержащего список фамилий и номеров телефонов выведете на экран телефоны тех людей, чьи фамилии начинаются на букву,...

Бинарные файлы, выбрать записи удовлетворяющие заданным условиям - C (СИ)
Помогите написать программу Программа должна: 1. Создавать бинарный файл. 2. Добавлять запись в конец файла. 3. Добавлять запись по...

Найдите все двузначные числа,удовлетворяющие следующим условиям - Pascal
Помогите пож. 1. Найдите все двузначные числа,удовлетворяющие следующим условиям: сумма квадратов не более 30, записанное теми же...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru