如何映射Pair/Tuple?

How to map over a Pair/Tuple?

在Haskell我会做join (***)。在 Idris 中 flatten (***) 不起作用((***) 很复杂)。

在 Idris 中,r -> _ 没有 Functor/Applicative/Monad 个实例,-> 也没有 Arrow 个实例,只有通过 Morphism,所以使用 flatten 来执行 \f x -> f x x 会导致非常冗长的代码充满 from/to Morphism

可以做,当然,我只是不确定它是否值得...比较一下:

import Control.Arrow
import Data.Morphisms

both : (a -> b) -> (a, a) -> (b, b)
both = applyMor . applyMor (flatten (Mor (Mor . (***)))) . Mor

对此:

both : (a -> b) -> (a, a) -> (b, b)
both f (x, y) = (f x, f y)