在haskell中将嵌套上下文中的函数应用于嵌套上下文中的值

avwztpqn  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(179)

考虑下面的应用性上下文f。我有一个函数列表包裹在这个上下文F = f [a -〉a]周围,还有一个值列表包裹在同一个上下文V = f [a]周围。现在我想把F中的函数应用到V中的值上。如何实现这一点?
我已尝试以下方法:

1. (F <*>) <*> V
2. (V <*>) (F <*>)

但由于某种原因,类型不匹配。

ee7vknir

ee7vknir1#

1中的类型不匹配,因为两个<*>位于同一“层”,2中的类型不匹配,因为您试图将值作为函数调用。(还有其他问题,但这应该足以说明为什么它们不能工作。)您要查找以下两个表达式之一:

(<*>) <$> f <*> v
liftA2 (<*>) f v

请记住,在Haskell中,变量以小写字母开头,而数据构造函数以大写字母开头。

xn1cxnb4

xn1cxnb42#

这并不比仅仅使用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

相关问题