我有以下功能:
fn :: [String] -> [(a,b,c)]
fn lst = case lst of
[] -> []
(a:b:c:xs) -> (a,b,c) : fn xs
我想使用foldl
或foldr
答案 0 :(得分:1)
我想使用
编写此功能foldl
或foldr
这有点难看,但它在技术上用foldr
来解决它(很容易使它适应foldl
):
fn :: String -> [(Char, Char, Char)]
fn s = snd $ foldr toTriples ([], []) s where
toTriples :: Char -> (String, [(Char, Char, Char)]) -> (String, [(Char, Char, Char)])
toTriples c (cur, tups) | length cur < 2 = (c:cur, tups)
toTriples c (cur, tups) = ([], (c, cur!!0, cur!!1):tups)
作为累加器,它使用一对cur
,正在扫描元组的当前部分,以及tups
,一个元组列表。
如果cur
的长度小于2,则会将当前字符添加到其前面。
如果cur
的长度为2,则会创建一个元组并将其预先添加到元组列表中。