haskell重复一个字符串中的所有字符

Fau*_*ust 1 recursion haskell loops char

我刚刚开始使用Haskell,并希望做一个小函数,它接受一个整数和一个String来重复String中的每个char,就像整数所暗示的那样.

例如:乘3"你好"输出"hhheeelllooo"

我现在的问题是我不知道如何迭代所有的字符.

multiply::Int->String->String
multiply 1 s = s
multiply i s = multiply (i-1) (take 1 s ++ s)
Run Code Online (Sandbox Code Playgroud)

所以我得到的是"hhhello".所以基本上我需要做的事情如下:

mult::Int->String->String
mult 0 s = []
mult 1 s = s
mult i s = "iterate over s, take each char and call a modified version of the multiply method that only takes chars above"
Run Code Online (Sandbox Code Playgroud)

谢谢你帮助我

Fre*_*Foo 18

使用标准库时,这会变得更容易.首先,重复一个项目完成replicate:

Prelude> replicate 3 'h'
"hhh"
Run Code Online (Sandbox Code Playgroud)

然后,您可以部分地将此函数应用于map字符串:

Prelude> map (replicate 3) "hello"
["hhh", "eee", "lll", "lll", "ooo"]
Run Code Online (Sandbox Code Playgroud)

最后concat将该字符串列表转换为一个字符串:

Prelude> concat (map (replicate 3) "hello")
"hhheeellllllooo"
Run Code Online (Sandbox Code Playgroud)

的组成concatmap缩写为concatMap(这是一个库函数,而不是语言特性).

Prelude> concatMap (replicate 3) "hello"
"hhheeellllllooo"
Run Code Online (Sandbox Code Playgroud)

所以你的功能变成了

mult n s = concatMap (replicate n) s
Run Code Online (Sandbox Code Playgroud)

对于额外的简洁,在写这个自由点式

mult = concatMap . replicate
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`(>> =)`作为列表monad(或多或少是`concatMap`):``hello >> >> = replicate 3`产生`"hhheeellllllooo"` (5认同)

mhw*_*bat 5

有许多方法可以实现与使用其他语言的循环相同的效果,并且larsmans已经向您展示了一种方法,使用map.另一种常见的方法是递归.您已经知道如何处理第一个字符,因此您可以像这样递归列表:

multiply n [] = []
multiply n (x:xs) = replicate n x ++ multiply n xs
Run Code Online (Sandbox Code Playgroud)

larsmans解释了如何replicate运作.对于你的作业,也许你不应该使用类似的库函数replicate,所以你可以用replicate自己的版本替换调用.