Fuse: 静态类型纯函数式编程语言
Show HN: Fuse – statically typed functional programming language
Fuse 是一款静态类型、纯函数式编程语言,支持高阶类型和特设多态。它编译到 GRIN 全程序优化器,生成 LLVM 原生代码,提供零成本抽象。语法灵感来自 Rust、Python、Scala 和 Haskell,采用缩进块和模式匹配,代码简洁易读。类型推断强大,仅需函数签名,其余自动推导。适合追求表达力与性能并重的开发者。
每一行代码都是纯函数,模式匹配与高阶函数让你写出既优雅又高效的程序。
HN 评论区
47- codebje
很高兴看到 GRIN 后端在实际中落地!
这看起来是一门整洁小巧的函数式语言——语法简洁易懂,语义通常也很清晰。作为一个单人开发项目,你能把它做到可以编译并运行完整程序,这真是一项了不起的成就!
标准库中的字符串类型似乎不支持 Unicode,这点可能值得提一下。虽然实现 Unicode 支持是个大工程,但现在就考虑未来是否要加入它,可能会影响你的库设计。
我不太理解为什么需要一个 IO monad。这门语言并不纯——`.exec()` 意味着任何函数无论其类型签名如何,都可以执行 IO 操作——那 IO 到底是为了什么?
`impl` 的添加会导出吗?如果两个库为同一个类型的 `impl` 添加了同名的函数(但签名不同,或者仅仅是函数体不同),会发生什么?
柯里化是自动的吗?看起来似乎不是,但例如 `sum(x: i32, y: i32)` 这个函数理论上可以调用 `sum(5)` 来创建一个闭包,如果是这样,这似乎并未被文档记录为一个特性。
网站字体使用的是连字(ligatures),而不是 Unicode 运算符符号——我个人觉得用非连字字体来展示真实内容会更清晰,但这与语言本身无关。
- Twey
很高兴看到 GRIN 的真实用例!
trait Functor[A]:
fun map[B](self, f: A -> B) -> Self[B];
这在我看来有点奇怪。我看到你可以用 η-长形式(η-long form)写出 HKT,并且引用未应用的类型(如 `Functor`)。但我不明白如何用这种语法将不依赖于 `A` 的东西附加到 trait 上。举个(愚蠢的)例子:
trait SizedFunctor[A]: Functor[A]:
type Size;
fun size(self) -> Size;
我如何知道 `List[A]::Size` 和 `List[B]::Size` 是同一个类型?
与此相关,我想把这里的 `Self` 理解为“实现 `Functor[A]` 的那个东西”(例如 `List[A]`),但这会导致实例化后的 `Self[B]` 变成 `List[A][B]`,我认为这应该是一个 kind 错误。
- thesz
表面上看,我觉得这种语法读起来非常不直观。大多数语言都选择用 <> 来表示类型变量。你选择偏离这一惯例而使用 [],有什么特定的原因吗?