Simon ma zasadniczo rację z ekstensywnego punktu widzenia. Doskonale wiemy, czym jest semantyka współczesnych języków funkcjonalnych i są to tak naprawdę stosunkowo niewielkie odmiany - każdy z nich reprezentuje nieco inne tłumaczenia na monadyczny metaljęzyk. Nawet język taki jak Scheme (dynamicznie wpisany język imperatywny wyższego rzędu z pierwszorzędną kontrolą) ma semantykę zbliżoną do ML i Haskella.
V.
Ale aby dostać się do kategorii odpowiedniej do interpretacji współczesnych języków funkcjonalnych, wszystko staje się dość przerażające. Zasadniczo kończy się konstruowanie wzbogaconej ultrametrycznie kategorii relacji częściowej równoważności w tej dziedzinie. (Jako przykład zob. Birkedal, Stovring i Thamsborg w „Realizowalności semantyki polimorfizmu parametrycznego, referencje ogólne i typy rekurencyjne”). Ludzie, którzy preferują semantykę operacyjną, znają to jako relacje logiczne indeksowane krokowo. (Na przykład zobacz Ahmed, Dreyer i Rossberg „Niezależność reprezentacji państwowej”.) Niezależnie od tego, zastosowane techniki są stosunkowo nowe.
Powodem tej matematycznej złożoności jest to, że musimy być w stanie jednocześnie interpretować parametryczny polimorfizm i stan wyższego rzędu. Ale kiedy już to zrobisz, jesteś w zasadzie wolny od domu, ponieważ ta konstrukcja zawiera wszystkie trudne elementy. Teraz możesz interpretować typy ML i Haskell za pomocą zwykłych tłumaczeń monadycznych. Rygorystyczne effectful funkcji miejsca ML a -> b
przekłada się i leniwa funkcji miejsca Haskell'a przekłada się ⟨ ⟩ → ⟨ b ⟩ z T ( A ) w monadycznej rodzaju skutków ubocznych interpretacji IO monadę z Haskell i⟨ ⟩ → T⟨ B ⟩⟨ ⟩ → ⟨ b ⟩T.( A ) Jest interpretacja typu ML lub Haskell typui → jest wykładniczy w tej kategorii os.⟨ ⟩a
→
Jeśli chodzi o teorię równań, ponieważ oba te języki można opisać tłumaczeniem na nieco odmienne podzbiory tego samego języka, całkiem słusznie jest nazywać je odmianami składniowymi.
Różnica w odczuciu między ML i Haskell faktycznie wynika z intensywnych właściwości dwóch języków - to znaczy czasu wykonania i zużycia pamięci. ML ma model wydajności kompozycji (tj. Koszt czasu / przestrzeni programu można obliczyć na podstawie kosztów czasu / przestrzeni jego podtermów), podobnie jak prawdziwy język nazw według nazw. Rzeczywisty Haskell jest implementowany z wezwaniem na żądanie, rodzajem zapamiętywania, w wyniku czego jego działanie nie jest kompozycyjne - czas potrzebny na ocenę wyrażenia związanego ze zmienną zależy od tego, czy użyto go wcześniej, czy nie. Nie jest to modelowane w semantyce, o której wspomniałem powyżej.
Jeśli chcesz poważniej potraktować właściwości intensywne, ML i Haskell zaczynają wykazywać poważniejsze różnice. Prawdopodobnie nadal można opracować dla nich wspólny język języka, ale interpretacja typów będzie się różniła w znacznie bardziej systematyczny sposób, związany z teoretyczną ideą skupienia . Dobrym miejscem do nauczenia się o tym jest praca doktorska Noama Zeilbergera.