Haskell 在应用程序中,`<*>;`用“fmap_i,i=0,1,2,…”表示?

Haskell 在应用程序中,`<*>;`用“fmap_i,i=0,1,2,…”表示?,haskell,functor,applicative,Haskell,Functor,Applicative,类Applicative声明为: class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b 在应用程序中,如何用fmap_i,i=0,1,2,表示 谢谢 另请参见您可以写: (<*>) = fmap2 ($) ()=fmap2($) 或者,如果你觉得它不那么晦涩:

类Applicative声明为:

class Functor f   =>  Applicative f   where
pure  ::  a   ->  f   a
(<*>) ::  f   (a  ->  b)  ->  f   a   ->  f   b
在应用程序中,
如何用
fmap_i,i=0,1,2,
表示

谢谢

另请参见

您可以写:

(<*>) = fmap2 ($)
()=fmap2($)
或者,如果你觉得它不那么晦涩:

f <*> a = fmap2 apply f a
  where apply g x = g x
fa=fmap2应用fa
其中,应用gx=gx

如果可以,您就不需要
应用程序的类型类
允许您以
Functor
无法的方式提取包装函数。但是,
fmapi、i>=2或i=0
必须由applicative满足,而不一定由Functor满足。我怀疑applicative可以完全用
fmapi来定义,I>=0
而不是
pure
。为什么?那些
fmap
变体都不涉及由函子包装的函数。我想知道“由函子包装的函数”是什么意思?@chepner,事实上你可以(我100%肯定你知道,只是有一个心理空白)。Tim的
fmap2
与标准
liftA2
相同,它与
pure
(Tim的
fmap0
)一起是
应用程序的一个有效最低定义。正如K.A.Buhr在他的回答中所说,
()
可以很容易地用它来定义。也就是说,只要您有办法将任何两个参数的函数提升到函子中,就可以将“包装在函子中的函数”应用于同样包装在函子中的输入值(因为您只需提升函数应用函数)。谢谢。我怀疑applicative可以完全用fmapi来定义,I>=0而不是纯和。所以我猜只能用fmapi来表示,I>=0你猜对了,但那将是巨大的过度消耗。您只需要
pure
(您的
fmap0
)和
liftA2
(您称之为
fmap2
)来定义
应用程序。那么,为什么要在类中添加无限多不同的多余方法呢?实际上,
Applicative
真正需要的是能够“提升”两个以上参数的函数,而
Functor
只能对单个参数的函数进行提升。(顺便说一句,您的
fmapk
在标准库中作为
liftAk
,对于
k
,在2到某个任意数字(我想大约5个)的范围内)太晚了,无法编辑,但是在我上面的评论中有一个重要的错误:多于2应该是2或者更多。在这里apply gx=gx
定义一个名为
apply
的函数,它有两个参数
g
x
?是--
apply gx=gx
的类型
(a->b)->a->b
。它接受两个参数,
g
x
,并将
g
应用于
x
。事实上,
apply
实际上是
id
的一个特化,因此如果您将上面的
($)
apply
替换为
id
,那么定义也可以正常工作(即
()=fmap2id
fa=fmap2id f a
)。
f <*> a = fmap2 apply f a
  where apply g x = g x