我正在尝试编写一个接受String和Int的函数,并返回字符串的每个元素乘以“int”次。那就是:
duplicate :: String -> Int -> String
duplicate " abc " 2
输出应为
Main >> " aabbcc "
答案 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"