有人可以帮助我理解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是一个计算(带副作用的函数),我假设它可以定义为数据或类型。
答案 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中将参数尽可能地移动到=
的左侧是很常见的。