如何解决一对固有类型不是天生就不是单子吗?
这是两个相同类型的两个对象的包装
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
内部的问题。我想我可以发明它,但是让它遵守单子法则对我来说似乎并不明显。另外,它应与上述Functor
和Applicative
实例一致。
为什么Pair
不能成为单子?也许可以,但我只是感到困惑?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。