具有可变输入数量的Haskell生成器?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有可变输入数量的Haskell生成器?相关的知识,希望对你有一定的参考价值。
此刻我的代码看起来像这样:
gen (x:[]) = [[a] | a <- (someOp x)]
gen (x:y:[]) = [[a,b] | a <- (someOp x), b <- (someOp y)]
gen (x:y:z:[]) = [[a,b,c] | a <- (someOp x), b <- (someOp y), c <- (someOp z)]
...依此类推
是否有可能用gen(x:xs)来结束其余部分?
答案
您可以递归执行此操作:
gen [] = [[]]
gen (x:xs) = [ a:g | a <- someOp x, g <- gen xs ]
在每一步骤中,您将获取上一步生成的所有列表,并将它们与someOp
的每个结果组合在一起。
您可以通过替换来验证这是否会变成特殊情况。
另一答案
对于您在此处构造的函数,已经存在一个更通用的函数:traverse :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
。您的traverse :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
等效于:
gen
以上是关于具有可变输入数量的Haskell生成器?的主要内容,如果未能解决你的问题,请参考以下文章