Haskell 中带有元组参数的函数组合

发布于 2024-11-13 09:06:46 字数 290 浏览 5 评论 0原文

有时我有两个形式的函数:

f :: a -> (b1,b2)
h :: b1 -> b2 -> c

并且我需要组合 g。我通过将 h 更改为 h' 来解决这个问题:

h' :: (b1,b2) -> c

您能否向我展示(如果可能的话)一个函数 m,以便:

(h . m . f) == (h' . f)

或处理此类情况的另一种方法。谢谢。

Sometimes I have two functions of the form:

f :: a -> (b1,b2)
h :: b1 -> b2 -> c

and I need the composition g. I solve this by changing h to h':

h' :: (b1,b2) -> c

Can you please show me (if possible) a function m, so that:

(h . m . f) == (h' . f)

Or another way to deal with such situations. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤君无依 2024-11-20 09:06:46

您要做的就是获取一个对柯里化参数h进行操作的函数,并将其应用于f的结果,这是一个元组。这一将两个参数的函数转换为采用一个元组参数的函数的过程称为“uncurrying”。我们有来自 Data.Tuple:

curry :: ((a, b) -> c) -> a -> b -> c 
   -- curry converts an uncurried function to a curried function.

uncurry :: (a -> b -> c) -> (a, b) -> c
   -- uncurry converts a curried function to a function on pairs.

所以现在我们可以写:

f :: a -> (b,c)
f = undefined

h :: b -> c -> d
h = undefined

k :: a -> d
k = uncurry h . f

另一个棘手的思考方式是通过一个应用函子,

k = (h <
gt; fst <*> snd) . f

来自 Conor McBride 的 Idea,他将其写为: (|f fst snd|) 。我认为。

What you're looking to do is to take a function that operates on curried arguments, h, and apply it to the result of f, which is a tuple. This process, turning a function of two arguments into a function that takes one argument that is a tuple, is called uncurrying. We have, from Data.Tuple:

curry :: ((a, b) -> c) -> a -> b -> c 
   -- curry converts an uncurried function to a curried function.

uncurry :: (a -> b -> c) -> (a, b) -> c
   -- uncurry converts a curried function to a function on pairs.

So now we can write:

f :: a -> (b,c)
f = undefined

h :: b -> c -> d
h = undefined

k :: a -> d
k = uncurry h . f

Another tricky way to think of this is via an applicative functor,

k = (h <
gt; fst <*> snd) . f

Idea from Conor McBride, who'd write it as: (|f fst snd|) . f I think.

泪意 2024-11-20 09:06:46

你想要做的是uncurry h。这个函数需要a ->; b-> c 并将其转换为 (a, b) -> c.

uncurry h . f

What you want to do is uncurry h. This function takes a -> b -> c and converts it into (a, b) -> c.

uncurry h . f
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文