具备extract、duplicate、<*>操作的类型类属于哪种单子风格类型类?
嘿,咱们来聊聊你提到的这个有点特别的类型构造器t吧!
先明确
t的核心操作 你定义的t目前支持三个关键操作:
extract :: t a -> aduplicate :: t a -> t (t a)<*> :: t (a -> b) -> t a -> t b
基于现有操作可推导的函数
正如你所说,咱们确实能从这三个操作出发,实现bind和join:
bind操作
(>>=) :: t a -> (a -> t b) -> t b (>>=) x f = f (extract x)
这里直接通过extract取出t a里的a,再传给生成t b的函数f,逻辑很直接。
join操作
join :: t (t a) -> t a join = extract
更简单,直接把嵌套的t (t a)里的内层t a提取出来就行。
fmap和pure的尴尬处境 你说没法实现无约束的fmap和pure,这点太准确了——严格来说不是完全做不到,但必须依赖额外约束:
fmap:标准的fmap :: (a -> b) -> t a -> t b如果想基于<*>实现,需要先把普通函数a->b提升成t (a->b),但咱们没有pure来干这件事;如果绕开<*>,现有操作里也没有任何能把函数作用在t a内部值上的途径——除非给t加上Functor约束,但这属于额外加的条件,不是原生就能推导的。pure:现有三个操作全是围绕t的结构做拆解、嵌套或应用,完全没有从普通a值构造出t a的能力,所以要实现pure,必须给t加额外的构造逻辑或者约束才行。
和Monad、Comonad的异同
这个t确实有点“两边沾但都不全”的意思:
- 像Comonad:它有Comonad的核心操作
extract和duplicate,但Comonad的定义要求必须先是Functor,咱们的t刚好缺这个关键前提。 - 像Monad:咱们推导出了
bind和join,但Monad同样要求是Functor,还得有pure,这俩咱们要么缺要么需要额外约束才能实现。
所以严格来说,它既不是标准的Monad也不是标准的Comonad,是个介于两者之间、缺少Functor能力的特殊构造。
内容的提问来源于stack exchange,提问作者Clinton
相关产品推荐
相关产品推荐

