一对固有类型不是天生就不是单子吗?

问题描述

这是两个相同类型的两个对象的包装

data Pair a = Pair a a deriving (Show)
--newtype Pair a = Pair (a,a) deriving (Show) -- not this

通过使映射函数同时作用于两个值,似乎很容易将其变成functor

instance Functor Pair where
  fmap f (Pair a b) = Pair (f a) (f b)

仿函数定律似乎也成立,我错了吗?好的,该实例似乎毫无用处,但至少对我而言看起来很直观:给定一个函数和一个两个值的包装,而不是这样做,我还要做什么呢?

我们也可以将其设置为applicative functor

instance Applicative Pair where
  pure a = Pair a a
  Pair f g <*> Pair x y =  Pair (f x) (g y)

即使我尚未检查组成和交换定律是否得到验证(同一性和同构性也已得到验证)。像以前一样,我看到这个实例有些琐碎,但很容易看:除了它之外,我还会做什么?

但是,我不知道如何将其设置为Monad(>>=)的第二个要素应该是作用于给定于Monad类型构造函数的类型的一个实体上的函数,对吧?但是,在这种情况下,Pair包含两个值,可能不同。因此,存在一个选择类型Int -> Pair Int的函数应如何作用于Pair 3 4内部的问题。我想我可以发明它,但是让它遵守单子法则对我来说似乎并不明显。另外,它应与上述FunctorApplicative实例一致。

为什么Pair不能成为单子?也许可以,但我只是感到困惑?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...