将函数应用于haskell中的每个参数

lov*_*soa 2 lambda haskell

我有时会发现自己需要创建一个函数,将不同的函数映射到两个值,然后将它们组合在一起.如何在不使用lambda的情况下做到这一点?

我的职责是:

f :: a -> b
g :: c -> d
combine :: b -> d -> e
Run Code Online (Sandbox Code Playgroud)

问题是:如何在\x y -> combine (f x) (g y)不使用lambda的情况下编写?

jpa*_*ath 7

如果f = g你可以用onData.Function.否则就没有组合base.一个stackage搜索相应类型的显示biSpconcatenative.

biSp :: (a -> c) -> (b -> d) -> (c -> d -> e) -> a -> b -> e
Run Code Online (Sandbox Code Playgroud)

但是,如果这是您将从该软件包中使用的唯一功能,您可能不希望仅依赖于该软件包.

除此之外,您可以使用以下至少稍微短一些但不太可读的内容.

(. g) . combine . f
Run Code Online (Sandbox Code Playgroud)

或使用dimapData.Profunctorprofunctors.虽然这也需要另一个包,但很可能你已经profunctors间接依赖,因为你正在使用lens或一些包依赖lens.

dimap f (. g) combine
Run Code Online (Sandbox Code Playgroud)

这很容易扩展到三个参数.以下都是相同的,从最短到最结构排序,最后两个特别容易将它们扩展到任意数量的参数.

dimap f (dimap g (. h)) combine3
(dimap f . dimap g) (. h) combine3
(dimap f . dimap g . dimap h) id combine3
Run Code Online (Sandbox Code Playgroud)

如果你想知道这dimap是做什么的.这是一个很棒的教程:我喜欢各种各样的人.他们很容易.

或者只写自己的biSp.