2016-11-22 81 views
0

Haskell的新手:Haskell |將Chars和Int轉換爲字符串時出現問題。

嗨似乎無法弄清楚這一點。

我所試圖做的是一個字符串,把它在一個[INT](配圖ORD)

變化的一些數字是滿足的東西(在這種情況下,x mod 3 == 0)。

事後我想把未改變的數字變回char,並且改變數字仍然是數字。結合這再次將一個字符串..

這是我的問題:

*Main> fromStringToList "hihello" 
[104,105,104,101,108,108,111] 
*Main> changeB3 [104,105,104,101,108,108,111] 
"'h'210'h''e'216216222" 

我要的是:

"h210he216216222" 

我堅持搞清楚如何利用展會和地圖獲得這個工作沒有Char的'_'。謝謝。

我的代碼:

import Data.Char 

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

{- 
    changeB3 
    PRE: True 
    POST: every Int that can be divided by 3 is multiplied by 2 and 
kept as int, otherwise transformed to char 

-} 
changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

回答

2

我會評論你的代碼。

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

第二行是冗餘:當myString是空的,map返回[]反正。你應該刪除它。

changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

你似乎在這裏感到困惑。您使用遞歸函數,但想要使用map。您在這裏使用遞歸或map,而不是兩者。

假設您想要使用map,您應該首先定義如何處理單個Int

changeB3Single :: Int -> String 
changeB3Single x | x `mod` 3 == 0 = ... 
       | otherwise  = ... 

然後你map超過整個列表。第一次嘗試可能是

changeB3 :: [Int] -> String 
changeB3 xs = map changeB3Single xs -- type error! 

但是這不會工作,因爲這裏map返回一個字符串列表,而不是一個字符串。我們只需要連接它們。

changeB3 xs = concat (map changeB3Single xs) 

事實上,concat (map ...)是如此常見,它在圖書館自身的功能:

changeB3 xs = concatMap changeB3Single xs 

(有人可能會作出這樣的pointfree,但沒有必要 - 尤其是對初學者。 )

+0

非常感謝!是的..混淆了地圖和遞歸試圖結合他們從兩個以前的功能。達成了一些不完全理解兩者背後的原則......非常感謝!很好解釋! –