在Haskell中我会做join (***)
。在Idris中flatten (***)
不起作用((***)
很复杂)。
答案 0 :(得分:3)
在Idris中,Functor
没有Applicative
/ Monad
/ r -> _
个实例,Arrow
没有->
个实例,只能通过Morphism
,因此使用flatten
执行\f x -> f x x
会导致可疑的冗长代码从/到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)