【发布时间】:2018-01-10 23:15:15
【问题描述】:
也就是说,下面的可以优化成Just [1..]吗?
> sequence (map Just [1..])
*** Exception: stack overflow
data61/fp-course 中还有一个更具体的示例,如果存在 Empty 值,则预期提前终止。
seqOptional ::
List (Optional a)
-> Optional (List a)
seqOptional =
foldRight f (Full Nil)
where
f Empty _ = Empty
f _ Empty = Empty
f (Full a) (Full as) = Full (a :. as)
为什么改变前两个模式的顺序会使函数永远循环,好像Empty 永远无法匹配?我隐约明白这样的定义会使f 在无限列表中变得严格,但我看不出实际上是什么原因造成的。
还是这些不相关的问题?
附带问题:堆栈耗尽而不是堆重要吗?
【问题讨论】:
-
map Just [1..]不等同于Just [1..]。结果是[Just 1, Just 2, ...]。 -
我认为 OP 是在询问
sequence是否可以构造理论答案Just [1..]而无需检查其输入的无限多元素。 -
我觉得这里有两个单独的问题。也许考虑将
seqOptional部分作为一个单独的问题提出,并带有您描述的行为的 MCVE。我看不出改变前两种模式的顺序会如何改变任何东西,所以如果你有一个这样做的特定调用,请发布它。 -
“为什么改变前两种模式的顺序会使函数永远循环” - 我无法重现这种行为。请附上 MCVE。您无法将
sequence (map Just [1..])优化为Just [1..],因为前者是底部,而后者不是(这两个术语表示的值不同——第一个甚至没有值)。也许你的问题是,是否可以定义一个函数s使得s = sequence用于有限列表和s (map Just [1..]) = Just [1..]- 答案仍然是否定的,因为s必须检查无限多的元素,然后终止(即废话)。
标签: haskell fold strictness