我有两个简单的例子:
1) xt函数(这是什么?)
Prelude> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
Prelude> :{
Prelude| f::Int->Int
Prelude| f x = x
Prelude| :}
Prelude> xt = fmap f // ?
Prelude> :t xt
xt :: Functor f => f Int -> f Int
Prelude> xt (+2) 1
32) xq函数(通过组合)
Prelude> :{
Prelude| return x = [x]
Prelude| :}
Prelude> xq = return . f
Prelude> :t xq
xq :: Int -> [Int]
Prelude> :t return
return :: a -> [a]xq函数,我通过组合return(f(x))。但这意味着什么:fmap f和什么是不同的?
发布于 2018-01-11 16:58:32
用于Functor的(->) r实例将fmap定义为函数组合:
fmap f g = f . g因此,xt (+2) == fmap f (+2) == f . (+2) == (+2) (因为f是Int的标识函数)。应用于1,得到观察到的答案3。
fmap是由Functor类型类定义的函数:
class Functor f where
fmap :: (a -> b) -> f a -> f b它以一个函数作为其参数,并将一个新函数“提升”到所述函子中。确切的定义由Functor实例提供。上面是函数函子的定义;这里有一些比较简单的列表和Maybe函数。
instance Functor [] where
fmap = map
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
> fmap (+1) [1,2,3]
[2,3,4]
> fmap (+1) Nothing
Nothing
> fmap (+1) (Just 3)
Just 4因为你可以把函子看作包含一个或多个值的盒子,所以函数函子的直觉是,一个函数是一个盒子,它包含了将函数应用到它的参数中的结果。也就是说,(+2)是包含一些值加2的框。(F)在该框上映射函数提供一个框,其中包含将f应用到原始函数结果的结果,即生成一个函数,该函数是f与原始函数的组合。
https://stackoverflow.com/questions/48211978
复制相似问题