gpt4 book ai didi

haskell - 应用 <* 的一元等价物

转载 作者:行者123 更新时间:2023-12-02 17:09:10 26 4
gpt4 key购买 nike

读完 Anthony's response 后上a style-related parser question ,我试图说服自己编写单体解析器仍然可以相当紧凑。

所以而不是

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意思是“序列但丢弃左侧提供的值(value)和使用值(value)”。

当然<<对于liftM2 const来说是一个坏名字。 ,它会建议 <<相当于 flip >>如果我们遵循与 >>= 相同的逻辑和=<< .

我在单个名称下找不到“liftM2 const”。这是因为它没有有用吗?

最佳答案

我不太明白问题所在。每个 monad 也是一个 of applicative functor,因此您也可以简单地在 Monadic 表达式中使用 (*>)

(在回答这个问题时(2011 年),Applicative 不是 Monad 的父类(super class),因此可能需要添加相应的类实例。 )

关于haskell - 应用 <* 的一元等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com