使用foldl函数将字符串列表转换为元组列表

时间:2017-05-13 20:53:41

标签: haskell purescript

我有以下功能:

fn :: [String] -> [(a,b,c)]
fn lst = case lst of
  [] -> []
  (a:b:c:xs) -> (a,b,c) : fn xs

我想使用foldlfoldr

编写此功能

1 个答案:

答案 0 :(得分:1)

  

我想使用foldlfoldr

编写此功能

这有点难看,但它在技术上用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,则会创建一个元组并将其预先添加到元组列表中。