这种堕落的monad有没有名字?

时间:2015-10-28 20:28:24

标签: scala monads

List等Scala monad中,我们使用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,是吗?

1 个答案:

答案 0 :(得分:1)

你的类型看起来像一个Functor - 我们来看看它是不是。

在Hoogle中搜索常规的Functor类型签名(在Haskell中:(a -> b) -> f a -> f b)显然会返回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

有各种类型的Functors:

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

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

但是没有一个名字与你的类型签名真正匹配。

让我们检查您的Functor是否符合法律(ref1ref2):

1)

  

如果我们将id函数映射到a   仿函数,我们得到的仿函数应该与   原来的算子。

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

2)

  

组合两个函数,然后将结果函数映射到a   仿函数应该与第一个映射一个函数相同   仿函数然后映射另一个。

同样满意,虽然仅限于您可以在您的仿函数上应用的功能类型,即仅A => A而非A => B

要使它成为Monad,您需要满足这些法则:

左侧身份,正确身份,相关性。

https://wiki.haskell.org/Monad_laws

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