Haskell - 需要帮助理解这个分裂函数

Fai*_*zal 3 haskell

我需要帮助理解以下Haskell函数,

split l = rr++[ll]
            where
              split = foldl
                        ( \ (c,a) e ->
                               case c of
                                [] -> ([e],a)  
                                _ -> if e*(head c) < 0
                                     then ([e],a++[c])
                                     else (c++[e],a))
                        ([],[])
              (ll,rr) = split l

> split [1,2,3,-1,-2,7,4,-3,-5,-6,2,3]
[[1,2,3],[-1,-2],[7,4],[-3,-5,-6],[2,3]]
Run Code Online (Sandbox Code Playgroud)

如上所示,它在单独的列表中使用相同的符号拆分连续的数字.在Scheme中,跟踪器函数在逐步评估表达式时非常有用,但不幸的是,GHCi没有这样的功能.请帮我逐步完成代码.谢谢!

注意:我理解函数的foldl部分.模式匹配部分(split l = rr++[ll](ll,rr) = split l)让我感到困惑!

Ben*_*ood 8

我认为你可能会感到困惑的是,实际上split内部where实际上split与顶层完全不同- 内部一个"阴影"外部,就像局部变量覆盖全局变量一样.以下代码完全相同:

split l = rr++[ll]
            where
              notSplit = foldl
                        ( \ (c,a) e ->
                               case c of
                                [] -> ([e],a)  
                                _ -> if e*(head c) < 0
                                     then ([e],a++[c])
                                     else (c++[e],a))
                        ([],[])
              (ll,rr) = notSplit l
Run Code Online (Sandbox Code Playgroud)

所以我们调用notSplit输入列表,它返回一个元组(ll,rr),然后我们计算rr ++ [ll]并返回它.

(正如我上面的评论所说,算法在包括零的列表上不必要地模糊,低效和不正确.但这完全是另一个问题).