gengo-chan

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » gengo-chan » общее языкознание » Три типа предикативов


Три типа предикативов

Сообщений 1 страница 5 из 5

1

Сокращения: ЧЯ = человеческий язык; ЯП = язык программирования

Изучение высокоуровневых (то есть наиболее человечных) ЯП навело меня на мысль, что можно провести параллели между ними и ЧЯ в кое-каком месте... :idea:  Полагаем (упрощённо? :question: ), что высказывание ЧЯ состоит из предикативов разных валентностей, то есть в наличии сущности только одного вида. Но в названных ЯП их три: 1) функции или методы, 2) классы или типы и 3) значения -- и ещё парочка идей, связанных с этим разделением. Я считаю, что это всё неспроста, это разумно, обоснованно и имеет прямое отношение к математике, и что это можно прямо или с минимальной обработкой применять в теории ЧЯ. В данном треде мы будем обсуждать, почему так, и знакомить лингвистов с этими важными понятиями ЯП, с которыми, как я считаю, очень полезно ознакомиться. :rain:
Все программиздические излияния рекомендуется вести на хаскеле, как наиболее матанообразном ЯП. :glasses:

+1

2

для начала, приемлемая и достаточная в нашем случае инфа:

http://ru.wikipedia.org/wiki/Функция_(математика)
http://ru.wikipedia.org/wiki/Функция_(программирование)
http://en.wikipedia.org/wiki/Value_(mathematics)
http://en.wikipedia.org/wiki/Value_(computer_science)
http://en.wikipedia.org/wiki/Data_type
http://en.wikipedia.org/wiki/Type_(model_theory)

+1

3

Для начала, о терминологии. Объект и метод -- это то же самое, что значение и функция соотвественно. Я применяю чаще то, что справа. А может быть, я их просто путаю. :D Класс и тип таки имеют минимальные отличия.

Я полагаю, что реплика -- это программа, таким образом собеседники постоянно меняются программами. Пока что всё упрощённо: нет контекста. Потом станет видно, что контекст -- это заимствование или разделение (sharing) определений между репликами, которые могут быть: 1) внутри данного диалога, 2) внутри общего опыта собеседников -- знакомства, то есть множества диалогов и 3) внутри культуры, сначала родной, а потом, если не совсем быдло, то и из других культур... Но пока я не закодил контекст, смотрим в абстрактные модели.

Кроме того, я полагаю, что в языке употребляются только функции и типы, а все значения скрыты, потому что значения свободны от контекста с точки зрения материализма, а человеческий язык в такое не может. Я буду называть значения именами типа ThingN, отдавая дань тому, что они где-то есть и обеспечивают вычислимость, но никто не знает, где они. То есть в названии треда я наврал, типа предикативов не три, а два.

1. Рассмотрим человеческую фразу "это дом": здесь "это" -- это некая функция, вычисляющая то, что перед нами конкретный объект, "дом" -- это тип. Записывается так:

Код:
data House = Thing1 | Thing2 | Thing3 | ...

this :: House
this = Thing1

main = understand this

Целиком читается так: "функция с названием это возвращает некую вещь, которая является экземпляром типа дом". Thing1 значит какое-то значение -- ситуацию. Его надо обязательно указать, потому что по смыслу наша функция должна мочь вычислиться конкретно :) . understand обозначает модальность высказывания -- утвердительную, а main -- всю реплику целиком. Если слишком сложно и непонятно, потерпите, следующие примеры должны внести ещё больше смуты. %-)

2. Рассмотрим другую: "дом рушится": тут значение явно не указано, то есть подразумевается и есть, но не выражено словом, "дом" -- это опять тип, а "рушится" -- это функция. Функция показывает, как меняется значение или, что чаще, как тип превращается в другой тип. В данном случае дом превратится в развалины. Записывается так:

Код:
this :: House
this = Thing2

data House = Thing1 | Thing2 | Thing3 | ...
  deriving (Ruinable)

data Ruins = Thing200 | Thing300 | ...

class Ruinable a
  where crumble :: a -> Ruins

crumble Thing2 = Thing200

main = understand (crumble this)

И вот что добавилось: функция разрушение определена только для объектов типа (класса) разрушаемые вещи, то есть на объекты других типов функцию не стоит нельзя применять, однако для всяких нужных случаев можно применять иерархию типов, как здесь слово deriving говорит, что на типе дом определены все функции типа разрушаемые вещи, то есть дом -- это подмножество, частный случай разрушаемых вещей. Это очень здорово, потому что вносит пять копеек в формализацию прагматики: нельзя (буквально) разрушать дождь или обеденную трапезу. Ещё здесь есть сопоставление в определении функции crumble в предпоследней строчке, потому что я пока даже не подозреваю, как её определять. Пятая строчка совершенно бессмысленна для нас: в ней написано слово data -- перечисляет значения возможные для этого типа -- в языке программирования это надо обязательно описать, но в человеческом языке, как уже говорилось, значения останутся тёмным лесом.

