V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
index90

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

  •  
  •   index90 · Oct 18, 2019 · 3594 views
    This topic created in 2389 days ago, the information mentioned may be changed or developed.

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

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

    type Maybe struct {
      Val interface{}
      err error
    }
    

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

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

    7 replies    2019-10-18 16:42:34 +08:00
    Mistwave
        1
    Mistwave  
       Oct 18, 2019 via iPhone
    Scala 欢迎你(逃
    reus
        2
    reus  
       Oct 18, 2019
    monad 是一种静态类型的机制
    当你有动态机制时,那就没必要用这个。如果不是设计类型系统时就考虑到,那模拟出来是没意义的
    用 reflect 包动态操作就行了,那些静态类型的概念全都可以略过,反正你不需要也做不到编译期的类型安全
    Erskine
        3
    Erskine  
       Oct 18, 2019 via Android
    还是缺泛型啊
    lazyfighter
        4
    lazyfighter  
       Oct 18, 2019
    没看懂,那你 Val 类型,改成某一个接口,而不是单纯的 interface{},不就行了吗
    ethego
        5
    ethego  
       Oct 18, 2019
    做不了,Go 缺乏必要的静态类型分析。就算做出个类似的,各种依赖运行时也完全是积累。
    ethego
        6
    ethego  
       Oct 18, 2019
    *鸡肋
    ChristopherWu
        7
    ChristopherWu  
       Oct 18, 2019
    @ethego 做好了也只是玩具吧,各种类型反射转换,性能渣渣了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   958 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 18:11 · PVG 02:11 · LAX 11:11 · JFK 14:11
    ♥ Do have faith in what you're doing.