考虑下面的应用性上下文f。我有一个函数列表包裹在这个上下文F = f [a -〉a]周围,还有一个值列表包裹在同一个上下文V = f [a]周围。现在我想把F中的函数应用到V中的值上。如何实现这一点?我已尝试以下方法:
1. (F <*>) <*> V 2. (V <*>) (F <*>)
但由于某种原因,类型不匹配。
ee7vknir1#
1中的类型不匹配,因为两个<*>位于同一“层”,2中的类型不匹配,因为您试图将值作为函数调用。(还有其他问题,但这应该足以说明为什么它们不能工作。)您要查找以下两个表达式之一:
<*>
(<*>) <$> f <*> v liftA2 (<*>) f v
请记住,在Haskell中,变量以小写字母开头,而数据构造函数以大写字母开头。
xn1cxnb42#
这并不比仅仅使用liftA2简单,但有趣的是,两个应用函子的合成本身就是一个应用函子。
liftA2
> import Data.Functor.Compose > getCompose $ Compose (Just [(+1)]) <*> Compose (Just [5]) Just [6] > getCompose $ Compose ([Just (+1)]) <*> Compose ([Just 5]) [Just 6]
<*>“挖掘”其操作数的顺序是从被 Package 值的类型推断出来的(或由其定义的)。
> :t Compose [Just 'c'] Compose [Just 'c'] :: Compose [] Maybe Char > :t Compose (Just ['c']) Compose (Just ['c']) :: Compose Maybe [] Char
2条答案
按热度按时间ee7vknir1#
1中的类型不匹配,因为两个
<*>
位于同一“层”,2中的类型不匹配,因为您试图将值作为函数调用。(还有其他问题,但这应该足以说明为什么它们不能工作。)您要查找以下两个表达式之一:请记住,在Haskell中,变量以小写字母开头,而数据构造函数以大写字母开头。
xn1cxnb42#
这并不比仅仅使用
liftA2
简单,但有趣的是,两个应用函子的合成本身就是一个应用函子。<*>
“挖掘”其操作数的顺序是从被 Package 值的类型推断出来的(或由其定义的)。