Haskell 在应用程序中,`<*>;`用“fmap_i,i=0,1,2,…”表示?
类Applicative声明为: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($) 或者,如果你觉得它不那么晦涩:
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