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

2019-10-18 10:31:58 +08:00
 index90

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

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

type Maybe struct {
  Val interface{}
  err error
}

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

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

3050 次点击
所在节点    Go 编程语言
7 条回复
Mistwave
2019-10-18 10:42:18 +08:00
Scala 欢迎你(逃
reus
2019-10-18 12:18:29 +08:00
monad 是一种静态类型的机制
当你有动态机制时,那就没必要用这个。如果不是设计类型系统时就考虑到,那模拟出来是没意义的
用 reflect 包动态操作就行了,那些静态类型的概念全都可以略过,反正你不需要也做不到编译期的类型安全
iRiven
2019-10-18 12:43:17 +08:00
还是缺泛型啊
lazyfighter
2019-10-18 15:32:19 +08:00
没看懂,那你 Val 类型,改成某一个接口,而不是单纯的 interface{},不就行了吗
ethego
2019-10-18 16:29:53 +08:00
做不了,Go 缺乏必要的静态类型分析。就算做出个类似的,各种依赖运行时也完全是积累。
ethego
2019-10-18 16:30:09 +08:00
*鸡肋
ChristopherWu
2019-10-18 16:42:34 +08:00
@ethego 做好了也只是玩具吧,各种类型反射转换,性能渣渣了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/610558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX