1

当我有一个功能

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

在哪里

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

避免(++)的好可能性是什么?

4

3 回答 3

6

Sequence是列表的替代方案,它可以有效地实现许多操作。

于 2013-10-14T07:29:12.227 回答
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 = []               
于 2013-10-14T14:41:26.040 回答
0

如果你想坚持 List,你可以>>=像这样使用 join ( ) func a b = [a, b] >>= func'

于 2013-10-14T08:41:26.610 回答