2017-03-12 48 views
1

我想獲得以下字符串「我想今晚掙脫」的一些旋轉列表。約束條件是輪換不能以「to」或「tonight」開頭。所以旋轉列表是["I want to break free today", "want to break free tonight I", "break free tonight I want to", "free tonight I want to break"]Haskell中的列表旋轉

我寫以下功能:

rotate :: [l] -> [l] 
rotate [] = [] 
rotate (x:xs) = (x:xs) ++ head(x:xs) 

rotate1 :: [a] -> [[a]] 
rotate1 xs = take (length xs) (iterate rotate xs) 

main = do 
print $ rotate1(words("I want to break free tonight")) 

運行該代碼,我所獲得的所有可能的旋轉,但他們形成具有像["want", "I", "to", "break", "free", "tonight"],其是從字符串"want I to break free tonight"不同元素列表的列表。另外,我想看看如何放棄以"to""tonight"這個詞開頭的旋轉。我試圖爲第二部分使用過濾器功能,但我沒有設法解決問題。任何幫助/提示表示讚賞。我注意到我是Haskell的初學者。

回答

1

您想要功能intercalate :: [a] -> [[a]] -> [a]Data.List

從hackage文檔:

插::並[a] - > [[α]] - >並[a]

地嵌入XS XSS相當於(CONCAT(間置XS XSS) )。它 在xss列表之間插入列表xs並連接 結果。

ghci

> import Data.List 
> intercalate " " ["want", "I", "to", "break", "free", "tonight"] 
> "want I to break free tonight" 
+2

或者你可以使用'unwords'這是在前奏。 –

+0

感謝您的建議。我知道函數過濾和插入或unwords,但我的問題是,我必須將它們應用到列表的列表。由於在Haskell中沒有類似的指令,我不知道如何通過列表並將函數應用到每個元素。舉例來說,我不能用unwords([ 「I」, 「希望」, 「來」, 「破發」, 「自由」, 「今夜」],[ 「希望」, 「我」, 「來」,「休息「,」自由「,」今晚「]])獲得名單[」我想今晚休息「,」希望我今晚休息「]。 – Bob

3

運行這段代碼...

的代碼不會運行。它有類型錯誤。

首先,讓我們來修正格式,以便更容易閱讀,刪除多餘的括號

rotate :: [l] -> [l] 
rotate [] = [] 
rotate (x:xs) = (x:xs) ++ head (x:xs) 

rotate1 :: [a] -> [[a]] 
rotate1 xs = take (length xs) (iterate rotate xs) 

main = print $ rotate1 (words "I want to break free tonight") 

這是奇怪的:

rotate (x:xs) = (x:xs) ++ head (x:xs) 

首先,x:xs是整個列表,並且x是該列表的頭部。例如,rotate [1, 2, 3]變爲:

rotate [1, 2, 3] = let x = 1 
         xs = [2, 3] 
        in (x:xs) ++ head (x:xs) 

rotate [1, 2, 3] = (1:[2, 3]) ++ head (1:[2, 3]) 
rotate [1, 2, 3] = [1, 2, 3] ++ head [1, 2, 3] 
rotate [1, 2, 3] = [1, 2, 3] ++ 1 
        -- type error 

++需要雙方的列表。你可能想在這裏是什麼:

rotate (x:xs) = xs ++ [x] 

這給了我們:

rotate [1, 2, 3] = let x = 1 
         xs = [2, 3] 
        in xs ++ [x] 
rotate [1, 2, 3] = [2, 3] ++ [1] 
rotate [1, 2, 3] = [2, 3, 1] 

這是一樣的:

rotate x = tail x ++ [head x] 

您的問題休息...過濾器應該直截了當因爲有一個filter函數可以完全滿足你的需求,而unwords函數可以將單詞列表轉換回字符串。