多个运算符的评估顺序以中缀形式

亚历克斯

鉴于这种:

 data Base = Base {
   key1 :: Text,
   key2 :: Text,
   key3 :: Text
 } deriving (Show)

instance FromJSON Base where
  parseJSON (Object v) = Base <$>
                         ((v .: "base123") >>= (.: "key1")) <*>  -- 1
                         ((v .: "base123") >>= (.: "key2")) <*>  -- 2
                         ((v .: "base123") >>= (.: "key3"))      -- 3

  parseJSON _ = mzero

什么,其中的中缀运算符的顺序<$><*><*>应用?换句话说,如果我以前缀形式重写它:

instance FromJSON Base where
      parseJSON (Object v) = Base <$> ((<*>) ((v .: "base123") >>= (.: "key1")) $ (<*>) ((v .: "base123") >>= (.: "key2")) ((v .: "base123") >>= (.: "key3")))

      parseJSON _ = mzero

(通知$运算符),是否会<*>首先评估第二个元素的右边部分,因为只有在这种情况下才有意义,因为第一个<*>元素需要2个参数?由于它需要2个参数,因此我们也必须使用$

我可能会问我的问题,以致难以理解我的意思,但我希望你确实理解。

自己

实际上您的前缀形式不是很正确,应该是这样的:

parseJSON (Object v) = ((<*>)
                        ((<*>)
                         ((<$>) Base ((v .: "base123") >>= (.: "key1")))
                         (((v .: "base123") >>= (.: "key2"))))
                        (((v .: "base123") >>= (.: "key3"))))

上面的定义仍然不是完整的前缀形式。你必须采取>>=.:向左,使他们完全前缀。话虽这么说,要找到以infix形式表示的多个运算符的确切排序顺序,建议您使用ghci进行操作,以获取更多有关类型的见解。首先,请检查所有运算符的关联性和优先顺序:

λ> :i (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
infixl 4 <$>
λ> :i (<*>)
(<*>) :: f (a -> b) -> f a -> f b
infixl 4 <*>

因此,它们都保持关联并且具有相同的优先级。定义的中缀形式非常清楚如何进行评估:评估从左开始,首先<$>应用于上方Base,然后再应用两个<*>功能。该类型Base最初应用于<$>

λ> :t Base
Base :: Text -> Text -> Text -> Base
λ> :t (Base <$>)
(Base <$>) :: Functor f => f Text -> f (Text -> Text -> Base)

现在,((v .: "base123") >>= (.: "key1"))将其应用于上述类型的结果:

λ> let (Object v) = undefined :: Value
λ> :t (Base <$> ((v .: "base123") >>= (.: "key1")))
(Base <$> ((v .: "base123") >>= (.: "key1"))) :: Parser (Text -> Text -> Base)

您会看到它返回一个包装在Parser类型中的函数要从类型中提取底层函数Parser,必须使用<*>

λ> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
λ> :t (Base <$> ((v .: "base123") >>= (.: "key1")) <*>)
(Base <$> ((v .: "base123") >>= (.: "key1")) <*>) :: Parser Text -> Parser (Text -> Base)

您可以按照类似的步骤查看如何将其应用于函数定义的其他部分。最后,您将获得的类型Parser Base

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个运算符的评估顺序以中缀形式

来自分类Dev

Java点运算符评估的顺序

来自分类Dev

比较运算符的评估顺序?

来自分类Dev

调用运算符参数评估顺序

来自分类Dev

布尔运算符评估顺序

来自分类Dev

“:-”中缀运算符的名称

来自分类Dev

Haskell美元运算符和中缀运算符

来自分类Dev

运算符优先级和评估顺序

来自分类Dev

混合逻辑和关系运算符的评估顺序?

来自分类Dev

有关运算符->和()的评估顺序

来自分类Dev

C ++:评估顺序运算符时忽略括号

来自分类Dev

对部分应用的中缀运算符的困惑

来自分类Dev

充当无管道的中缀运算符?

来自分类Dev

缺少参数的中缀运算符

来自分类Dev

Scala - super 的中缀运算符不能称为中缀

来自分类Dev

如何评估包含多个^ =运算符的表达式?

来自分类Dev

Bash OR运算符不评估多个变量

来自分类Dev

如何评估包含多个^ =运算符的表达式?

来自分类Dev

&=运算符的评估(简短)

来自分类Dev

当涉及多个运算符时,如何确定执行顺序?

来自分类Dev

如何创建%between%运算符之间的中缀?

来自分类Dev

为什么允许:=作为中缀运算符?

来自分类Dev

在Scala中创建中缀运算符

来自分类Dev

如何在R中查找中缀运算符的文档?

来自分类Dev

Haskell中的中缀运算符优先级

来自分类Dev

Haskell:中缀(`:`)运算符是否具有左侧标识?

来自分类Dev

groovy dsl-中缀运算符可能吗?

来自分类Dev

重新定义中缀运算符的特征

来自分类Dev

为什么在教堂中“减少”中缀运算符?