The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
index90

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

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