2017-04-24 78 views
0

例如:Haskell的函數,單詞列表轉換爲字符串

wordsToString ["all","for","one","and","one","for","all"] 
"all for one and one for all" 

我的代碼工作沒有類型聲明:

wordsToString [] = "" 
wordsToString [word] = word 
wordsToString (word:words) = word ++ ' ':(wordsToString words) 

但是當我做類型檢查,它顯示這是我應該聲明輸入作爲一個字符串列表,並得到一個字符串作爲輸出,這似乎我錯了字符數的列表:

*Main> :type wordsToString 
wordsToString :: [[Char]] -> [Char] 

我想改變的聲明wordsToString::[(String)]->[String]但它不會工作

+3

'String'只是'[Char]'的類型別名,這意味着它們是_exactly_相同的類型。是什麼讓你認爲'[(String)] - > [String]'意味着「字符串列表並獲得一個字符串作爲輸出」? –

回答

1

我想改變的聲明wordsToString::[(String)]->[String]但它不會工作

不,你想改變的聲明wordsToString :: [String] -> String。你沒有得到一個字符串列表,只有一個。

1

的函數被調用concat

concat :: Foldable t => t [a] -> [a] 
concat xs = foldr (++) [] xs 

在你的情況,你要插入的字符之間的空白。該功能被稱爲intercalate

intercalate :: [a] -> [[a]] -> [a] 

它在intersperse定義。

+0

只要我們建議圖書館的功能,「unwords」似乎是最合適的。 –