Для начала, о терминологии. Объект и метод -- это то же самое, что значение и функция соотвественно. Я применяю чаще то, что справа. А может быть, я их просто путаю. Класс и тип таки имеют минимальные отличия.
Я полагаю, что реплика -- это программа, таким образом собеседники постоянно меняются программами. Пока что всё упрощённо: нет контекста. Потом станет видно, что контекст -- это заимствование или разделение (sharing) определений между репликами, которые могут быть: 1) внутри данного диалога, 2) внутри общего опыта собеседников -- знакомства, то есть множества диалогов и 3) внутри культуры, сначала родной, а потом, если не совсем быдло, то и из других культур... Но пока я не закодил контекст, смотрим в абстрактные модели.
Кроме того, я полагаю, что в языке употребляются только функции и типы, а все значения скрыты, потому что значения свободны от контекста с точки зрения материализма, а человеческий язык в такое не может. Я буду называть значения именами типа ThingN, отдавая дань тому, что они где-то есть и обеспечивают вычислимость, но никто не знает, где они. То есть в названии треда я наврал, типа предикативов не три, а два.
1. Рассмотрим человеческую фразу "это дом": здесь "это" -- это некая функция, вычисляющая то, что перед нами конкретный объект, "дом" -- это тип. Записывается так:
Целиком читается так: "функция с названием это возвращает некую вещь, которая является экземпляром типа дом". Thing1 значит какое-то значение -- ситуацию. Его надо обязательно указать, потому что по смыслу наша функция должна мочь вычислиться конкретно . understand обозначает модальность высказывания -- утвердительную, а main -- всю реплику целиком. Если слишком сложно и непонятно, потерпите, следующие примеры должны внести ещё больше смуты.
2. Рассмотрим другую: "дом рушится": тут значение явно не указано, то есть подразумевается и есть, но не выражено словом, "дом" -- это опять тип, а "рушится" -- это функция. Функция показывает, как меняется значение или, что чаще, как тип превращается в другой тип. В данном случае дом превратится в развалины. Записывается так:
И вот что добавилось: функция разрушение определена только для объектов типа (класса) разрушаемые вещи, то есть на объекты других типов функцию не стоит нельзя применять, однако для всяких нужных случаев можно применять иерархию типов, как здесь слово deriving говорит, что на типе дом определены все функции типа разрушаемые вещи, то есть дом -- это подмножество, частный случай разрушаемых вещей. Это очень здорово, потому что вносит пять копеек в формализацию прагматики: нельзя (буквально) разрушать дождь или обеденную трапезу. Ещё здесь есть сопоставление в определении функции crumble в предпоследней строчке, потому что я пока даже не подозреваю, как её определять. Пятая строчка совершенно бессмысленна для нас: в ней написано слово data -- перечисляет значения возможные для этого типа -- в языке программирования это надо обязательно описать, но в человеческом языке, как уже говорилось, значения останутся тёмным лесом.
3. Рассмотрим ещё одну фразу "со временем дома рушатся". Очень похоже на второй пример, но это -- неконкретный, то есть у него нет никакого значения / объекта, так что ничего конкретного не вычисляется. Единственное, чем будет отличаться код для этого случая от второго примера -- это отсутствие строчки, которая связывала реплику с единичностью случая.
Машинный компилятор такое вряд ли пропустит, потому что ничего не вычислено, а даны голые определения. Собеседник сам как компилятор интерпретатор -- может налету принимать определения, и ждать хоть всю жизнь, когда же в какую-нибудь их функцию вставят аргумент...
Почему получилось так много кода? Потому что из-за отсутствия контекстов приходится определять всё-всё в каждой реплике. Но ИРЛ многие определения известны обоим собеседникам. Это контекст. Ключевое слово import подключает сотни стандартных определений, что сократит реплику даже на нашем точном языке...
Вот для 2-го случая:
Для 3-го:
во втором случае не сказано, что Thing2 имеет тип House, но это и так понятно системе автоматического вывода типов, потому что где-то в модуле RussianCulture, Thing2 уже объявлен как экземпляр нужного класса. Но так делают только машины, человек поступает как-то иначе, но как? Определение типа для человека принципиально важно, оно-то практически и конкретизирует тип и приближается к значению, не достигая его... , но если мне не изменяет память, в человеческом языке объект, если это вообще он, включают элементом в кучу разных множеств, однако у моего объекта может быть только один тип, значит здесь у меня этот процесс выражается выведением сло-о-ожного типа со всякими class, deriving, data... и без участвия значений-объектов, вместо невозможной гипотетической чуши, котороую компилятор никогда не пропустит, вроде
ИТАК, КАКОГО ЖЕ ФИГА Я ВСЁ ЭТО ПИСАЛ: раньше я думал, что всем предикативам можно поставить в соответствие функции в понимании программиста, но потом я понял, что неправ, и что в большинстве случаев человеческого словоупотребления надо применять конструкторы типов, по простой причине указанной в предыдущем абзаце. Другими словами, функция в отличие от предикатива работает со значением, а вот предикатив -- с типом, так же как и конструктор типов, который как раз мне и нужен, в то же время функции нужны для преобразовывания типов, они делают это как-то опосредованно, всё ещё работая со значением; в этом месте я запутался, не понял себя и пошёл спать. Всем приятных снов, лучей добра, и годная ссылка почитать: http://en.wikipedia.org/wiki/Algebraic_data_type !