В этом сообщении в блоге есть интересное объяснение того, как использовать монаду Омега для перечисления произвольной грамматики по диагонали. Он предлагает пример того, как это сделать, что приводит к бесконечной последовательности строк. Я хотел бы сделать то же самое, кроме того, вместо того, чтобы генерировать список строк, он генерирует список фактического типа данных. Например,
data T = A | B T | C T T
Генерирует
A, B A, C A A, C (B A) A...
Или что-то подобное. К сожалению, мои навыки Haskell все еще созревают, и после нескольких часов игры я не мог сделать то, что хочу. Как это можно сделать?
Как и было запрошено, одна из моих попыток (я пробовал слишком много вещей...):
import Control.Monad.Omega
data T = A | B T | C T T deriving (Show)
a = [A]
++ (do { x <- each a; return (B x) })
++ (do { x <- each a; y <- each a; return (C x y) })
main = print $ take 10 $ a