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

标签 haskell arrows

假设我有 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)

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

最佳答案

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

所以专攻 ->我们得到:
(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')

这很好,除了我们想,无论出于何种原因,将前两个参数作为一对来代替。但这很容易,我们只是不 curry 。
Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')

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

关于haskell - 关于箭头运算符的快速问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200462/

相关文章:

javascript - 根据 x, y 位置计算 Angular

xml - 折叠箭头列表

空集上的 Haskell 模式匹配

performance - 合并功能要慢得多

haskell - 断言是如何使用的?

haskell - 我有同一个 haskell/cabal 软件包的多个安装版本。哪一款投入使用?

python - 如何使用 matplotlib 绘制与比例无关的箭头

http - 如何检查使用 `http-client` 创建的传出 HTTP 请求的主体 (Haskell)

haskell - 有人可以向我解释为什么ArrowApply的应用程序功能使它们像monad一样强大吗?

haskell - Karplus-Strong Algo 中的递归反馈 - 箭头