簡體   English   中英

有沒有像`map2 ::(i - > a) - >(i - > b) - > [i] - > [(a,b)]`?

[英]Is there something like `map2 :: (i -> a) -> (i -> b) -> [i] -> [(a,b)]`?

我剛剛寫了這樣的函數到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)

但是對於超過兩個的扇出似乎沒有類似的功能。

(->) i是一個應用函子,所以你可以寫(&&&) as

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)

但由於加布里埃爾的小費,這更短:

map3 f1 f2 f3 = map (liftA3 (,,) f1 f2 f3)

雖然您可以使用嵌套元組模擬它,但沒有超過兩個扇出的標准函數:

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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM