相关疑难解决方法(0)

为什么'join`不是`Monad`类的一部分

众所周知的事实(>>=)可以使用而实现fmap,join并且join可以使用实现>>=.是否有任何理由我们没有Monad使用join包含和使用以下默认定义来定义类?

join x  = x >>= id
x >>= f = join $ f <$> x
Run Code Online (Sandbox Code Playgroud)

这将允许最小定义包括just (>>=)join,而不是强制(>>=).考虑到类别理论倾向于支持,可能会有点帮助join.

反对修改类的常见理由是我们打破了向后兼容性.但是,在这种情况下,这不会发生 - 我们只增加了定义Monad使用的可能性join.

monads haskell

16
推荐指数
1
解决办法
493
查看次数

我无法理解维基百科对"应用函子"的定义

在Haskell学习函子,应用函子和monad,我在维基百科上找到了这个定义:

在函数编程,具体Haskell中,一个适用函子是像一个的结构单子(return,fmap,join),而不join,或类似的一个函子return.

我无法理解:在我看来,提供return(即pure)一个仿函数不足以获得一个应用仿函数,因为你也需要提供ap(即<*>),这不能用fmapreturn仅用来定义.我错过了什么或维基百科的定义不完全正确吗?

编辑2017-02-08:我在这个答案中找到了关于这个问题的其他有用的见解.

monads haskell functor applicative

12
推荐指数
2
解决办法
528
查看次数

Monoidal Functor是适用的,但是Applicative定义中的Monoid类型类是什么?

适用于Monoidal Functor:

mappend :: f         -> f   -> f
$       ::  (a -> b) ->   a ->   b
<*>     :: f(a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

但是我没有在应用类型类的定义中看到有关Monoid的任何参考,你能告诉我为什么吗?

定义:

class Functor f => Applicative (f :: * -> *) where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b
  GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c
  (*>) :: f a …
Run Code Online (Sandbox Code Playgroud)

haskell applicative

12
推荐指数
3
解决办法
855
查看次数

在应用方面实施Monoidal

Typeclassopedia提供以下练习:

按单位和(**)实现纯和(<*>),反之亦然.

这是MonoidalMyApplicative:

class Functor f => Monoidal f where
  u :: f ()                          -- using `u` rather than `unit` 
  dotdot :: f a -> f b -> f (a,b)    -- using instead of `(**)`

class Functor f => MyApplicative f where
  p     :: a -> f a                  -- using instead of `pure`
  apply :: f (a -> b) -> f a -> f b  -- using instead of `(<**>)`
Run Code Online (Sandbox Code Playgroud)

首先,让我展示Maybe类似的数据类型:

data Option …
Run Code Online (Sandbox Code Playgroud)

haskell

4
推荐指数
1
解决办法
356
查看次数

标签 统计

haskell ×4

applicative ×2

monads ×2

functor ×1