Haskell趣学指南-学习笔记-Applicative functors

Applicative functors
import Control.Applicative
typeclass 定义如下:
class (Functor f ) => Applicative f where
    pure :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

 Applicative状态下Maybe的instance:

instance Applicative Maybe where
    pure = Just
    Nothing <*> _ = Nothing
    (Just f) <*> something = fmap f something

Applicative状态下[ ](列表)的instance:

instance Applicative [] where
    pure x = [x]
    fs <*> xs = [f x | f <- fs, x <- xs]

Applicative状态下IO的instance:

instance Applicative IO where
    pure = return
    a <*> b = do
        f <- a
        x <- b
        return (f x)

Applicative状态下ZipList的instance:

instance Applicative ZipList where
    pure x = ZipList (repeat x)
    ZipList fs <*> ZipList xs = ZipList (zipWith (\f x -> f x) fs xs)

 注意:<*>的第一个参数必须带Just,而<$>的第一个参数只需要是一个函数

(<*>) :: f (a -> b) -> f a -> f b
(Just f) <*> something = fmap f something
(<$>) :: (Functor f) => (a -> b) -> f a -> f b
f <$> x = fmap f x

如何直接调用Applicative状态下的类型?如下:(通过类型标注)

ghci > pure "Hey" :: [String]
[ "Hey" ]
ghci > pure "Hey" :: Maybe String
Just "Hey"
ghci> pure "Hey" :: IO String
"Hey"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值