16

map4便利そうに見えるという理由だけで、このような関数を書きました。

map2 :: Functor f => (i -> a) -> (i -> b) -> f i -> f (a,b)
map2 f1 f2 = fmap $ \i -> (f1 i, f2 i)

先に進む前にmap8、標準モジュールに似たようなものがあるかどうか尋ねたいと思いました。Hayoo は、上記の署名を持つ関数を知らないようです。

注:Control.Arrow.&&&上記を次のように削減することはすでにわかっています。

map2 f1 f2 = fmap (f1 &&& f2)

しかし、ファンアウトが 2 つを超える場合、同様の機能はないようです。

4

2 に答える 2

19

(->) i(&&&)はアプリカティブ ファンクターなので、次のように記述できます。

f &&& g = (,) <$> f <*> g

map3そして、あなたは次のように書くことができます

map3 f1 f2 f3 = map ((,,) <$> f1 <*> f2 <*> f3)

それより短くないことを除いて

map3 f1 f2 f3 = map $ \i -> (f1 i, f2 i, f3 i)

しかし、Gabriel のヒントのおかげで、これ短くなりました。

map3 f1 f2 f3 = map (liftA3 (,,) f1 f2 f3)
于 2013-06-12T21:29:16.817 に答える
12

ネストされたタプルを使用してシミュレートできますが、2 つを超えるファンアウトの標準関数はありません。

f :: i -> a
g :: i -> b
h :: i -> c

f &&& g :: i -> (a, b)

(f &&& g) &&& h :: i -> ((a, b), c)

ネストされたタプルが気に入らない場合は、この関数を自分で作成する必要があります。

fanout3 :: (i -> a) -> (i -> b) -> (i -> c) -> i -> (a, b, c)
fanout3 f g h i = (f i, g i, h i)

質問で述べたように、そのような機能があれば、次のことができますmap

map (fanout3 f g h) :: [i] -> [(a, b, c)]
于 2013-06-12T20:20:37.070 に答える