建议 newtype 语法模仿 rust 语言的声明方式

struct UserId(Int)
struct UserName(String)

let user_id = UserId(1)
let user_name = UserName("abc")

enum User {
  UserId(Int)
  UserName(String)
}


match user {
    UserId(uid) => ...
    UserName(uname) => ...
}

上面类 rust 方式的写法,无论声明类型、构造值、模式匹配,还是与 enum 中的定义都保持了高度的一致性,很有利于新用户上手入门,

目前的 struct 有 T::{} 的构造语法,类似的 tuple struct 可以有类似的 T::(…) 构造语法,或者直接 T(…)

在此基础上面,感觉还可以加匿名 struct:

let point1 = struct { x: 3, y: 4 }
// let point1 = #{x:3, y: 4}

let point2 = struct(3, 4)
// let point2 = #(3, 4)

匿名的 tuple struct 和目前的 tuple 类型其实是一个东西,
如果加入了匿名 tuple struct,tuple 类型也可以不需要了,
最终只用 struct 可以定义所有的结构类型了,
更统一更一致了

MoonBit 之所以把 newtype 单独拆出来,是因为我们会保证 newtype 是零开销的(type T Int 的话,T 在运行时一定就是 Int)。而普通的 struct/enum 的话,是会 box 一层的。虽然单 field 的 struct 可以优化掉,但这样 debugger 看到的东西会不那么好看

感觉 newtype 属于过早优化了,
建议不要像 golang 那样前期过于关注个别特性和速度,牺牲了语言的统一性、易用性、拓展性,
导致后期语言不易扩展,语法丑陋,引来大量批评

newtype 这个特性不会影响统一性、易用性、拓展性,因为你总是可以用 struct 来实现同样的事情,比如:

struct T {
  content: Int
}

这样就和普通的 struct 是统一的了,像 Rust 那样把 tuple 和 struct 和 newtype 和 zero sized type 混为一谈才会影响统一性和易用性,不利于新人上手

2 个赞