【发布时间】:2018-05-10 08:38:39
【问题描述】:
在阅读库代码 here 时,我注意到一个看起来很奇怪的语法,我无法理解:
momenta
:: (KnownNat m, KnownNat n)
=> System m n
-> Config n
-> R n
momenta Sys{..} Cfg{..} = tr j #> diag _sysInertia #> j #> cfgVelocities
-- ^^^^^^^^^^^^^^^ the syntax in question
where
j = _sysJacobian cfgPositions
System的相关定义包括一条记录{ _sysJacobian :: R n -> L m n },而{ cfgVelocities :: R n }是Config的记录声明的一部分所以我相信我知道代码是做什么的,我认为代码可读性很强,道具给作者。
问题是:这个语法叫什么,我该如何使用它?
【问题讨论】:
-
如果有人能想出更好的标题,请随时编辑
-
这是
RecordWildcards扩展名,如stackoverflow.com/a/38052886/14955 所示? -
@Thilo 确实如此。有点不幸的是,使用所有非 acii 字符的搜索引擎很难找到语法,因为已经存在这样一个广受欢迎的答案。
-
RecordWildCards是一个相当有问题的扩展,原因与非限定通配符导入的原因相同——它使代码更容易编写,但以后更难阅读,因为你无法分辨标识符的来源;另外,记录/模块可能会添加一个字段/导出,其名称与您使用记录/模块的范围内的其他标识符冲突。一个更好的解决方案 imo 是NamedFieldPuns,您可以将Record { foo, bar, baz }写成Record { foo = foo, bar = bar, baz = baz }的缩写(在模式或表达式中)——仍然相当简洁,但更清晰、更明确。