2

我想使用http://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#somesome中的功能。Alternative

我试过了:

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


ewrewrew
ewrwwwwww545
43535
435

^CInterrupted. 

如您所见,我中断了输入。如何使用该some功能?

4

1 回答 1

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。)由于 的严格性(++),结果不是延迟计算的,所以你永远不会真正终止。

于 2019-10-27T14:23:54.280 回答