我有以下类型:
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的函数。但是,我不确定部分应用程序导致的第二个函数返回的结果的类型是什么。
任何见解都会受到赞赏。
答案 0 :(得分:2)
在这种情况下,
Cop
是一个函数吗?我知道Cop
是一个值构造函数,它接受两个Res
类型的参数。
是的,Cop
是一个带有两个参数的函数。它的类型为Cop :: Res -> Res -> Res
。
如果将类型为
Res
的一个参数传递给Cop,则将返回另一个值为类型Res
的函数。
是的。 Cop <$> findmatch a :: Functor f => f (Res -> Res)
部分应用程序产生的第二个函数返回的结果的类型是什么。
这是Cop
构造函数构造的值的类型:它正在构造Res
值。