“一元函数”的正式定义

Saw*_*yer 5 monads haskell functional-programming

维基百科说:

Monadic 函数(即使用 monad 中的值作为参数或返回值的函数)。

我的理解是函数接受或返回单子是单子函数,但当我遇到这个博客时,它似乎有更严格的定义

作者说:

一元函数是产生一元值的函数。(请注意,我们没有提及其输入类型)

形式的函数f :: a -> m b,其中a是 monad 内部值的类型。(称这些为经典的一元函数)

形式的函数f :: anything -> m b,其中函数的输入实际上并不重要。(将这些称为松散一元函数)

看起来定义相当严格和正式,但我找不到任何关于经典一元函数松散一元函数的内容。

那么一元函数到底是什么?

Tit*_*tou 1

我知道您在维基百科中引用了这篇文章

在您的上下文中,“一元函数”指定您将利用 和 完成的隐式上下文处理来编写更大函数的(>>=)函数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

希望这可以帮助