2016-11-22 69 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

非常感谢!是的..混淆了地图和递归试图结合他们从两个以前的功能。达成了一些不完全理解两者背后的原则......非常感谢!很好解释! –

相关问题