"多参数"功能组合如何工作(例如fmap.fmap)?

Ped*_*olo 1 haskell functional-programming function-composition

当我们有表达式时:

(fmap . fmap) function nested_functor
Run Code Online (Sandbox Code Playgroud)

我希望它能翻译成类似的东西

fmap (fmap function nested_functor)
Run Code Online (Sandbox Code Playgroud)

虽然它出人意料地表现得像

fmap (fmap function) nested_functor
Run Code Online (Sandbox Code Playgroud)

为什么?

Dan*_*ner 9

好吧,看看定义(.):

(f . g) x = f (g x)
Run Code Online (Sandbox Code Playgroud)

所以,

(fmap . fmap) function = fmap (fmap function)
Run Code Online (Sandbox Code Playgroud)

在最后添加一个额外的参数并没有真正改变方程 - 只是使它更具体.

(fmap . fmap) function nested_functor = fmap (fmap function) nested_functor
Run Code Online (Sandbox Code Playgroud)

(NB函数应用程序是左关联的,所以f x y意味着(f x) y.)

  • @PedroMorteRolo这种方式是对称的.设置它就像它一样,你可以在`fn`到'two'参数的应用中没有括号作为`fn xy`而在`fn :: Int - > Int - > Bool的相应类型签名中没有括号(例如).如果它们以相同的方式关联(不管是哪种方式),那么这两件事中的一件将需要parens而另一件则不需要. (3认同)