哈斯克尔|将Chars和Int转换为字符串的问题。

时间:2016-11-22 13:42:53

标签: haskell dictionary char show chr

Haskell新手:

你似乎无法弄清楚这一点。

我要做的是取一个字符串,将其转入[Int](带地图ord)

更改一些符合某些要求的数字(在这种情况下为x name="content[]" 3 == 0)。

之后我想将未更改的数字转回char,并更改数字仍为数字。再将它组合成一个字符串..

这是我的问题:

mod

我想要的是:

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

我很难搞清楚如何使用show和map来使这个工作没有来自Char的'_'。感谢。

我的代码:

"h210he216216222"

1 个答案:

答案 0 :(得分: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

(有人可以做到这一点,但没有必要 - 特别是初学者。)