首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell函数组合与fmap f

Haskell函数组合与fmap f
EN

Stack Overflow用户
提问于 2018-01-11 16:40:43
回答 1查看 903关注 0票数 0

我有两个简单的例子:

1) xt函数(这是什么?)

代码语言:javascript
复制
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
3

2) xq函数(通过组合)

代码语言:javascript
复制
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和什么是不同的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 16:58:32

用于Functor(->) r实例将fmap定义为函数组合:

代码语言:javascript
复制
fmap f g = f . g

因此,xt (+2) == fmap f (+2) == f . (+2) == (+2) (因为fInt的标识函数)。应用于1,得到观察到的答案3。

fmap是由Functor类型类定义的函数:

代码语言:javascript
复制
class Functor f where
    fmap :: (a -> b) -> f a -> f b

它以一个函数作为其参数,并将一个新函数“提升”到所述函子中。确切的定义由Functor实例提供。上面是函数函子的定义;这里有一些比较简单的列表和Maybe函数。

代码语言:javascript
复制
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与原始函数的组合。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48211978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档