[英]Given a function g :: a -> b -> … -> z, how can I use it like h :: (a, b, …) -> z?
[英]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.