开发者生态
morning
尝试微光
摘要
Introduction If you have read my recent rant about programming languages , you'll know I've been quite interested in Gleam . Gleam is a functional language that targets BEAM, the Erlang VM, with a sim...
Gleam
the
you
and
language
with
for
functional
that
Erlang
2026-11-09
1 阅读
约7分钟阅读
nchagnet
字号:
简介 如果您读过我最近关于编程语言的咆哮,您就会知道我对 Gleam 非常感兴趣。 Gleam 是一种针对 BEAM(Erlang VM)的函数式语言,具有简单的语法以及与更广泛的 BEAM 生态系统(Erlang 和 Elixir)的互操作性。有趣的是,Gleam 还可以针对 JavaScript,即 Gleam 可以编译为 JavaScript 并通过 Node.js 运行。我主要将 Rust 用于业余爱好项目,这是目前唯一真正让我享受编码的语言,而 Gleam 也成功地解决了这个问题。如果您是 Rust 鉴赏家,那么 Gleam 会给您带来熟悉的感觉,除了一些关键的差异。我觉得我编写的 80% 的代码可以复制粘贴到 Rust(带有搜索和替换语法的味道)并且可以编译。这篇文章不会对该语言进行详尽的概述,如果您想了解更多信息,我推荐优秀的交互式教程。不到半小时,您就会对 Gleam 有了良好的感觉。 Gleam:优点 在其主页上,Gleam 被描述为“一种用于构建可扩展的类型安全系统的友好语言!” (强调他们的)它很好地传达了 Gleam 的全部内容。 Gleam 很友好语法非常简单,大多数复杂的东西都被 Erlang 运行时隐藏了,除非你愿意,否则你实际上不必与之交互!当然,Gleam 是一种函数式语言,因此如果您一生都生活在 C 型命令式世界中,一开始可能会有点令人畏惧。但如果你将它与其他函数式语言(OCaml、Haskell、Erlang)进行比较,你很快就会发现 Gleam 简单得多。使用了一下之后,感觉就像 Rust 的所有功能部分一样,只是缺少一些功能,并且没有任何必要的部分。让我们从一段示例代码开始: Gleam // 省略导入 pub fn main () { let total = "1,X,5,6" // String |> string . split ( on : "," ) // List(String) |> list . map ( int . parse ) // List(Result(Int, Nil)) |> result . value // List(Int),无效条目被删除 |> list . reduce ( fn ( acc , x ) { acc + x }) // 结果(Int, Nil) |> 结果 . unwrap ( 0 ) // Int echo Total // 12 } Rust fn main () { let total = "1,X,5,6" // &str .分裂 ( ”,” ) 。映射 (| s | s .parse :: < i64 >()) 。 filter_map(Result::ok) // 此处可以使用 .sum() 。减少 (| acc , x | acc + x ) 。解包或(0);打印! ( “{}“ , 全部的 ) ; // 12 } 稍微剖析一下,您可以看到 Gleam 的一些特殊性:Gleam 中的变量是不可变的(因此没有 mut 关键字或类似的东西),这里的链式函数都返回一个新元素。您仍然可以使用新的 let 隐藏绑定,这就是“更新”值的方式。 |> (类型 |> )是用于链接数据函数的管道运算符。主要约束是管道变量应该是管道中函数的第一个参数。就像 Rust 一样,Gleam 中的错误只是作为 Result monad 一部分的值。与 Rust 代码片段相比,您可以看到,在一些命名选择上,它们看起来非常相似。此示例中的主要区别实际上是管道与链接语法。微光类型没有方法,因此使用管道代替。管道运算符 |> 是您将在本文中遇到的 Gleam 三个吉祥物功能中的第一个,另外两个是使用模式和尾部调用优化。使用模式 如果您编写了大量 JavaScript,您可能已经习惯了将许多回调嵌套在一起时出现的缩进蠕变 someFunc ( arg , function ( param ) { someOtherFunc ( param , function ( otherParam ) { // ... }) }) 在 Gleam 中,许多函数都需要回调,例如,因为作为控制对资源的访问并在进程完成时进行清理的一种方式(关闭数据库连接、释放文件)手柄等)。为了避免这种回调塔,Gleam 提供了一些语法糖:使用 param <- some_func(arg) 相当于 some_func(arg, fn(param) { ... }) 。回调必须始终是函数的最后一个参数。这与 |> 相反,后者填充第一个。使用 use param <- some_func ( arg ) use other_param <- some_other_func ( param ) echo other_param 不使用 some_func ( arg , fn ( param ) { some_other_func ( param , fn ( other_param ) { echo other_param }) }) 尾调用优化 如果您不熟悉的话,这可能真的会让您感到困惑。您需要知道的第一件事是 Gleam 中没有循环!同样,如果您以前编写过 OCaml 或 Haskell,您不会对此感到惊讶。在 98% 的情况下,循环是有界迭代上的简单操作。考虑列表或集合上的 for 循环。正是这种事情,在 Rust 中你总是有两种方法来做:一种是使用精确的 for 循环的命令式,另一种是更实用的迭代器操作组合。好吧,如果你看一下上一节中的代码示例,你会发现 Gleam 使用第二种,并且有大量的函数来迭代列表,
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