当我有一个功能
func :: Int -> Int -> [[a]]
func a b = func' a ++ func' b
在哪里
func' :: Int -> [[a]],
避免(++)的好可能性是什么?
Sequence
是列表的替代方案,它可以有效地实现许多操作。
有一种通用的“差异列表”技术(++)
可以通过重写函数以使用额外的参数来消除,例如f a b == g a ++ b
.
你可以看到它在例如
在您的情况下,这意味着通过基本上内联来重写func
以合并功能,例如:func'
(++)
func :: Int -> Int -> [[a]]
func a b = go a 1 where
go _ _ = _ : _
go _ _ = _ : _ -- replicate func' code, except
go _ 1 = {- [] -} go b 0 -- the base case
go _ 0 = []
如果你想坚持 List,你可以>>=
像这样使用 join ( ) func a b = [a, b] >>= func'
: