Loops haskell重复字符串中的所有字符
我刚从Haskell开始,想做一个小函数,它接受一个整数和一个字符串,并根据整数的含义重复字符串中的每个字符 e、 g.:乘以3“hello”将输出“hheeelllooo” 我现在的问题是,我不确定如何迭代所有字符Loops haskell重复字符串中的所有字符,loops,haskell,recursion,char,Loops,Haskell,Recursion,Char,我刚从Haskell开始,想做一个小函数,它接受一个整数和一个字符串,并根据整数的含义重复字符串中的每个字符 e、 g.:乘以3“hello”将输出“hheeelllooo” 我现在的问题是,我不确定如何迭代所有字符 multiply::Int->String->String multiply 1 s = s multiply i s = multiply (i-1) (take 1 s ++ s) 所以我得到的是“你好”。所以基本上我需要做一些事情,比如: mult::Int-&
multiply::Int->String->String
multiply 1 s = s
multiply i s = multiply (i-1) (take 1 s ++ s)
所以我得到的是“你好”。所以基本上我需要做一些事情,比如:
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"
感谢您帮助我当您使用标准库时,这会变得更容易。首先,重复一个项目是通过
replicate
:
Prelude> replicate 3 'h'
"hhh"
然后,您可以使用此函数并将其映射到字符串上:
Prelude> map (replicate 3) "hello"
["hhh", "eee", "lll", "lll", "ooo"]
最后,concat
将字符串列表合并为一个字符串:
Prelude> concat (map (replicate 3) "hello")
"hhheeellllllooo"
concat
和map
的组合可以缩写为concatMap
(这是一个库函数,不是语言功能)
所以你的函数变成了
mult n s = concatMap (replicate n) s
为了更加简洁,请将其写成
当您使用标准库时,这会变得更容易。首先,重复一个项目是通过
replicate
:
Prelude> replicate 3 'h'
"hhh"
然后,您可以使用此函数并将其映射到字符串上:
Prelude> map (replicate 3) "hello"
["hhh", "eee", "lll", "lll", "ooo"]
最后,concat
将字符串列表合并为一个字符串:
Prelude> concat (map (replicate 3) "hello")
"hhheeellllllooo"
concat
和map
的组合可以缩写为concatMap
(这是一个库函数,不是语言功能)
所以你的函数变成了
mult n s = concatMap (replicate n) s
为了更加简洁,请将其写成
有许多方法可以实现与其他语言中的循环相同的效果,larsmans向您展示了一种方法,即使用
map
。另一种常见的方法是递归。您已经知道如何处理第一个字符,因此可以像这样在列表中递归:
multiply n [] = []
multiply n (x:xs) = replicate n x ++ multiply n xs
拉斯曼解释了
复制
的工作原理。对于你的家庭作业,也许你不应该使用像replicate
这样的库函数,所以你可以用你自己的版本来代替对replicate
的调用。有很多方法可以达到与使用其他语言的循环相同的效果,larsmans向你展示了一种方法,使用map
。另一种常见的方法是递归。您已经知道如何处理第一个字符,因此可以像这样在列表中递归:
multiply n [] = []
multiply n (x:xs) = replicate n x ++ multiply n xs
拉斯曼解释了
复制
的工作原理。对于你的家庭作业,也许你不应该使用像replicate
这样的库函数,所以你可以用你自己的版本来替换对replicate
的调用。另一种基于单子列表性质的方法。您希望对列表的每个元素应用一个函数。
为此,只需将列表绑定到函数,如下所示
# "hello" >>= replicate 3
或者
要移除翻转
# let g = (=<<) . replicate
#让g=(=另一种方式基于列表的一元性质。
您希望对列表的每个元素应用一个函数。
为此,只需将列表绑定到函数,如下所示
# "hello" >>= replicate 3
或者
要移除翻转
# let g = (=<<) . replicate
#设g=(=您可以使用应用程序函子来实现此目的:
import Control.Applicative
multiply n = (<* [1..n])
--- multiply 3 "hello" --> "hhheeellllllooo"
导入控件。应用程序
乘以n=(“hheellloo”
您可以为此使用应用程序函子:
import Control.Applicative
multiply n = (<* [1..n])
--- multiply 3 "hello" --> "hhheeellllllooo"
导入控件。应用程序
乘以n=(“hheellloo”
这是一个家庭作业吗?不,第一个是作业,把第一个字母加倍。但是我得到了这个,并且想做更多的事情。基本上我不明白如何循环。我的尝试是把我从列表中访问的每一个字母都删除,就像我在java或C++中所做的那样。但是我猜这在下面是不起作用的,我们不这样做。倾向于在Haskell中迭代;函数式编程适合于递归解决方案,如下面的mhwombat。这是一个家庭作业吗?不,第一个是家庭作业,乘以第一个字母-但我得到了这个字母,并想做更多的事。基本上我不知道如何循环。我的尝试是删除每个字母我从列表中访问,就像我在java或C++中所做的那样,但是我猜这在下面的注释中是不起作用的,我们不倾向于在Haskell中迭代;函数编程本身就适用于递归的解决方案,比如MHOBAT BAT。非常感谢,这对我来说比我在MyDy中所做的更简单的方法也可以使用<代码>(>
对于列表单子(或多或少是concatMap
):“hello”>=replicate 3
产生“hhheellloo”
非常感谢,这似乎比我想的更简单。对于列表单子(或多或少是concatMap
),你也可以使用(>=)
):“hello”>=replicate 3
产生“hhheellloo”