我只是写了这样的函数,map4因为它们似乎很有用:
map2 :: Functor f => (i -> a) -> (i -> b) -> f i -> f (a,b)
map2 f1 f2 = fmap $ \i -> (f1 i, f2 i)
Run Code Online (Sandbox Code Playgroud)
在我继续之前,map8我想我会问一些标准模块中是否有类似的东西.Hayoo似乎不知道任何具有上述签名的功能.
注意:我已经发现Control.Arrow.&&&将上述内容减少到:
map2 f1 f2 = fmap (f1 &&& f2)
Run Code Online (Sandbox Code Playgroud)
但是,对于超过两个的扇出似乎没有类似的功能.
Sjo*_*her 19
(->) i是一个适用函子,所以你可以写(&&&)为
f &&& g = (,) <$> f <*> g
Run Code Online (Sandbox Code Playgroud)
你可以写map3为
map3 f1 f2 f3 = map ((,,) <$> f1 <*> f2 <*> f3)
Run Code Online (Sandbox Code Playgroud)
除了它不短于
map3 f1 f2 f3 = map $ \i -> (f1 i, f2 i, f3 i)
Run Code Online (Sandbox Code Playgroud)
但由于加布里埃尔的小费,这是更短:
map3 f1 f2 f3 = map (liftA3 (,,) f1 f2 f3)
Run Code Online (Sandbox Code Playgroud)
Gab*_*lez 12
虽然您可以使用嵌套元组模拟它,但没有超过两个扇出的标准函数:
f :: i -> a
g :: i -> b
h :: i -> c
f &&& g :: i -> (a, b)
(f &&& g) &&& h :: i -> ((a, b), c)
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢嵌套元组,那么您必须自己编写此函数:
fanout3 :: (i -> a) -> (i -> b) -> (i -> c) -> i -> (a, b, c)
fanout3 f g h i = (f i, g i, h i)
Run Code Online (Sandbox Code Playgroud)
就像你在问题中提到的那样,一旦你有这样的功能,你就可以这样map做:
map (fanout3 f g h) :: [i] -> [(a, b, c)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1995 次 |
| 最近记录: |