gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:26:42 24 4
gpt4 key购买 nike

我需要帮助理解以下 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中,跟踪器函数对于逐步评估表达式非常有帮助,但不幸的是,GHCi没有这样的功能。请帮我逐步完成代码。谢谢!

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

最佳答案

我认为这里可能让您感到困惑的是,事实上 where 中的 split 与 at 的 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

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

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

关于Haskell - 需要帮助理解这个 split 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com