我想使用some
Alternative
中的http://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#some功能。
我尝试过:
*MyParser Data.Attoparsec.Text Control.Applicative Data.Text> some [3443]
ewrewrew
ewrwwwwww545
43535
435
^CInterrupted.
如您所见,我中断了输入。如何使用some
功能?
考虑当您尝试扩展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
。)但是,由于(++)
的严格性,结果的计算不是很懒惰,因此您永远不会真正终止。