这种退化的 monad 有名字吗?

Is there a name for this degenerate kind of monad?

在 Scala monads 中,例如 List,我们有一个 map 方法将 List[A] 转换为 List[B],像这样:

trait List[A] {
  def map[B](f: (A) => B): List[B]
}

我有类似的东西,除了 map 方法只接受从 AA 的函数,像这样:

trait State[A] {
  def map(f: (A) => A): State[A]
}

有这样一个退化map方法的monad的名称吗?它实际上不再是 monad,是吗?

您的类型看起来像 Functor - 让我们检查一下。

搜索 Hoogle 常规 Functor 类型签名(在 Haskell:(a -> b) -> f a -> f b)returns,显然,Functor:

https://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+f+a+-%3E+f+b

fmap :: Functor f => (a -> b) -> f a -> f b

但是,搜索 (a -> a) -> f a -> f a 没有找到任何相关内容:

https://www.haskell.org/hoogle/?hoogle=%28a+-%3E+a%29+-%3E+f+a+-%3E+f+a

函子有多种类型:

http://blog.tmorris.net/posts/functors-and-things-using-scala/index.html

https://en.wikipedia.org/wiki/Functor

但是 none 个命名的确实匹配您的类型签名。

让我们检查一下您的 Functor 是否满足法则 (ref1, ref2):

1)

if we map the id function over a functor, the functor that we get back should be the same as the original functor.

正确,因为从 id 返回的类型与原始类型相同。

2)

composing two functions and then mapping the resulting function over a functor should be the same as first mapping one function over the functor and then mapping the other one.

也很满意,尽管限于您可以在函子上应用的函数类型,即仅 A => A 而不是 A => B

要使其成为 Monad,您需要满足这些定律:

左身份,右身份,关联性。

https://wiki.haskell.org/Monad_laws

http://eed3si9n.com/learning-scalaz/Monad+laws.html