关于箭头运算符的快速问题
假设我有 f :: u -> v-> w
和 g :: 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因此,将 a 专门化为
->
,我们得到:这很好,但无论出于何种原因,我们都希望将前两个参数作为一对。但这很简单,我们只需取消咖喱即可。
如果您再次专门化
a
,您应该会看到您正在寻找的类型签名。So specialize a to
->
and we get: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.
And if you specialize the
a
again, you should see the type signature you were looking for.