小编S4e*_*3sm的帖子

为什么 >> 在 haskell 中重复右侧操作数

我正在寻找重复字符串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)

但我仍然不明白它是如何工作的。谁能解释这种行为?

monads haskell do-notation

2
推荐指数
1
解决办法
140
查看次数

递归函数的惰性模式

我将找到解决这个问题的方法:

将给定列表拆分为具有给定子列表长度和跳过长度的子列表,例如:

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详细信息是:

  • n 是子列表的长度:Int
  • f 是跳过的长度:Int
  • xs 是输入列表:[a]

这是我的解决方案:

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)

但这个解决方案并不懒惰,例如 …

recursion haskell list lazy-evaluation

2
推荐指数
1
解决办法
255
查看次数

标签 统计

haskell ×2

do-notation ×1

lazy-evaluation ×1

list ×1

monads ×1

recursion ×1