现在 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-07-04 13:29:38 +08:00
https://github.com/andeya/gust 在 github 上看到有个库。。
|
2
yazinnnn 2022-07-04 14:15:15 +08:00
这难道不叫 haskell style?
|
3
Leviathann 2022-07-04 14:26:05 +08:00
@yazinnnn 应该是 ADT
|
4
GuuJiang 2022-07-04 14:46:22 +08:00 2
其实完全没有可比性,因为不管 haskell 的 Maybe 和 Either 也好,rust 的 Option 和 Result 也好,都是一种和类型(sum type),而 go 里不管是原生的(result, err)也好,还是你这个例子里的 Optional 和 Result 也好,都是一种积类型(product type),二者是完全不同的两个东西,说句可能会引战的话,go 的 error handling 就是个没有理解和类型与积类型的区别,抄作业只抄了一半的结果
|
5
luob 2022-07-04 14:57:56 +08:00
没有模式匹配是万恶之源
|
6
hxtheone 2022-07-04 15:04:31 +08:00 via iPhone
没有 pattern match 莫得灵魂呀
|
7
rrfeng 2022-07-04 15:06:34 +08:00
应该是这样吧?
type Result interface { T|error } |
8
novolunt 2022-07-04 15:13:14 +08:00
rust 不是号称用来惩罚程序员的吗
|
9
yazinnnn 2022-07-04 15:22:21 +08:00 2
别抄 result 了, 抄 either 吧,不然 err 连类型都没办法确定
https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Either.html either 偏向右值是正确值, 毕竟 right is right |
10
chenzhekl 2022-07-04 16:20:53 +08:00
这样写很浪费内存,本来 Go 就很吃内存了。
|
11
pastor 2022-07-04 16:26:00 +08:00
用 go 却不用 go style ,你们真是够够的了
|
12
DonkeyBenjamin 2022-07-04 16:30:36 +08:00
别人 rust 能这么玩,有 exhaustive pattern matching, if let, combinator, thiserror, anyhow, ... 你 go 有啥对应的
|
13
jorneyr 2022-07-04 16:49:34 +08:00 1
泛型、切片、数组?
傻傻分不清。 |
14
Leviathann 2022-07-04 16:51:07 +08:00
@GuuJiang 根据 rob pike 的博客来看,基本上可以确定就是一次重新发明了个三角形轮子的行为
|
16
Mexion 2022-07-04 16:54:49 +08:00
那为什么不直接用 rust 还要用 go 呢
|