Саймон в основному правильний, з точки зору розширення. Ми досить добре знаємо, що таке семантика сучасних функціональних мов, і вони насправді є порівняно невеликими варіаціями одна від одної - кожен з них являє собою дещо різні переклади на монадійний метамов. Навіть така мова, як Scheme (динамічно набрана імперативна мова вищого порядку з керуванням першого класу) має семантику, яка досить близька до ML та Haskell.
З денотативної точки зору, ви можете почати давати досить просте рівняння домену для семантики схеми - назвуть його . Люди могли і вирішували подібні рівняння в кінці 70-х - початку 80-х, тому це не дуже погано. Аналогічно, існує і досить проста оперативна семантика для схеми. (Зауважте, що, кажучи "Схема", я маю на увазі нетипізоване обчислення лямбда плюс продовження плюс стан, на відміну від фактичної схеми, яка має декілька бородавок, як це роблять усі справжні мови.)V
Але потрапити до категорії, що підходить для тлумачення сучасних функціональних мов, речі стають досить страшними. В основному, ви закінчуєте побудову ультраметрично збагаченої категорії відношень часткової еквівалентності над цією областю. (Як приклад, див. "Семантика зрозумілості параметричного поліморфізму, загальні посилання та рекурсивні типи" Біркедала, Стоврінга та Тамсборга ". (Наприклад, див. "Незалежність представництва залежної від представництва" Ахмеда, Дрейєра та Россберга.) У будь-якому випадку використовувані методи є відносно новими.
Причина такої математичної складності полягає в тому, що нам потрібно вміти одночасно інтерпретувати параметричний поліморфізм та стан вищого порядку. Але як тільки ви це зробите, ви в основному не вдома, оскільки ця конструкція містить усі жорсткі шматочки. Тепер ви можете інтерпретувати типи ML та Haskell за допомогою звичайних монадичних перекладів. Суворий та ефективний простір функцій ML a -> b
перекладається на право> , а лінивий простір функцій Хаскелла перекладається на , з монадичний тип побічних ефектів, що інтерпретують IO монаду Haskell, а є інтерпретацією типу ML або типу Haskell , і⟨ ⟩ → Т⟨ Б ⟩⟨ ⟩ → ⟨ б ⟩Т( А )⟨ ⟩a
→ - це показник у цій категорії PER.
Що стосується теорії вирівнювання, оскільки ці мови можна описати перекладами на дещо різні підмножини однієї мови, цілком справедливо назвати їх синтаксичними варіаціями одна від одної.
Різниця у почутті між ML та Haskell насправді виникає внаслідок інтенсивних властивостей двох мов - тобто часу виконання та споживання пам'яті. ML має композиційну модель продуктивності (тобто витрати часу / простору програми можна обчислити з витрат часу / простору її підтермінь), як це було б справжньою мовою виклику за назвою. Фактичний Haskell реалізований із закликом до потреби, своєрідним запам'ятовуванням, і, як результат, його продуктивність не є композиційною - тривалість вираження, пов'язаного зі змінною, потребує оцінки, залежить від того, використовувався він раніше чи ні. Це не моделюється в семантиці, про яку я говорив вище.
Якщо ви хочете серйозніше сприймати інтенсивні властивості, тоді ML та Haskell починають виявляти більш серйозні відмінності. Ще можливо, можливо, розробити загальну для них метамову, але тлумачення типів буде відрізнятися набагато більш систематично, пов'язане з доказово-теоретичною ідеєю фокусування . Хорошим місцем, щоб дізнатися про це, є кандидатська дисертація Ноама Зейльбергера.