![](/img/trans.png)
[英]Use contents of a list as positional arguments to a single multi-argument function
[英]About mapping on the eventual result of a multi-argument function
我知道r -> a
是 a 中a
仿函数,并且Functor
fmap = (.)
是它。
这意味着当我使用g:: r -> a
执行fmap fg
时,只要将 g 的值输入r
类型的值,就会将f
应用于g
的结果。 However, if a
is a function type, eg a unary function b -> c
, then there's a difference between applying f
to that function (which is what happens in reality) and applying f
to the eventual result of g
(which could be desirable在某些情况下;不是吗?)。
我如何 map 对g
的最终结果? 在这种情况下g:: r -> b -> c
看起来很容易,我可以uncurry $ fmap f $ curry g
。 但是,如果c
也是 function 类型怎么办?
或者,换句话说,我如何 map 对多变量 function 的最终结果? 一般来说, curry
/ uncurry
技巧是必要的/可行的吗?
(相关问题在这里。)
从评论/答案中可以明显看出,我没有意识到我本质上是在问我几天前已经问过的同一个问题。 由于我是如何到达这里的,这对我来说可能并不明显。 从本质上讲,导致我提出这个问题的是另一个在我脑海中闪过的问题:
如果我可以使用liftA2 (&&)
、 liftA2 (||)
和类似的组合一元谓词,我如何组合二元谓词? 为了回答这个问题,我在 GHCi 中玩了一下,然后想出了这个
liftIntoBinaryFunc p = \q r -> curry $ (liftA2 p) (uncurry q) (uncurry r)
这将允许做这样的事情:
-- some binary predicate
distanceLE3 x y = 3 >= abs (x - y)
sameSign x y = ((==) `on` signum) x y
-- function to lift into binary functions
liftIntoBinaryFunc p = \q r -> curry $ (liftA2 p) (uncurry q) (uncurry r)
-- lifting && into binary functions to Bool
and' = liftIntoBinaryFunc (&&)
-- combining
pred = distance3 `and'` sameSign
-- using
p 3 18 -- False
p 3 1 -- True
p 3 (-1) -- False
但是,这个问题太笼统地概括为如何组合任意(尽管常见)的谓词? ,而且可能答案是一样的。
如果您想接受n arguments 然后应用f
,您可以调用fmap
n次。 所以,如果g:: r -> b -> c
,那么
(fmap . fmap) f g
将f
应用于c
类型的值,该值将g
应用于两个 arguments,而如果h:: a -> b -> c -> d -> e -> f -> g
a b c d e f
(fmap . fmap . fmap . fmap . fmap . fmap) f h
将f
应用于将h
应用于 6 arguments 所产生的类型g
的值。
r -> b -> c
is r -> (b -> c)
and so (fmap. fmap) (f:: c -> d) (g:: r -> b -> c):: r -> b -> d
:
> foo :: (c -> d) -> (r -> (b -> c)) -> r -> (b -> d) ;
foo = fmap . fmap
foo :: (c -> d) -> (r -> b -> c) -> r -> b -> d
> bar :: (c -> d) -> (r -> (b -> (t -> c))) -> r -> (b -> (t -> d)) ;
bar = fmap . fmap . fmap
bar :: (c -> d) -> (r -> b -> t -> c) -> r -> b -> t -> d
但是您必须知道有多少嵌套级别,才能相应地组合fmaps
,或者使用您最近的其他问题中的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.