Haskell函数子函数提取方法咨询:两类场景及所属范畴求解
两类函数提取的实现与所属范畴
1. 分解Either a b -> c类型的函数
要从接收Either a b返回c的函数中拆分出处理a和b的子函数,利用Left和Right构造器包裹输入后传入原函数即可:
splitEither :: (Either a b -> c) -> (a -> c, b -> c) splitEither func = (func . Left, func . Right)
- 第一个子函数
func . Left:接收a类型值,用Left包装后传给原函数,得到c类型结果 - 第二个子函数
func . Right:接收b类型值,用Right包装后传给原函数,得到c类型结果
2. 分解a -> (b, c)类型的函数
要从接收a返回元组(b, c)的函数中拆分出两个单值返回的子函数,用fst和snd提取元组元素即可:
splitPair :: (a -> (b, c)) -> (a -> b, a -> c) splitPair func = (fst . func, snd . func)
- 第一个子函数
fst . func:接收a类型值,传给原函数后取元组的第一个元素 - 第二个子函数
snd . func:接收a类型值,传给原函数后取元组的第二个元素
所属范畴
这两类操作属于范畴论在函数式编程中的基础应用,对应核心概念:
- 第一个操作对应**余积(Coproduct)**的函数分解:
Either a b是Haskell中a和b的余积类型,拆分逻辑是余积泛性质的反向应用 - 第二个操作对应**积(Product)**的函数分解:
(b, c)是Haskell中b和c的积类型,拆分逻辑是积泛性质的直接应用
这类操作也和函数式编程中的箭头变换、函子操作相关,可从「积与余积」「范畴论基础」方向深入学习。
内容的提问来源于stack exchange,提问作者Magvy
相关产品推荐
相关产品推荐

