2011-06-14 86 views
2

這樣的IM教育自己的未來哈斯克爾前字母

firstLetter :: IO String 
firstLetter = do 
    x <- getChar 
    if (x == ' ') 
     then return (show x) 
     else firstLetter 

所以它會得到線直到第一線,與空字符 我怎麼能做到這一點,所以如果空行來,它返回開始所有head(x) 例如:

Liquid 
Osone 
Liquid 
(empty line) 
returns 
"LOL" 
+3

提示:空格字符不是換行符。 – 2011-06-14 14:11:20

回答

4

試試這個。庫函數lines會將輸入拆分爲行,所以剩下的就是從列表中的每個字符串中提取第一個字符,直到一個字符串爲空。一個空字符串只是一個空列表,所以你可以檢查這個結束字符串列表的遞歸。

firstLetters :: [String] -> String 
firstLetters (x:xs) 
    | null x = [] 
    | otherwise = head x : firstLetters xs 

main = do 
    contents <- getContents 
    putStrLn . firstLetters . lines $ contents 
4

你見過interact?這將幫助您消除IO,並且這對我來說總是讓事情變得簡單,希望您也能做到。

將其減少爲讀取字符串並返回字符串的問題。

這是一個粗略的去吧。 getLines需要一個字符串,將其拆分爲lines並消耗它們(takeWhile),直到它遇到包含單個空格的行(我不確定您的結束條件,因爲另一個海報表示使用null將停止在第一個空列表中) 。然後它通過這些線,並獲得每個的第一個字符(與map head)。

getLines :: String -> String 
getLines = map head . takeWhile (/= " ") . lines 

main :: IO() 
main = interact getLines 
+1

爲什麼毫無意義? ;) – fuz 2011-06-14 15:33:47

+0

如何創建一個列表,我將在哪裏添加每行第一個字母? – SummerBreak 2011-06-14 15:41:31

+0

由於它看起來更性感,我已將它轉換爲無點風格。 @SummerBreak,代碼確實添加了每一行首字母。 'map head'會遍歷列表中的所有項目,選擇第一個字符並返回結果 – 2011-06-14 15:51:58