码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Haskell:嵌套函子


    事情来自于我的一个突发奇想,想要实现一个广义的fmap'函数,实现处理嵌套Functor的效果,即实现

    • fmap' (+1) [1,2] = [2,3]
    • fmap' (+1) [[1,2],[2,3]] = [[2,3],[3,4]]

    这样的效果。

    attempt 1. 首先我们需要确定fmap'的类型。此处我觉得需要一个“嵌套函子”的类型。不过考虑到“两个函子结合之后依然是函子”,调研到Data.Functor.Compose这个库,这个库主要建立在“两个函子结合之后依然是函子”结论的基础上,核心代码如下:

    newtype Compose f g a = Compose { getCompose :: f (g a) }
    
    instance (Functor f, Functor g) => Functor (Compose f g) where
        fmap f (Compose x) = Compose (fmap (fmap f) x)
        a <$ (Compose x) = Compose (fmap (a <$) x)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这使我意识到并不需要定义新的“嵌套函子”类型类。
    attempt 2. 直接定义一个type Compose f g a = f (g a),然后按照上面的方式定义类型类实例即可。借助TypeOperators可以写出下面的代码:

    {-# LANGUAGE TypeOperators #-}
    
    type (f :+: g) a = f (g a)
    
    • 1
    • 2
    • 3

    但是因为type不允许部分应用,所以是不能写出一个Compose f g(在这里是f :+: g)作为instance的,即使新定义一个类型类也不行。
    这里主要的问题是,:+:的kind是(:+:) :: (* -> *) -> (* -> *) -> * -> *,是需要接收3个参数的operator。如果我们有能力对kind也进行curry化就好了。

    update1. 在这个过程中留意到Data.Functor.Bind库,里面定义了没有pure的Applicative(Apply)和没有return的Monad(Bind),后者相当于只实现了join,很有意思的一个Functor,和只实现了 point的Pointed类型类(在Data.Pointed里面)对映成趣。张凇的书里提到了这件事,不过我更推荐阅读这里。

    update2. Functor combination的思路也很吸引我!感觉函数式编程的内容实在太广泛了,却看不到一条路可以通向这些内容

  • 相关阅读:
    机器学习-搜索技术:从技术发展到应用实战的全面指南
    python---装饰器
    一次因没有找到iframe元素而怀疑selenium4是不是有问题?
    Python【多分支实际应用的练习】
    Spring篇---第一篇
    达梦:开启sql日志记录
    计算机毕业设计Python+djang基于大数据的应届生求职系统(源码+系统+mysql数据库+Lw文档)
    你需要偷偷珍藏的java兼职平台
    5. 最长回文子串
    操作系统学习笔记(5.输入/输出管理)
  • 原文地址:https://blog.csdn.net/WinterShiver/article/details/126935392
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号