huangxz的笔记 https://bbs.21ic.com/?73035 [收藏] [复制] [RSS]

日志

haskell随笔(3)-一些关于Functor

已有 319 次阅读2017-3-7 15:49 |系统分类:兴趣爱好

一些关于Functor
:i Functor
Prelude> :i fmap
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
...
-- Defined in ‘GHC.Base’
Prelude> :i Functor
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
{-# MINIMAL fmap #-}
-- Defined in ‘GHC.Base’
instance Functor (Either a) -- Defined in ‘Data.Either’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
instance Functor IO -- Defined in ‘GHC.Base’
instance Functor ((->) r) -- Defined in ‘GHC.Base’
instance Functor ((,) a) -- Defined in ‘GHC.Base’
fmap 支持的数据类型(data)就如上面所有列出的类型,
(1)先说说Either a

Prelude> fmap (*8) (Left 7)
Left 7
Prelude> fmap (*8) (Right 8)
Right 64


Prelude> let f1 = fmap (*8)
Prelude> f1 (Right 9)
Right 72
Prelude> :t f1
f1 :: (Num b, Functor f) => f b -> f b
这个时候的f代表的就是Either, b代表的就是9
同理可以这么表示

Prelude> let f3 = fmap snd
Prelude> :i f3
f3 :: Functor f => f (a, b) -> f b
        -- Defined at <interactive>:102:5
Prelude> f3 (Right (3,5))
Right 5
这个时候f代表Either, (a,b)代表的就是(3,5)
(2)再说说[]类型
对于[]可以操作的函数就很多了,四则运算是一个(这个网上的例子太多了),字符型的还可以增加等,比如

Prelude> let f4 = fmap ((:) 'a')
Prelude> :i f4
f4 :: Functor f => f [Char] -> f [Char]
        -- Defined at <interactive>:105:5
Prelude> f4 ["look", "dog"]
["alook","adog"]
(3)说说((->) r)这个类型,这个类型是个普通的函数,相当于复合函数,
introduce 网上的一个例子
http://www.cnblogs.com/x1957/p/3193284.html
讲的比较有趣,也比较真实.这里同时也作点例子
Prelude> let f5 = fmap (*6)
Prelude> :i f5
f5 :: (Num b, Functor f) => f b -> f b
        -- Defined at <interactive>:108:5
Prelude> let f5' = f5 (\x->x+7)
Prelude> :i f5'
f5' :: Num b => b -> b  -- Defined at <interactive>:110:5
我们发现,f5还是 f b -> f b的映射关系, 将f 传函数以后,就变成了 b -> b
Prelude> let f6 x = x + 1
Prelude> :i f6
f6 :: Num a => a -> a   -- Defined at <interactive>:112:5
跟这个是一样的,成了一个普通的映射关系.

(4)说说((,) a)
一眼看去,这个是tuple的例子
考虑一下对于tuple操作其实也不多,简单用个生成的吧.
Prelude> f7 (1:[2,3])
[(6,1),(6,2),(6,3)]
Prelude> let f7 = fmap ((,) 6)
Prelude> :i f7
f7 :: (Num a, Functor f) => f b -> f (a, b)
        -- Defined at <interactive>:131:5
Prelude> f7 (1:[2,3])
[(6,1),(6,2),(6,3)]
根据[]的定义可以看出,这个时候的f相当于[]

Prelude> :i []
data [] a = [] | a : [a]        -- Defined in ‘GHC.Types’
其实这个时候f也可以是其他映射方式,但是只会对b起作用.

Prelude> let f7' = f7 (\x->x**2)
Prelude> :i f7'
f7' :: (Num a, Floating b) => b -> (a, b)
        -- Defined at <interactive>:135:5
Prelude> f7' 1.6
(6,2.5600000000000005)


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)