这篇博文有一个有趣的解释,说明如何使用Omega monad对角枚举任意语法.他提供了一个如何操作的示例,从而产生无限的字符串序列.我想做同样的事情,除了生成一个实际数据类型列表,而不是生成字符串列表.例如,
data T = A | B T | C T T
Run Code Online (Sandbox Code Playgroud)
会生成
A, B A, C A A, C (B A) A...
Run Code Online (Sandbox Code Playgroud)
或类似的东西.不幸的是,我的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
Run Code Online (Sandbox Code Playgroud) 我想定义一个无限列表,其中每个元素都是前面所有元素的函数.
所以,n+1列表的第th个元素是f [x1, x2, ..., xn].
这看起来很简单,但我似乎无法理解如何做到这一点.有人可以帮忙吗?