Haskell学习笔记--functor/applicative/Effective programming
Haskell 学习笔记 -- functor / applicative
这部分肯定是 Haskell 中最最抽象的了,我上课就没懂(
还有什么范畴论,自闭了
Functor 函子
函子的意思是一类容器,它里面可以装各种东西
比如 [] \ Maybe \ Tree
要让一个数据结构成为 Functor , 必须支持函数 fmap
1 instance Functor [] where 2 --fmap :: ( a -> b ) -> f a - f b 3 fmap g [] = [] 4 fmap g (x:xs) = fmap g xs ++ [g x]
fmap 相当于把函数作用到数据结构的每一个位置上
Applicative
多个参数的fmap(
很抽象举例子
fmap0 :: a -> f a fmap1 :: a -> b -> f a -> f b fmap2 :: a -> b -> c -> f a -> f b -> f c
applicative 需要实现两个函数:
pure :: a -> f a (<*>) :: f ( a -> b ) -> f a -> f b -- <*> 是左结合的
然后就可以改写了
fmap2 g x y = pure g <*> x <*> y
对于Maybe / [] / IO 来说
instance Applicative Maybe where pure = Just Nothing <*> _ = Nothing g :: a -> b mx :: f a (Just g ) <*> mx = fmap g mx instance Applicative [] where pure x = [x] gs <*> xs = [g x | g <- gs , x <- xs ] -- pure (*) <*> [1,2] <*> [3,4] -- [3,4,6,8]
instance Applicative IO where
pure = return
mg <*> mx = do {g <- mg; x <- mx; return (g x)}
IO 的一个具体例子
getChars :: Int -> IO String getChats 0 = return [] --(:) :: a -> [a] -> [a] --pure (:) -> IO (a -> [a] -> [a] ) getChars n = pure (:) <*> getChar <*> getChars (n-1)
Effective progframming
有效的编程(x
看来我以前的都是无效的
这里有效可能更像“有副作用”
比如说 Maybe 可能失败(Nothing)
[] 可能有多种解
IO 附带输入输出
所以我们也可以用 applicative 改装函数
标准库中有一个函数:sequenceA 用于一个序列里头装函子 出来的是函子里头装序列
(这里的函子是有副作用的,见上,所以可以将函子也理解为作用
Evaluate each action in the structure from left to right, and collect the results.
sequenceA :: Applicative f => [f a] -> f [a] sequenceA (x:xs) = pure (:) <*> x <*> sequenceA xs pure (:) :: f ( a -> [a] -> [a] ) getChars :: Int -> IO string getChars n = sequenceA (replicate n getChar ) -- getChar :: IO char -- replicate :: Int -> a -> [a] --replicate n getChar :: [IO char]
最后补充一种等价写法:
pure g <*> x1 g <$> x1 fmap g x1
三者等价
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-11-13 speike
2019-11-13 jerry
2019-11-13 tom
2019-11-13 世界
2019-11-13 小店购物
2018-11-13 3625
2018-11-13 折线统计(line)