2010-09-23 111 views
0

我有兩個功能:打印字符串先後

lowerString :: [Char] -> [Char] 
lowerString = filter (/='_') 

upperString :: [Char] -> [Char] 
upperString [] = [] 
upperString (x:xs) 
    | x == '_' = x : upperString (tail xs) 
    | otherwise = ' ' : upperString(xs) 

如果我申請他們的 「_A_B_CDEF」:

upperString "_A_B_CDEF"將返回___
lowerString "_A_B_CDEF"將返回ABCDEF
(不含空格)

這個想法是「有」字母(需要更大的練習)。

我從來沒有使用過Haskell輸入/輸出(實際上這是我在Haskell的第5天)。如何編寫一個接收[Char]作爲輸入並將兩個字符串作爲輸出打印的函數?

+0

這聽起來像家庭作業 - 你可以評論,如果它然後修復標籤?一般來說,您可以在教程中或通過hoogle找到這些信息。如[打印](http://haskell.org/hoogle/?hoogle=String+-%3E+IO+%28%29)或[閱讀字符串](http://haskell.org/hoogle/?hoogle=%圖3a%3A + IO +字串)。 – 2010-09-23 21:18:50

+0

這不是功課。 – 2010-09-23 21:19:53

+0

太棒了,然後看到Kennys的回答並使用hoogle(這太棒了)。你可能會很快找到'getLine'和'putStrLn'。 – 2010-09-23 21:26:53

回答

1

首先,我會重寫你的函數是這樣的:

lowerString :: String -> String 
upperString :: String -> String 
lowerString = filter (/= '_') 
upperString = filter (== '_') 

或者,如果你需要的行爲,每一個第二個下劃線可能會跳過(如:upperString "_a__bc" == "__"),像這樣:

upperString('_':_:xs)='':upperString xs upperString('':「」)=「」 upperString(_:xs)='':upperString xs upperString「」=「」

順便說一下,現在upperString的輸出與描述中的函數定義不同,因爲字符不再被空格替換,而是簡單地被刪除。

對於您的輸出問題:您必須在IO monad中執行所有輸出。這並不困難,您可以使用do塊來以一種必要的外觀和感覺來覆蓋它。它可以做一些對環境的任何行動,有特殊類型的IO連接到輸出,所以你只能在IO單子本身內運行它們,或DO塊中:

printStrings :: String -> IO() --() is empty value 
printStrings s = do 
    putStrLn $ upperString s --This will be executed, like in an imperative language 
    putStrLn $ lowerString s 

考慮閱讀this維基教科書章節關於簡單的IO。