在Wadler的论文中混淆了地图功能定义

时间:2016-02-15 05:04:04

标签: haskell functional-programming category-theory

有人可以帮助我理解Wadler教授的原始论文Monads for Functional Programming(Haskell)中的这个地图定义。

map :: (a → b) →(M a →M b)     
map  f m =m >= λa.unit(f a)

我理解为什么它被声明为来自f :: a - >的态射。 b到g :: Ma - > MB。为什么它被混淆地定义为似乎采取2 args f和m。 m是一个计算(带副作用的函数),我假设它可以定义为数据或类型。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

表格的定义

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中将参数尽可能地移动到=的左侧是很常见的。