什么(<*>):: f(a - > b) - > fa - > fb在Functor类中完全做了什么

use*_*628 1 haskell functor applicative

class Functor f => Applicative f where
       pure :: a -> f a
       (<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它需要一个函数f,其中另一个函数(a -> b)作为其参数,返回一个函数f.应用fa然后返回功能f,并应用fb.

这是一个例子:

Prelude> (+) <$> Just 2 <*> Just 3
Just 5
Run Code Online (Sandbox Code Playgroud)

但我不太明白它是如何工作的.

我想(+)应该是f,Just 2而且Just 3应该是ab分别.那是什么(a -> b)

Die*_*Epp 7

根据我的理解,它需要一个功能...

不幸的是这不正确.在这种情况下,f是一种类型,而不是一种功能.具体而言,f是具有种类的"高级型" * -> *.类型f是仿函数.

在这种情况下,fMaybe.所以我们可以重写函数类型,专门用于Maybe:

pure :: a -> Maybe a
(<*>) :: Maybe (a -> b) -> Maybe a -> Maybe b
Run Code Online (Sandbox Code Playgroud)

一旦你走到这一步,它开始变得更加清晰.有几种不同的可能定义pure,但只有一种有意义:

pure = Just
Run Code Online (Sandbox Code Playgroud)

操作员x <$> y是相同的pure x <*> y,所以如果你写出来:

(+) <$> Just 2 <*> Just 3
Run Code Online (Sandbox Code Playgroud)

然后我们可以将其重写为:

pure (+) <*> pure 2 <*> pure 3
Run Code Online (Sandbox Code Playgroud)

虽然这在技术上具有更一般的类型.使用仿函数法则,我们知道它pure x <*> pure y是一样的pure (x y),所以我们得到了

pure ((+) 2) <*> pure 3
pure ((+) 2 3)
pure (2 + 3)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们ab类型,但由于<*>出现了两次,他们实际上在每种情况下,不同的类型.

在第一个<*>,aIntbInt -> Int.在第二<*>,无论是abInt.(从技术上讲,你会得到通用版本,Int但这对问题并不重要.)

  • 不,没有错字.`x <$> y`与`pure x <*> y`相同. (2认同)