现在 go 其实也可以写成 rust 的这样,但是没有 match 意义不大
package main
type Optional[T any] struct {
Some T
IsNull bool
}
func Some[T any](value T) Optional[T] {
return Optional[T]{
value,
false,
}
}
type Result[T any] struct {
OK T
Error error
}
func OK[T any](value T) Result[T] {
return Result[T]{value, nil}
}
func a() Result[string] {
return OK("1")
}
func main() {
var s = Some(1)
if s.IsNull {
}
var b = OK(a())
if b.Error != nil {
}
}
我在想能不能借助 IDE 包装一层 go++ 以提供自定义语法糖,go++ 翻释成 .go 后再去编译
1
blless 2022 年 7 月 4 日
https://github.com/andeya/gust 在 github 上看到有个库。。
|
2
yazinnnn 2022 年 7 月 4 日
这难道不叫 haskell style?
|
3
Leviathann 2022 年 7 月 4 日
@yazinnnn 应该是 ADT
|
4
GuuJiang 2022 年 7 月 4 日 其实完全没有可比性,因为不管 haskell 的 Maybe 和 Either 也好,rust 的 Option 和 Result 也好,都是一种和类型(sum type),而 go 里不管是原生的(result, err)也好,还是你这个例子里的 Optional 和 Result 也好,都是一种积类型(product type),二者是完全不同的两个东西,说句可能会引战的话,go 的 error handling 就是个没有理解和类型与积类型的区别,抄作业只抄了一半的结果
|
5
luob 2022 年 7 月 4 日
没有模式匹配是万恶之源
|
6
hxtheone 2022 年 7 月 4 日 via iPhone
没有 pattern match 莫得灵魂呀
|
7
rrfeng 2022 年 7 月 4 日
应该是这样吧?
type Result interface { T|error } |
8
novolunt 2022 年 7 月 4 日
rust 不是号称用来惩罚程序员的吗
|
9
yazinnnn 2022 年 7 月 4 日 别抄 result 了, 抄 either 吧,不然 err 连类型都没办法确定
https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Either.html either 偏向右值是正确值, 毕竟 right is right |
10
chenzhekl 2022 年 7 月 4 日
这样写很浪费内存,本来 Go 就很吃内存了。
|
11
pastor 2022 年 7 月 4 日
用 go 却不用 go style ,你们真是够够的了
|
12
DonkeyBenjamin 2022 年 7 月 4 日
别人 rust 能这么玩,有 exhaustive pattern matching, if let, combinator, thiserror, anyhow, ... 你 go 有啥对应的
|
13
jorneyr 2022 年 7 月 4 日 泛型、切片、数组?
傻傻分不清。 |
14
Leviathann 2022 年 7 月 4 日
@GuuJiang 根据 rob pike 的博客来看,基本上可以确定就是一次重新发明了个三角形轮子的行为
|
16
Wanex 2022 年 7 月 4 日
那为什么不直接用 rust 还要用 go 呢
|