【发布时间】:2012-12-14 03:12:38
【问题描述】:
我需要帮助理解以下 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]]
如上所示,它将具有相同符号的连续数字拆分到单独的列表中。在 Scheme 中,tracer 函数在逐步评估表达式时非常有用,但不幸的是,GHCi 没有这样的功能。请帮助我逐步完成代码。谢谢!
注意:我理解函数的 foldl 部分。真正让我困惑的是模式匹配部分(split l = rr++[ll] 和(ll,rr) = split l)!
【问题讨论】:
-
哪个模式匹配部分 - 你的意思是 case 表达式?有什么让你困惑的地方?
-
我的意思是,算法本身非常令人困惑,而且,好吧,彻头彻尾的反常:) - 在以 0 开头的列表上尝试它。但你应该清楚它是那个还是语法或那个你被困住了。
-
不管怎样,GHCi 可以进行追踪。不过,我现在不记得是怎么回事了……
-
我理解 foldl 的 case 表达部分。 split l = rr++[ll] 和 (ll,rr) = split l 让我很困惑,谢谢! :) 是的,在别处问过,被告知这是错误的代码!
-
我编辑了问题以在此处包含您的说明,希望您不介意(请随意使用不同的方法)
标签: haskell