Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops haskell重复字符串中的所有字符_Loops_Haskell_Recursion_Char - Fatal编程技术网

Loops haskell重复字符串中的所有字符

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-&

我刚从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->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”