Здравствуйте, Vintik_69, Вы писали:
V_>? Если нельзя, хотелось бы услышать более-менее убедительное обоснование.
Обоснование такое, что ты должен где то накапливать значения разных типов.
Т.е. контейнер, в котором ты это будешь делать, или будет менять свой тип (тогда смотри Beyond Monads, HList, стандартная монада здесь не подходит) или не будет выносить типы элементов в свой тип (Rank-2 полиморфизм), тут можно посмотреть на слабо-типизированный HList или самому построить его аналог. Доставать тогда элементы придётся через cast
Первое — сложно для такой простой задачи (займёт пару десятков строк вместо двух), а второе — сложнее в использовании, т.к. cast надо будет делать уже клиентскому коду.
Поэтому немонадный вариант на комбинаторах выглядит гораздо симпатичнее. А их можно построить какие угодно, например, на классах можно сделать такой
[1,2,3] .+. "abc" .+. [Just 3, Nothing]
Я бы не стал заморачиваться с синтаксисом и сделал просто
Здравствуйте, Vintik_69, Вы писали:
V_>Да, это я пожалуй слишком упростил. Идея была сделать что-то вроде QLC, для чего нужно именовть таблицы. Как-то так:
V_>
do
V_> a <- table [1, 2, 3]
V_> b <- table [4, 5, 6]
V_> filter (a+b == 5)
V_> emit (a/b)
V_>Получив при этом на выходе в каком-то виде AST (а не просто вычислить результат, что просто).
В таком виде построить уже гораздо проще, кажется. Т.к. состояние (тип которого меняется, помнишь?) хранить не надо, в приведённом тобой коде оно передаётсяя в переменных a и b.