多くの場合、Applicative
なしpure
のようなもの、またはのようなものがありますがMonad
、はありませんreturn
。semigroupoidパッケージは、これらのケースをとでカバーしApply
ますBind
。Arrow
今、私は、意味のある関数を定義できないという点で同様の状況にありarr
ますが、他の関数は完全に理にかなっていると思います。
関数とその逆関数を保持する型を定義しました。
import Control.Category
data Rev a b = Rev (a -> b) (b -> a)
reverse (Rev f g) = Rev g f
apply (Rev f _) x = f x
applyReverse (Rev _ g) y = g y
compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f')
instance Category Rev where
id = Rev Prelude.id Prelude.id
(.) x y = compose x y
今は実装できませんArrow
が、何か弱いものがあります。
--"Ow" is an "Arrow" without "arr"
class Category a => Ow a where
first :: a b c -> a (b,d) (c,d)
first f = stars f Control.Category.id
second :: a b c -> a (d,b) (d,c)
second f = stars Control.Category.id f
--same as (***)
stars :: a b c -> a b' c' -> a (b,b') (c,c')
...
import Control.Arrow
instance Ow Rev where
stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g')
&&&
と定義されておりf &&& g = arr (\b -> (b,b)) >>> f *** g
、元に戻せないため、同等の実装はできないと思います(\b -> (b,b))
。それでも、この弱い型クラスが役立つと思いますか?理論的な観点からも意味がありますか?