如何使用某些功能?

时间:2019-10-26 21:15:00

标签: haskell

我想使用Alternativ http://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#some中的some函数。

我尝试过:

*MyParser Data.Attoparsec.Text Control.Applicative Data.Text> some [3443]


ewrewrew
ewrwwwwww545
43535
435

^CInterrupted. 

如您所见,我中断了输入。如何使用some函数?

1 个答案:

答案 0 :(得分:0)

考虑一下当您尝试扩展some [1]时会发生什么:

some [3443] == some_v
            == liftA2 (:) [3443]  many_v  -- definition of some_v
            == [x:y | x <- [3443], y <- many_v]  -- definition of liftA2
            == [x:y | x <- [3443], y <- some_v ++ pure []] -- definition of many_v

在这里,我立即将<|>替换为(++)。由于(++)的第一个参数严格,因此您必须先评估some_v才能继续进行,但这会使我们陷入无限循环。


Alternative被描述为适用函子的等分线。如果我理解正确,some xs就是无限的非空列表,您可以一次从xs中获取一个元素来创建。

some [3443] == [[3443], [3443, 3443], [3443, 3443, 3443], ...]

many xs将是列表的无限列表(可能是空的)(实际上只是[]:some xs。)由于(++)的严格性,因此结果的计算不是很懒惰,所以您永远不会真正终止。