我有时会发现自己需要创建一个函数,将不同的函数映射到两个值,然后将它们组合在一起.如何在不使用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的情况下编写?
如果f = g你可以用on在Data.Function.否则就没有组合base.一个stackage搜索相应类型的显示biSp从concatenative.
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)
或使用dimap在Data.Profunctor从profunctors.虽然这也需要另一个包,但很可能你已经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.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |