在尝试更好地理解Applicative的同时,我查看了<*>的定义,该定义往往被定义为ap,后者又被定义为:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id
Run Code Online (Sandbox Code Playgroud)
查看liftM2和id的类型签名,即:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
我无法理解如何通过传递id,类型签名的相关部分似乎从转换(a1 -> a2 -> r) -> m a1为m (a -> b).我在这里错过了什么?
我正在阅读有关应用程序并尝试理解它的haskellbook.
在书中,作者提到:
因此,使用Applicative,我们的结构和功能应用为我们的价值观提供了Monoid!
monoid如何连接到applicative?
在类别理论中,仿函数是两个类别之间的同态.在Haskell中,它表示applicative functor允许我们在"functor"中应用函数.是否可以将"函数内部的函数"转换为数学或提供其他一些见解?(我知道,仿函数可以Maybe,[]等等,但仍然在努力理解这一概念.)
根据Haskell wikibook,一个Monad被调用的m是Functor另外两个操作:
unit :: a -> m a
join :: m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
这很好,但我有一些不同的东西.粉饰血淋淋的细节,我有一个具有良好的类型unit和join功能,但它fmap没有得到很好的表现(fmap g . fmap f不一定fmap (g.f)).因此,它不能成为一个实例Monad.尽管如此,我还是希望尽可能多地提供通用功能.
所以我的问题是,什么类别的理论结构与monad相似,因为他们有a unit和join?
我意识到在某种程度上,上述问题是不明确的.对于monad而言unit,join定义仅在fmap定义方面有意义.没有fmap,你不能定义任何monad法则,所以任何unit/的定义join都同样"有效".所以我正在寻找除了fmap在这些unit和join函数上定义一些"非monad"定律可能有意义的函数.