applicative <* 的一元等价物
阅读安东尼的回复后<一href="https://stackoverflow.com/questions/7852484/parsec-parser-works-alright-but-could-it-be-done-better">一个与样式相关的解析器问题,我正在尝试说服自己编写单体解析器仍然可以相当紧凑。
因此,
reference :: Parser Transc
reference = try $ do string "#{"
a <- number
char ','
b <- number
char ','
c <- number
char '}'
return $ Outside (a,b,c)
我们可以简单有:
reference3 :: Parser Transc
reference3 = liftM3 (((Outside .).) . (,,))
(string "#{" >> number <<! char ',')
number
(char ',' >> number <<! char '}') where
(<<!) = liftM2 const
这与 Anthony 提供的应用版本非常相似:
reference2 :: Parser Transc
reference2 = ((Outside .) .) . (,,)
<$> (string "#{" *> number2 <* char ',')
<*> number2
<*> (char ',' *> number2 <* char '}')
...除了 < 运算符,它在概念上类似于
<*
定义为 liftA2 const
,意思是“序列但丢弃值并使用左侧提供的值”。
当然<<对于 liftM2 const
来说是一个糟糕的名字,它会表明 <<
相当于 flip >>>
如果我们遵循与 >>=
和 =<<
相同的逻辑。
我在单个名称下找不到“liftM2 const”。这是因为它没有用处吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不太明白问题所在。每个 monad 也是一个 of applicative functor,因此您也可以简单地在 Monadic 表达式中使用
(*>)
。(在回答这个问题时(2011 年),
Applicative
不是Monad
的超类,因此可能需要添加相应的类实例。)I don't quite see the problem. Every monad is also an of applicative functor, so you can simply use
(*>)
in the monadic expressions as well.(At the time of this answer (year 2011),
Applicative
was not a superclass ofMonad
, so it may have been necessary to add a corresponding class instance.)