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.应用f到a然后返回功能f,并应用f到b.
这是一个例子:
Prelude> (+) <$> Just 2 <*> Just 3
Just 5
Run Code Online (Sandbox Code Playgroud)
但我不太明白它是如何工作的.
我想(+)应该是f,Just 2而且Just 3应该是a和b分别.那是什么(a -> b)?
根据我的理解,它需要一个功能...
不幸的是这不正确.在这种情况下,f是一种类型,而不是一种功能.具体而言,f是具有种类的"高级型" * -> *.类型f是仿函数.
在这种情况下,f是Maybe.所以我们可以重写函数类型,专门用于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)
在这种情况下,我们a并b是类型,但由于<*>出现了两次,他们实际上在每种情况下,不同的类型.
在第一个<*>,a是Int和b是Int -> Int.在第二<*>,无论是a和b是Int.(从技术上讲,你会得到通用版本,Int但这对问题并不重要.)
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |