无论组合如何,如果只有一种方法可以将 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 具有以下组件。
- a 和 m a 由 Functor
从 a 转换而来
- a -> m b 箭头和将 m m 更改为 m[= 的方法45=]
- 箭头的组成
如果有一个结构有 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
和 >>=
表示,但另一组仅涉及 return
、fmap
和join
可以制定。也就是说,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 定律是结合律。和其他的一样,它可以用 join
和 fmap
而不是 >>=
来表示,它采用以下形式:
join . fmap h . join . fmap k = join . fmap (join . fmap h . k)
基本上,关联性问题可以表示为 monad 箭头组合的关联性 或 表示为作用于类型的 join
操作的关联性m m m a
-- 也就是说,先加入外层好还是先加入内层好呢?
Monad 具有以下组件。
- a 和 m a 由 Functor 从 a 转换而来
- a -> m b 箭头和将 m m 更改为 m[= 的方法45=]
- 箭头的组成
如果有一个结构有 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
和 >>=
表示,但另一组仅涉及 return
、fmap
和join
可以制定。也就是说,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 定律是结合律。和其他的一样,它可以用 join
和 fmap
而不是 >>=
来表示,它采用以下形式:
join . fmap h . join . fmap k = join . fmap (join . fmap h . k)
基本上,关联性问题可以表示为 monad 箭头组合的关联性 或 表示为作用于类型的 join
操作的关联性m m m a
-- 也就是说,先加入外层好还是先加入内层好呢?