当我有一个功能时
func :: Int -> Int -> [[a]]
func a b = func' a ++ func' b
,其中
func' :: Int -> [[a]],
有什么可能避免(++)?
答案 0 :(得分:6)
Sequence
是列表的替代方案,可以有效地实施许多操作。
答案 1 :(得分:2)
通过重写函数以使用额外参数(++)
,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 = []
答案 2 :(得分:0)
如果您想坚持列表,可以使用加入(>>=
),如下所示:func a b = [a, b] >>= func'
。