首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell -需要帮助理解这个拆分函数

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

Stack Overflow用户
提问于 2012-12-14 11:12:39
回答 2查看 162关注 0票数 3

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

代码语言:javascript
复制
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]]

它将具有相同符号的连续数字拆分在不同的列表中,如上所示。在Scheme中,tracer函数在逐步计算表达式方面非常有帮助,但不幸的是,GHCi没有这样的功能。请帮助我逐步了解代码。谢谢!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-14 11:47:09

我认为这里可能会让你感到困惑的是,实际上where内部的split实际上与顶层的split完全不同-内部的split“隐藏”外部的,就像局部变量覆盖全局变量一样。下面的代码做的是完全相同的事情:

代码语言:javascript
复制
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

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

(正如我上面的评论所说,该算法不必要地晦涩、低效,并且在包括零的列表上是不正确的。但这完全是另一回事)。

票数 8
EN

Stack Overflow用户

发布于 2012-12-14 11:49:22

想一想foldl表达式到底产生了什么。当它遍历列表时,它会累积一个元组(c, a)。这个元组的第一个元素c始终是一个数字列表。a是一个数字列表-它恰好是您想要返回的。

当您获得一个新数字时,如果它与c中的数字具有相同的符号,则将其添加到c。如果它有一个与当前c中不同的符号,您可以将整个c放入a中。

最后,您将获得ca的最后一个值的元组。除了不完整之外,a几乎就是您想要的结果:您需要在其中添加c。所以表达式的末尾

代码语言:javascript
复制
(ll, rr) = split l

获取split (即ca)的结果,并将c分配给ll,将a分配给rr。最后的答案就是在末尾附加llrr

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13872121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档