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)
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)
的组成concat和map缩写为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)
有许多方法可以实现与使用其他语言的循环相同的效果,并且larsmans已经向您展示了一种方法,使用map.另一种常见的方法是递归.您已经知道如何处理第一个字符,因此您可以像这样递归列表:
multiply n [] = []
multiply n (x:xs) = replicate n x ++ multiply n xs
Run Code Online (Sandbox Code Playgroud)
larsmans解释了如何replicate运作.对于你的作业,也许你不应该使用类似的库函数replicate,所以你可以用replicate自己的版本替换调用.