Можно ли в общем случае реализовать оператор amb в D?
http://www.haskell.org/haskellwiki/Amb
http://www.randomhacks.net/articles/2005/10/11/amb-operator
Я думаю о том, что:
amb([1, 2]) * amb([3, 4, 5]) == amb([3, 4, 5, 6, 8, 10])
amb(["hello", "world"]) ~ amb(["qwerty"]) == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "world"]) ~ "qwerty" == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "very long string"]).length = amb([5, 16])
В последних двух примерах действительно нужно "поднять" значения ~ и .length в контекст amb (монада?). В первых двух примерах операторы должны просто применяться к содержимому amb.
Я дал ему краткий пример, но у меня возникают проблемы при попытке поднять операторы/методы/свойства wrapped-type (*, ~ и .length в этом примере). Как это сделать в D?
Спасибо,
Крис.