了解<$>运算符

时间:2019-08-06 20:56:01

标签: haskell functional-programming

我有以下类型:

newtype Rep f a = Rep { runRep :: String -> f (String, a) }

类型Rep f a是一个有状态计算,将String作为初始状态,并生成(String,a)作为计算结果。计算结果包装在函子f中。

Rep的适用实例如下:

instance Monad f => Applicative (Rep f) where 
    pure x = Rep $ \s -> pure (s, x)
    Rep f <*> Rep x = Rep $ \s -> do 
        (s',rf)  <- f s 
        (s'',rx) <- x s'
        return (s'', rf rx)

Rep的monad实例如下:

instance Monad f => Monad (Rep f) where 
   return x = pure x 
   Rep a >>= f = Rep $ \s -> do
    (s', ya) <- a s
    let (Rep f') = f ya
    (s'', yf) <- f' s'
    pure (s'', yf)

我具有以下数据类型和功能:

data TD = Empty | Fol TD TD | Letters [Char]

data Res = Nil | Character Char | Cop Res Res | Special [Res]

findmatch (Fol a b) = do
   ra <- findmatch a
   rb <- findmatch b
   pure (Cop ra rb)

findmatch (Fol a b) = Cop <$> findmatch a <*> findmatch b

我很难理解涉及findmatch的{​​{1}}的第二个定义如何工作。我知道<$>具有以下类型声明:

<$>

(<$>) :: (Functor f) => (a -> b) -> f a -> f b f <$> x = fmap f x 的第一个参数应该是一个函数,而第二个参数应该是包装在函子中的值。 <$>的结果是包装在函子中的值,但是在这种情况下findmatch是函数吗?我知道Cop是一个值构造函数,带有两个Res类型的参数。如果将类型Res的一个参数传递给Cop(我认为在Cop中会发生这种情况),这将返回另一个值类型为Res的函数。但是,我不确定部分应用程序导致的第二个函数返回的结果的类型是什么。

任何见解都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

  

在这种情况下,Cop是一个函数吗?我知道Cop是一个值构造函数,它接受两个Res类型的参数。

是的,Cop是一个带有两个参数的函数。它的类型为Cop :: Res -> Res -> Res

  

如果将类型为Res的一个参数传递给Cop,则将返回另一个值为类型Res的函数。

是的。 Cop <$> findmatch a :: Functor f => f (Res -> Res)

  

部分应用程序产生的第二个函数返回的结果的类型是什么。

这是Cop构造函数构造的值的类型:它正在构造Res值。