Saw*_*yer 5 monads haskell functional-programming
维基百科说:
Monadic 函数(即使用 monad 中的值作为参数或返回值的函数)。
我的理解是函数接受或返回单子是单子函数,但当我遇到这个博客时,它似乎有更严格的定义
作者说:
一元函数是产生一元值的函数。(请注意,我们没有提及其输入类型)
和
形式的函数
f :: a -> m b,其中a是 monad 内部值的类型。(称这些为经典的一元函数)形式的函数
f :: anything -> m b,其中函数的输入实际上并不重要。(将这些称为松散一元函数)
看起来定义相当严格和正式,但我找不到任何关于经典一元函数、松散一元函数的内容。
那么一元函数到底是什么?
我知道您在维基百科中引用了这篇文章
在您的上下文中,“一元函数”指定您将利用 和 完成的隐式上下文处理来编写更大函数的(>>=)函数return。
示例:假设您有 a Mapof Maps 来表示 4 个组合的输出值 "aa" -> 1, "ab" -> 2, "bc" -> 3, "bd" -> 4
import Data.Map (Map, lookup, fromList)
type Map1 = Map Char Int
v1 = fromList [('a',1),('b',2)] :: Map1
v2 = fromList [('c',3),('d',4)] :: Map1
type Map2 = Map Char Map1
myMap = fromList [('a',v1),('b',v2)] :: Map2
Run Code Online (Sandbox Code Playgroud)
你最好的朋友胡格尔这么说lookup :: Ord k => k -> Map k a -> Maybe a
这lookup是所谓的“一元函数”,必须将其组合(此处与其自身)以给出类型的函数:: Char -> Char -> Map2 -> Maybe Int
composedLookup a b m = do
v <- lookup a m
v' <- lookup b v
return v'
Run Code Online (Sandbox Code Playgroud)
或者
composedLookup' a b m = lookup a m >>= (lookup b)
Run Code Online (Sandbox Code Playgroud)
编辑:类型的函数在作为 comonad 的上下文中将m a -> b被称为 comonadic 。我发现这个关于代数/代数的伟大答案非常有启发性,因为它最终从类型和应用方面解释了单子和共单子。m
希望这可以帮助