Haskell列表的有效连接

时间:2013-10-14 07:19:24

标签: list haskell concat

当我有一个功能时

func :: Int -> Int -> [[a]]
func a b = func' a ++ func' b

,其中

func' :: Int -> [[a]],

有什么可能避免(++)?

3 个答案:

答案 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'