Haskell 在Wadler'中混淆映射函数定义;s纸

Haskell 在Wadler'中混淆映射函数定义;s纸,haskell,functional-programming,category-theory,Haskell,Functional Programming,Category Theory,有人能帮我理解Wadler教授的原始论文《函数式编程的单子》(Haskell)中的映射定义吗 我理解为什么它被声明为从f::a->b到g::Ma->Mb的态射。为什么它被混淆地定义为似乎取了两个参数f和m。m是一个计算(具有副作用的函数),我假设它可以定义为数据或类型。第二个参数是返回函数的第一个参数: map : (a -> b) -> m a -> m b map = \(f : a -> b) -> \(x : m a) -> x >

有人能帮我理解Wadler教授的原始论文《函数式编程的单子》(Haskell)中的映射定义吗


我理解为什么它被声明为从f::a->b到g::Ma->Mb的态射。为什么它被混淆地定义为似乎取了两个参数f和m。m是一个计算(具有副作用的函数),我假设它可以定义为数据或类型。

第二个参数是返回函数的第一个参数:

map : (a -> b) -> m a -> m b
map = \(f : a -> b) -> \(x : m a) ->
        x >>= (\a -> return (f a))

第二个参数是返回函数的第一个参数:

map : (a -> b) -> m a -> m b
map = \(f : a -> b) -> \(x : m a) ->
        x >>= (\a -> return (f a))

形式的定义

foo x y z = bar
等同于以下所有选项

foo x y = \z -> bar
foo x = \y z -> bar
foo = \x y z -> bar
因此,发布的代码也可以写成

map :: (a → b) → (M a → M b)     
map f = \m -> m >= \a -> unit (f a)
-- which is parsed as
-- map f = \m -> (m >= (\a -> (unit (f a))))

以上事实上强调了
map
将函数映射到函数,并且可以说更清晰。但是,它有点冗长,因此在Haskell中,尽可能多地将参数移到
=
的左侧是很常见的

foo x y z = bar
等同于以下所有选项

foo x y = \z -> bar
foo x = \y z -> bar
foo = \x y z -> bar
因此,发布的代码也可以写成

map :: (a → b) → (M a → M b)     
map f = \m -> m >= \a -> unit (f a)
-- which is parsed as
-- map f = \m -> (m >= (\a -> (unit (f a))))

以上事实上强调了
map
将函数映射到函数,并且可以说更清晰。但是,它有点冗长,因此在Haskell中,尽可能多地将参数移到
=
的左侧是很常见的。

返回函数时仍然保留其参数<代码>(a->b)->(MA->MB)不会使
(MA->MB)
不透明!这就是curryingReturning函数的本质,它的参数仍然可用<代码>(a->b)->(MA->MB)不会使
(MA->MB)
不透明!这就是咖喱的本质,我似乎有点理解。似乎map(高阶函数)将f应用于MA上的生成器。你能用英语解释一下语法吗。很抱歉,我来自命令式/oo背景,仍在学习Haskell。当然!!实际上要简单得多。这两种类型的签名是相同的:
map:(a->b)->(ma->mb)~map:(a->b)->ma->mb
这可以被视为是“右关联的”,基本上是说
xyz==x(yz)
。这是高阶蕴涵逻辑的本质,因为将部分数据提供给延长的执行应该返回延长的执行(在需要更多数据的情况下),或者只返回数据本身。在这种情况下,长时间执行与数据的处理方式完全相同。您还应该注意,我对“长时间执行”的使用非常草率——我不是在说严格、砰砰声或什么正常形式。这是严格意义上的函数-
a->b
可以被看作是对
b
数据的长期执行,只要我们有了
a
(很抱歉哈斯凯勒的同事对此拙劣的解释:)还有,
map f x==(map f)x
,如果这有意义的话。也就是说,如果
f:a->b
x:ma
,谢谢您的解释!我似乎有点明白。似乎map(高阶函数)将f应用于MA上的生成器。你能用英语解释一下语法吗。很抱歉,我来自命令式/oo背景,仍在学习Haskell。当然!!实际上要简单得多。这两种类型的签名是相同的:
map:(a->b)->(ma->mb)~map:(a->b)->ma->mb
这可以被视为是“右关联的”,基本上是说
xyz==x(yz)
。这是高阶蕴涵逻辑的本质,因为将部分数据提供给延长的执行应该返回延长的执行(在需要更多数据的情况下),或者只返回数据本身。在这种情况下,长时间执行与数据的处理方式完全相同。您还应该注意,我对“长时间执行”的使用非常草率——我不是在说严格、砰砰声或什么正常形式。这是严格意义上的函数-
a->b
可以被看作是对
b
数据的长期执行,只要我们有了
a
(很抱歉哈斯凯勒的同事对此拙劣的解释:)还有,
map f x==(map f)x
,如果这有意义的话。也就是说,如果
f:a->b
x:ma
,谢谢您的解释!谢谢这消除了我的疑虑。我看到过一些解释,它们对映射器从普通函数到一元函数没有区别。映射是一个高阶函数,它接受一个正规函数和一个单子(例如列表)。您能详细介绍一下\m->m吗?我不知道怎么读。@Asterisk我添加了所有的括号来指导阅读。优先级在这里确实会令人困惑。@Haskell语法的星号部分在于,对于
map
,您不需要区分这两种“存在方式”。事实上,它们只是对同一概念的不同观点。因为它们是完全相同的,你永远不必担心忽略其中一种解释;您可以使用在您工作的上下文中心理摩擦最小的任何一种观点,甚至可以在它们之间自由切换(正如您引用的类型签名和实现之间的示例中所发生的,这确实有点混乱)。谢谢。这消除了我的疑虑。我看到过一些解释,它们对映射器从普通函数到一元函数没有区别。映射是一个高阶函数,它接受一个正规函数和一个单子(例如列表)。您能详细介绍一下\m->m吗?我不知道怎么读。@Asterisk我添加了所有的括号来指导阅读。这里的优先级确实会让人困惑。@Haskell语法的星号部分在于,您不需要区分