如何使用`some`?

问题描述 投票:2回答:1

我想使用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功能?

haskell applicative haskell-alternative some-and-many
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。)但是,由于(++)的严格性,结果的计算不是很懒惰,因此您永远不会真正终止。

© www.soinside.com 2019 - 2024. All rights reserved.