Dav*_*son 7 haskell types typeclass
看起来像Applicative,Monad和Arrow这样的类型类在类型类中有某种类型的等价类型,例如Alternative,MonadPlus和ArrowPlus.例如,Applicative和Alternative可用于定义以下内容:
(<&&>) :: Applicative f => f a -> f b -> f (a, b)
a <&&> b = (,) <$> a <*> b
(<||>) :: Alternative f => f a -> f b -> f (Either a b)
a <||> b = (Left <$> a) <|> (Right <$> b)
Run Code Online (Sandbox Code Playgroud)
但是,在所有这些情况下(以及ArrowChoice),产品类型类是sum类型的先决条件.是否存在依赖于先决条件类的类型规则或常用函数?该Typeclassopedia触及了这些关系,但不幸的是我无法找到的依赖任何明确的理由.
Arrow基本上是幺半群类别1的类- "monoid"不是指Monoid,而是Haskell类型的产品幺半群.即,使用单位元素()和乘法(,).现在,和类型也构成了一个幺半群,这就是ArrowChoice使用它.这两个类在这个意义上是互补的; ArrowChoice不应该真的是一个子类Arrow.
在monoidal类别中,你可以继续使用monoidal仿函数.这些如何出来取决于你使用什么作为你的类型幺半群.因为(), (,),你得到
class ProdMonoidalFtor f where
prodUnit :: () -> f ()
prodZip :: (f a, f b) -> f (a,b)
type (+) = Either
class SumMonoidalFtor f where
sumUnit :: Void -> f Void
sumZip :: f a + f b -> f (a+b)
Run Code Online (Sandbox Code Playgroud)
原来后者基本上是无用的,因为Void是最初的对象的Hask,这意味着存在恰好一个Void -> a(即absurd),用于所有类型a.然而,什么是一定意义是comonoidal函子有+:
class SumCoMonoidalFtor f where
sumCounit :: f Void -> Void -- I bet you find this useless too, but it's not totally.
sumCozip :: f (a+b) -> f a + f b
Run Code Online (Sandbox Code Playgroud)
这反过来对产品类型没有意义,因为()它是终端对象.
现在有趣的是,ProdMonoidalFtor相当于Applicative:
instance (ProdMonoidalFtor f) => Applicative f where
pure x = fmap (const x) $ prodUnit ()
fs <*> xs = fmap (\(f,x) -> f x) $ prodZip (fs,xs)
Run Code Online (Sandbox Code Playgroud)
有人可能怀疑这Alternative相当于SumMonoidalFtor,但事实并非如此!实际上,它相当于决定性的仿函数,它们对于comonad来说是对monad的应用.
虽然Alternative并且MonadPlus似乎并没有真正的数学支持,但它们基本上是你在"un-Kleisliing" ArrowChoice课程时所获得的,但使用的是Kleisli类别ProdMonoidalFtor.这有点可疑.
1 那只考虑first/ left,second/ right和***/ +++.至于其余的&&&,|||并且arr,这些更具体,IMO属于单独的类.
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |