在List
等Scala monad中,我们使用map
方法将List[A]
转换为List[B]
,如下所示:
trait List[A] {
def map[B](f: (A) => B): List[B]
}
我有类似的东西,但map
方法只接受A
到A
的功能,如下所示:
trait State[A] {
def map(f: (A) => A): State[A]
}
这样的退化map
方法的monad是否有名称?它不再是monad,是吗?
答案 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是否符合法律(ref1,ref2):
1)
如果我们将id函数映射到a 仿函数,我们得到的仿函数应该与 原来的算子。
是的,因为从id
返回的类型与原始类型相同。
2)
组合两个函数,然后将结果函数映射到a 仿函数应该与第一个映射一个函数相同 仿函数然后映射另一个。
同样满意,虽然仅限于您可以在您的仿函数上应用的功能类型,即仅A => A
而非A => B
。
要使它成为Monad,您需要满足这些法则:
左侧身份,正确身份,相关性。