首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

当 Go 没有 Generic 的时候,如何正确使用 monad?

  •  
  •   index90 · 28 天前 · 1497 次点击

    已经被 OOP 虐得死去活来,看了几天函数编程思想,仿佛见到光明。

    Go 已经很爽了,如果再加入函数编程思想就更爽了。目前有一些库实现了 monad 的原型,但在实际使用中遇到一些问题。由于 Go 没有 Generic,所以只能由 interface 去代替,这样导致编译阶段无法判断调用链中的参数类型是否匹配。

    type Maybe struct {
      Val interface{}
      err error
    }
    

    即上一个函数输出的 Maybe.Val ,不一定匹配下一个函数的入参。 既然编译时无法发现错误,只能运行时发现了,我目前做法是写一个 HappyPath 的单元测试,跑过整个调用链。但我本来就是想用 monad 把大块的逻辑拆开各自做单元测试,现在又合回来了。

    各位有没有经验分享一下?

    7 回复  |  直到 2019-10-18 16:42:34 +08:00
        1
    Mistwave   28 天前 via iPhone
    Scala 欢迎你(逃
        2
    reus   28 天前
    monad 是一种静态类型的机制
    当你有动态机制时,那就没必要用这个。如果不是设计类型系统时就考虑到,那模拟出来是没意义的
    用 reflect 包动态操作就行了,那些静态类型的概念全都可以略过,反正你不需要也做不到编译期的类型安全
        3
    iRiven   28 天前 via Android
    还是缺泛型啊
        4
    lazyfighter   27 天前
    没看懂,那你 Val 类型,改成某一个接口,而不是单纯的 interface{},不就行了吗
        5
    ethego   27 天前
    做不了,Go 缺乏必要的静态类型分析。就算做出个类似的,各种依赖运行时也完全是积累。
        6
    ethego   27 天前
    *鸡肋
        7
    ChristopherWu   27 天前
    @ethego 做好了也只是玩具吧,各种类型反射转换,性能渣渣了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3952 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 38ms · UTC 07:21 · PVG 15:21 · LAX 23:21 · JFK 02:21
    ♥ Do have faith in what you're doing.