我正在寻找重复字符串n时间的解决方案。我duplicate n str = [1..n] >> str从这个解决方案中找到了。我想知道为什么这个方法会重复str.
我搜索了一下>>,发现了这一点:
k >> f = k >>= \_ -> f
Run Code Online (Sandbox Code Playgroud)
和
a >> b >> c >> d
-- is is equivalent to
do a
b
c
d
Run Code Online (Sandbox Code Playgroud)
然后我试试这个
ghci> do [1..3]; "a"
"aaa"
Run Code Online (Sandbox Code Playgroud)
但我仍然不明白它是如何工作的。谁能解释这种行为?
我将找到解决这个问题的方法:
将给定列表拆分为具有给定子列表长度和跳过长度的子列表,例如:
groupEvery 3 1 [1..6] = [[1,2,3], [2,3,4], [3,4,5], [4,5,6]]
groupEvery 3 2 "abcdefghij" = [ "abc", "cde", "efg", "ghi", "ij"]
Run Code Online (Sandbox Code Playgroud)
参数groupEvery n p l详细信息是:
这是我的解决方案:
groupEvery :: Int -> Int -> [a] -> [[a]] -> [[a]]
groupEvery n p xs acc
| length xs <= n = acc ++ [xs]
| otherwise = groupEvery n p dropped (acc++[segment])
where
dropped = drop p xs
segment = take n xs
Run Code Online (Sandbox Code Playgroud)
但这个解决方案并不懒惰,例如 …