说我有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)
Run Code Online (Sandbox Code Playgroud)
但那里的乐趣在哪里?
使用(***)我可以在那里中途:
(f *** g) :: (u,x) -> (v -> w, y -> z)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何获得最后一英里.
scl*_*clv 13
(***) :: (Arrow a) => a b c -> a b' c' -> a (b, b') (c, c')
Run Code Online (Sandbox Code Playgroud)
所以专注于->我们得到:
(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
Run Code Online (Sandbox Code Playgroud)
这很好,除了我们想要,无论出于何种原因,将前两个参数作为一对代替.但这很容易,我们只是不赞成.
Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')
Run Code Online (Sandbox Code Playgroud)
如果你a再次专门化,你应该看到你正在寻找的类型签名.
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |