2017-05-13 35 views
1

變換字符串的列表元組的名單上有以下功能:使用與foldl功能

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

我想用foldlfoldr

+4

祝你好運。 – melpomene

+1

摺疊可以用自然的方式替換每次消耗一個列表元素的遞歸。在這裏,你消耗了三個,所以使用摺疊很麻煩。最後:1)你是否意識到你的程序會崩潰,除非輸入列表的長度不是3的倍數? 2)你的函數有錯誤的類型,它應該返回一個三重字符串。 – chi

+1

感謝澄清'fold'函數可以代替遞歸,關於'1'和'2'點你是完全正確的,真正的函數簽名是'[String] - > Maybe [(String,String,String)]' ,我已經包含這個例子來使它更簡單。我認爲使用這個簽名處理兩點 –

回答

1

寫這個功能我想寫這個功能使用foldlfoldr

這有點難看,但它在技術上解決了它w第i個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,它將創建一個元組並將其前置到元組列表中。