3. Рассмотрим ещё одну фразу "со временем дома рушатся". Очень похоже на второй пример, но это -- неконкретный, то есть у него нет никакого значения / объекта, так что ничего конкретного не вычисляется. Единственное, чем будет отличаться код для этого случая от второго примера -- это отсутствие строчки, которая связывала реплику с единичностью случая.

Код:
this :: House

data House = Thing1 | Thing2 | Thing3 | ...
  deriving (Ruinable)

data Ruins = Thing200 | Thing300 | ...

class Ruinable a
  where crumble :: a -> Ruins

crumble Thing3 = Thing300

main = understand (crumble this)

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

Почему получилось так много кода? Потому что из-за отсутствия контекстов приходится определять всё-всё в каждой реплике. Но ИРЛ многие определения известны обоим собеседникам. Это контекст. Ключевое слово import подключает сотни стандартных определений, что сократит реплику даже на нашем точном языке...

Вот для 2-го случая:

Код:
import RussianCulture
this = Thing2
main = understand (crumble this)

Для 3-го:

Код:
import RussianCulture
this :: House
main = understand (crumble this)

во втором случае не сказано, что Thing2 имеет тип House, но это и так понятно системе автоматического вывода типов, потому что где-то в модуле RussianCulture, Thing2 уже объявлен как экземпляр нужного класса. Но так делают только машины, человек поступает как-то иначе, но как? Определение типа для человека принципиально важно, оно-то практически и конкретизирует тип и приближается к значению, не достигая его... , но если мне не изменяет память, в человеческом языке объект, если это вообще он, включают элементом в кучу разных множеств, однако у моего объекта может быть только один тип, значит здесь у меня этот процесс выражается выведением сло-о-ожного типа со всякими class, deriving, data... и без участвия значений-объектов, вместо невозможной гипотетической чуши, котороую компилятор никогда не пропустит, вроде

Код:
Thing7 :: House
Thing7 :: (Ruinable a) => a
Thing7 :: YetAnotherYobaType

ИТАК, КАКОГО ЖЕ ФИГА Я ВСЁ ЭТО ПИСАЛ: раньше я думал, что всем предикативам можно поставить в соответствие функции в понимании программиста, но потом я понял, что неправ, и что в большинстве случаев человеческого словоупотребления надо применять конструкторы типов, по простой причине указанной в предыдущем абзаце. Другими словами, функция в отличие от предикатива работает со значением, а вот предикатив -- с типом, так же как и конструктор типов, который как раз мне и нужен, в то же время функции нужны для преобразовывания типов, они делают это как-то опосредованно, всё ещё работая со значением; в этом месте я запутался, не понял себя и пошёл спать. Всем приятных снов, лучей добра, и годная ссылка почитать: http://en.wikipedia.org/wiki/Algebraic_data_type !

+1

4

познавательно. угэнгачиваю!

0

5

повелительное наклонение записывается заменой understand на глагол действия, которое приказано.
"он бежит"

Код:
main = understand (run he)
  where run :: MammalMovingActions
  understand :: IO HumanFeatures

"беги"

Код:
main = run
  where run :: IO MammalMovingActions

при этом надо учитывать, что у мейна особый тип IO ( ), поэтому run, который является аргументом understand, может оставаться простым типом, а тот, который является определением мейна, то есть является центром реплики, тот имеет тип с приставкой IO... Объясняется это тем, что по сути реплика -- это приказ (в императивном ЯП -- команда), а то, что в реплике развёртывается -- это всё требуется понимать, то есть это голые определения, другими словами объявления типов и функций. Иногда, конечно, нужно сказать последовательность действий -- алгоритм, для этого есть отдельная конструкция do, упрощающая работу с типами, то есть позволяющая про них меньше думать.

Код:
main = do
  action1
  action2
  action3
  ...

Но мне кажется, что алгоритмы встречаются в человеческой речи гораздо реже.

В чём смысл IO ( ) ? А в том, что на собеседнике можно определить не все функции, то есть, есть много вещей, которые во-первых не может делать человек, и во-вторых которые по смыслу глупо приказывать собеседнику. Поэтому какая-то часть функций, определённых для человека, берётся и переопределяется на собеседнике с помощью IO, и это называется перегрузка функции, то есть имя одно, а преобразования разные в зависимости от типов аргумента и других окружающих сущностей...

Интересно, что в ЯП простые функции и IO-функции как правило вообще не совпадают, потому что, как бы, комплилятор приказывает машине, а у нас человек который говорит о человеке и приказывает человеку, то есть человек сам себе и компилятор и исполнитель, поэтому всё тётто иначе.

Вчера хотел написать о недостатках, но уже всё забыл =__= Покритикуйте пока сами.

0


Вы здесь » gengo-chan » общее языкознание » Три типа предикативов


Создать форум. Создать магазин