这种退化的 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
方法只接受从 A
到 A
的函数,像这样:
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,您需要满足这些定律:
左身份,右身份,关联性。
在 Scala monads 中,例如 List
,我们有一个 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,是吗?
您的类型看起来像 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,您需要满足这些定律:
左身份,右身份,关联性。