/ / Какво може да се направи с монада Haskell, който не може да се направи с макрос Lisp и обратно? [затворен] - haskell, макроси, lisp, monads

Какво може да се направи с монада на Хаскел, който не може да се направи с макрос Lisp и обратно? [затворен] - haskell, макроси, lisp, monads

Настоящото ми разбиране е, че макросите могат да реализират всяка концепция, която може да се предположи, включително монаси, защото те "имат компилатора на ръка". Това истина ли е? Например, аз се сблъсках с това връзка

Моля, дайте ми факти и примери, без страстни отговори. Благодаря ти.

Отговори:

7 за отговор № 1

Това е нещо като странно сравнение. Малко е да питаш "какво може да направи една бензинова кола, която дизеловият генератор не може?" Е, добре, тези неща не са наистина еднакви ...

Lisp макроси [за които почти нищо не знам)ви позволяват да правите мета-програмиране за компилиране. Можете да го използвате, за да постигнете всякакви полезни неща, като елиминирате малко кодиран код за дефиниране на цял нов програмен език.

Хаскалските монади са полезен начин за структуриранеопределени видове изчисления. Те правят лесно да направят някои неща, които иначе са малко досадни. (Например да проверите резултата от всяка функция, за да сте сигурни, че е успял, преди да изпълните следващата функция.) Всичко това е по време на изпълнение нещо, все пак; тя няма нищо общо с генерирането на комедийно време.


3 за отговор № 2

Ако можете да внедрите нещо с Lisp, можете да подобрите своя синтаксис с макрос. По този начин макро-частта е само за да изглежда по-добре или / и да намали размера на кода.

Не се нуждаете от макроси за въвеждане на монади. Марийн Хавърбеке направи монада изпълнение използвайки defstruct и defgeneic.

Разбира се defstruct и defgeneric може да използва макроси, за да го приложи магията, нотя в действителност не е необходимо да се въведат монаци.Можете да внедрите монади с капачки.В кода по-долу се използва като елементарно OO с капсулиране и преминаване на съобщение.

(defun maybe (val)
(lambda (msg &optional f m)
(case msg
((bind) (if val (funcall f val) m))
(otherwise val))))

(defun bind (m f)
(funcall m "bind f m)) ;message passing

(defun value (m)
(funcall m "value))    ; message passig

Макросите са функции, които работят върху синтаксиса. В мързелив език като хакелските макроси могат да бъдат заменени от функции, тъй като аргументите се оценяват само когато е необходимо. Напр. В CL, която има нетърпелива оценка, ще ви е необходим макрос, за да направите своя собствена if но можете да направите същото и с функция в Haskell.