2
如果我有一个已知列表A :: [Int]
,并希望得到一个新的列表B = newList A
与newList
定义如下:在同一时间做递归和计数数字哈斯克尔
newList :: [Int] -> [Int]
newList [] = []
newList (a:as) | a==0 = f(a) : newList (as)
| a==1 = g(a) : newList (as)
| otherwise = h(a) : newList (as)
其中f, g, h :: Int -> Int
是不重要的功能。
除B
以外,我也想知道在A
中分别有多少个0, 1
。
但自从生成B
递归时,它已经检查了A
中的每个元素是否为a== (0 or 1)
,因此它是冗余的,可以再次单独检查它。
是否有可能得到B
但同时得到有多少个0, 1
在那里A
只检查一次?
首先,您可以用值'f 0'和'g(a)'与值'g 1'交换'f(a)' - 然后是可以的,例如您可以使用'foldr '这样做 - 也许你想在我们破坏它之前先看看它? – Carsten
提示:这个想法是将列表折叠成一个元组''(na,nb,xs)',其中'na'是*看到的数量*'a's,'n''与'b's相同和'xs'就是你在这里用'map h'完成的映射列表(使用'foldr'首先查找'map'的方式 - 附加提示:使用'(:)'和'[]';) – Carsten
' mapAccumR'也可以提供帮助,因为它将折叠与地图结合在一起。 – chi