You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:07:36