Haskell新手技术问询:如何忽略第二个值并将第一个值放入上下文中
理解Haskell里的
<$操作符(Functor辅助函数) 嘿,刚入门Haskell学Functors的话,这个困惑太正常啦!我来给你一步步拆解明白~
首先,你看到的<$其实是Haskell为Functor提供的一个便捷操作符,它的定义很简单:
(<$) :: Functor f => a -> f b -> f a a <$ fb = fmap (const a) fb
咱们拆分来看:
- 先看
const函数:这是个基础工具函数,const a b的作用就是不管第二个参数是什么,始终返回第一个参数。比如const 1 6结果是1,const 3 2结果还是3,完全忽略第二个输入。 - 再结合
fmap:fmap的作用是把一个函数“映射”到Functor的上下文里。不同的Functor实例,fmap的行为不一样:
例子1:Maybe类型
对于Maybe这个Functor,fmap f (Just x)会把函数f应用到x上,再包回Just里。那1 <$ Just 6展开就是:
fmap (const 1) (Just 6) = Just (const 1 6) = Just 1
这里const 1忽略了Just里的6,直接返回1,最后再放回Just这个上下文里。
例子2:列表类型
列表[]也是Functor,fmap f [x1,x2,x3]会把f依次应用到每个元素上,生成新列表。那3 <$ [1,2,3]展开就是:
fmap (const 3) [1,2,3] = [const 3 1, const 3 2, const 3 3] = [3,3,3]
这里const 3忽略了列表里的每个元素,每次都返回3,所以最终得到一个和原列表长度相同,但所有元素都是3的新列表。
再补个小例子加深理解
比如用Either类型:"hi" <$ Right 42会得到Right "hi";如果是Nothing,5 <$ Nothing还是Nothing——因为原上下文是空的,自然没法填新值,只能保留空结构。
简单来说,<$的核心就是:保留Functor的上下文结构,把上下文里的所有内容替换成你指定的固定值,完全忽略原来的内容~
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

