关于箭头运算符的快速问题

发布于 2024-10-20 12:59:40 字数 383 浏览 0 评论 0原文

假设我有 f :: u -> v-> wg :: x -> y-> z 。我想要的是 h :: (u,x) -> (v,y)-> (w,z)。

所以我可以手动处理这个问题:

h (u,x) (v,y) = (f u v, g x y)

但是这有什么乐趣呢?

使用 (***) 我可以到达一半:

(f *** g) :: (u,x) -> (v -> w, y -> z)

但我不知道如何到达最后一英里。

Say I've got f :: u -> v -> w and g :: x -> y -> z. What I want is h :: (u,x) -> (v,y) -> (w,z).

So I could go about this manually:

h (u,x) (v,y) = (f u v, g x y)

But where's the fun in that?

Using (***) I can get partway there:

(f *** g) :: (u,x) -> (v -> w, y -> z)

But I can't figure out how to get that final mile.

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

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

发布评论

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

评论(1

夏雨凉 2024-10-27 12:59:40
(***) :: (Arrow a) => a b c -> a b' c' -> a (b, b') (c, c')

因此,将 a 专门化为 -> ,我们得到:

(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')

这很好,但无论出于何种原因,我们都希望将前两个参数作为一对。但这很简单,我们只需取消咖喱即可。

Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')

如果您再次专门化 a,您应该会看到您正在寻找的类型签名。

(***) :: (Arrow a) => a b c -> a b' c' -> a (b, b') (c, c')

So specialize a to -> and we get:

(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')

And that's great, except we want to, for whatever reason, take the first two arguments as a single pair instead. But that's easy, we just uncurry.

Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')

And if you specialize the a again, you should see the type signature you were looking for.

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