我怎样才能编写一个函数,它将在Haskell中将字符串的每个字母表乘以n次

时间:2017-11-17 20:38:19

标签: haskell

我正在尝试编写一个接受String和Int的函数,并返回字符串的每个元素乘以“int”次。那就是:

duplicate :: String -> Int -> String
duplicate " abc " 2

输出应为

Main >> "   aabbcc   "

2 个答案:

答案 0 :(得分:3)

您应该在Prelude中查看以下函数:

  • map :: (a -> b) -> [a] -> [b]与列表中的每个元素“做某事”
  • replicate :: Int -> a -> [a]复制一项n次
  • concat :: Foldable t => t [a] -> [a]连接,例如将列表列入单个列表

答案 1 :(得分:0)

实际上有很多方法可以达到你想要的效果:

你可以递归地做...

duplicate :: String -> Int -> String
duplicate (c:s) n 
    | s == [] = replicate n c
    | otherwise = replicate n c ++ duplicate s n  

......或正如其他人指出的那样,通过使用一些Prelude函数......

duplicate' :: String -> Int -> String
duplicate' s n = concatMap (replicate n) s

......或使用折叠...

duplicate'' :: String -> Int -> String
duplicate'' s n = foldr1 (\c acc -> replicate n c ++ acc) "" s

您可以使用以下功能:

main :: IO ()
main = do 
    print $ duplicate   "abc" 3 -- "aaabbbccc"
    print $ duplicate'  "abc" 3 -- "aaabbbccc"
    print $ duplicate'' "abc" 3 -- "aaabbbccc"