Reason语言中.()与.{}语法的区别及用法咨询
为什么 Elm 中 Js.Promise 用
.(...) 而 Json.Decode 用 .{...} 语法? 这两种语法的作用完全不同,咱们一个个拆解清楚:
1. Js.Promise.( ... ):临时打开模块作用域
这个语法是 Elm 专门用来简化模块函数调用的——它相当于临时把 Js.Promise 模块的所有导出成员“拉”到当前代码块的作用域里,这样你在括号里调用模块内的函数时,就不用反复写 Js.Promise. 前缀了。
比如这段代码:
Js.Promise.( resolve "Hello" |> then_ (\msg -> resolve (msg ++ " World")) |> catch (\err -> resolve ("Oops: " ++ err)) )
完全等价于:
Js.Promise.resolve "Hello" |> Js.Promise.then_ (\msg -> Js.Promise.resolve (msg ++ " World")) |> Js.Promise.catch (\err -> Js.Promise.resolve ("Oops: " ++ err))
这种语法特别适合连续调用同一个模块的多个函数时使用,能让代码简洁很多。
2. Json.Decode.{ ... }:记录解构/字面量语法
这里的 .{} 和模块语法本身没关系,它是 Elm 的记录操作语法,常见两种用法:
情况一:创建包含解码器的记录
很多示例会把常用的 Json.Decode 函数整理成一个记录,方便后续复用。比如:
-- 把常用解码器打包成记录 commonDecoders = { string = Json.Decode.string , int = Json.Decode.int , listOfStrings = Json.Decode.list Json.Decode.string }
有些示例会简写为 Json.Decode.{ ... }(其实只是强调这些函数来自 Json.Decode 模块),但本质还是普通的记录字面量,前提是你已经导入了对应的函数(比如 import Json.Decode exposing (string, int)):
commonDecoders = Json.Decode.{ string = string, int = int }
情况二:解构记录中的解码器
如果某个模块把解码器打包成记录导出(比如自定义的解码模块),你可以用 .{} 来解构获取需要的成员:
-- 假设自定义模块 MyDecoders 导出了 decoders 记录 import MyDecoders -- 解构获取 string 和 int 解码器 MyDecoders.{ string, int }
不过官方的 Json.Decode 模块是直接导出单个函数,所以这种场景在官方示例里很少见。
简单总结:
Module.(...)是临时简化模块函数调用的语法Module.{...}本质是记录的创建或解构,和模块本身的语法无关,只是用来整理或提取模块里的函数
内容的提问来源于stack exchange,提问作者csb
相关产品推荐
相关产品推荐

