无论组合如何,如果只有一种方法可以将 m(m a) 更改为 m a,我可以说是单子的吗

Regardless of composition, can I say monadic if there is only a way to change m(m a) to m a

Monad 具有以下组件。

  1. am a 由 Functor
  2. a 转换而来
  3. a -> m b 箭头和将 m m 更改为 m[= 的方法45=]
  4. 箭头的组成

如果有一个结构有 1,2 不管组成,我能说它是 Monadic 吗?

当然,如果一个结构有1和2,它就可以组合。但是不用担心吗?

已编辑:

我认为结合性、恒等性是关于组合的。如果一个结构完全具有所有功能,那么它只是一个 Monad。我的问题是关于“Monadic”的。 Monad 最重要的因素是 mu(join),所以如果一个结构体只有 mu,那大概是 Monadic 的东西吧?

或 Monadic 只是 Monad 的形容词。
“Monadic”的意思是它是 Monad 的一个因素。
Monad
的 Monadic 结构
Monadic 类型 m a of a Monad,
Monadic 箭头 a -> m b of a Monad,
Monadic 组合 >=> Monad
...

这看起来像两个问题:一个是关于术语的问题,另一个是关于单子定律是否只与“组合”相关的问题。

对于术语问题...

正如@cstml 在评论中指出的那样,范畴论中有一个“monadic functor”的正式定义,但我认为 Haskell 程序员通常不会在这种正式意义上使用“monadic” ,而且您似乎没有问这个问题。

当我使用术语“monadic”时,我通常在“属于 monad 的事物”的意义上使用它。因此,monadic 动作是 m a 形式的表达式,用于 Monad m,当我进行 monadic 编程时,我使用的是 monads。

我通常不会在“monad-like”的意义上使用它,但我可能会说“箭头有一些单子行为,但它们不一定是单子”。另一方面,如果你说“type X is monadic”而没有任何限定,这听起来像是一种不寻常的说法“type X is a monad”。

对于 monad 法则问题...

尽管 Haskell 的 monad 法则通常用 return>>= 表示,但另一组仅涉及 returnfmapjoin可以制定。也就是说,join 运算符本身满足恒等律和结合律,这些律或多或少等同于 >>=.

满足的律

具体来说,任何单子都遵循明显的法则:

fmap f . return = return . f
join . fmap return = id
join . return = id

如果您有支持操作的对象:

return :: a -> m a       -- convert from `a` by functor
join :: m (m a) -> m a   -- change `m m` to `m`

但是不满足这些定律中的任何一个,那么它看起来就不是很“单子”了。

如果确实满足上述规律,则组成定义为:

x >>= f = join (fmap f x)

会自动满足通常的Haskell左右恒等律:

return a >>= k = k a
m >>= return = m

所以这些定律“不仅仅是关于组合”。

上面没有暗示的唯一常用 Haskell 定律是结合律。和其他的一样,它可以用 joinfmap 而不是 >>= 来表示,它采用以下形式:

join . fmap h . join . fmap k = join . fmap (join . fmap h . k)

基本上,关联性问题可以表示为 monad 箭头组合的关联性 表示为作用于类型的 join 操作的关联性m m m a -- 也就是说,先加入外层好还是先加入内层好呢?