新闻详情

新闻详情

首页 / 资讯中心 / 详情

揭秘mathjs架构:typed-function类型分派与依赖注入如何支撑任意数据类型扩展

发布时间:2026/11/4 10:00:59来源:尧图网络
揭秘mathjs架构:typed-function类型分派与依赖注入如何支撑任意数据类型扩展
揭秘mathjs架构typed-function类型分派与依赖注入如何支撑任意数据类型扩展【免费下载链接】mathjsAn extensive math library for JavaScript and Node.js项目地址: https://gitcode.com/gh_mirrors/ma/mathjsmathjs 是一款功能全面的 JavaScript / Node.js 数学库math library能混算数字、大数BigNumber、复数、分数、单位与矩阵。它为什么还能让你轻松扩展自定义数据类型答案就藏在架构里——typed-function 类型分派与依赖注入这两大核心机制。本文带你快速看懂这套设计并学会用它扩展自己的类型。一、先认识 mathjs一个可扩展的数学引擎mathjs 提供两大入口体验函数调用math.add、math.sqrt等数百个内置函数与常量表达式解析evaluate(12.7 cm to inch)直接算出5 inch还支持符号运算与自定义函数。但真正让 mathjs 区别于普通数学库的是它的架构目标用统一方式混用任意数据类型并且允许你低成本地加入新类型。这一目标靠两个引擎实现。 官方架构说明见 README.md扩展指南见 docs/core/extension.md。二、第一引擎typed-function 类型分派Type Dispatch什么是类型分派普通 JavaScript 函数只有一种实现而typed function可以为同一函数名挂多个签名运行时根据参数类型自动选择对应实现// 同一个 max 函数按参数类型分派到不同实现 const max typed(max, { number, number: (a, b) Math.max(a, b), BigNumber, BigNumber: (a, b) (a.greaterThan(b) ? a : b) })这正是 mathjs 内部所有函数的构建方式——比如add同时拥有标量、稠密矩阵、稀疏矩阵等多套签名源码见 src/function/arithmetic/add.js。三个关键能力能力说明举例多签名分派按参数类型自动路由math.add(2, 3)走数字签名math.add(unit(5cm), unit(2mm))走单位签名自动类型转换签名不匹配时按转换表隐式转换参数math.add(3, fraction(1, 2))中number自动转为Fraction签名列合并两个同名 typed 函数可无冲突地合并即给老函数加新类型导入自定义add后原有的add自动获得新类型支持类型与转换表的注册集中在 src/core/function/typed.jsnumber、Complex、BigNumber、Fraction、Unit、Matrix等几十个类型按性能敏感顺序排列随后通过typed.addConversions([...])声明了约 20 条隐式转换规则如number → BigNumber、boolean → number源码见 src/core/function/typed.js。⚡ 注意转换是保守的例如带超过 15 位有效数字的number不会隐式转BigNumber会直接报错提示你显式使用bignumber()避免悄悄丢失精度。三、第二引擎依赖注入Dependency Injection工厂函数函数不是直接导出的而是造出来的mathjs 中几乎每个功能模块都不直接导出函数而是导出一个工厂函数factory function。以加法为例src/function/arithmetic/add.js 开头声明const name add const dependencies [typed, matrix, addScalar, equalScalar, DenseMatrix, SparseMatrix, concat]这段依赖清单是关键add不自己实现一切它声明我需要typed、addScalar、DenseMatrix这些依赖由框架在创建时注入真实的实现。工厂机制的完整实现含依赖校验、可选依赖?xxx、依赖拓扑排序见 src/utils/factory.js。依赖注入解决了什么问题能力自动传导一旦你给add扩展了新类型支持所有在底层调用add的函数如sum、prod也自动获得新类型支持无需逐一手改——这就是扩展一个函数全家受益。轻量版可替换如果只需要纯数字运算可以用一个极简的multiply实现注入到prod等函数中绕开 BigNumber、矩阵等重型分支得到体积与速度都更优的轻量实例。实例化入口统一核心函数math.create(...)接收一批工厂函数按依赖顺序创建出一个函数集合实例见 src/core/create.js。所有导入都经由 src/core/function/import.js 完成其中同名 typed 函数会自动合并签名而非报错覆盖。四、动手扩展给你的类型接入 mathjs完整可运行示例见 examples/advanced/custom_datatype.js思路只有三步注册新类型用factory(CustomValue, [typed], ...)定义类并调用typed.addType({ name, test })让类型分派认识它为新类型补签名再造一个名为add的 typed 函数仅提供CustomValue, CustomValue这一个签名导入实例math.import([createCustomValue, createAddCustomValue])。导入后会发生两件魔法math.add(new CustomValue(2), new CustomValue(3))返回CustomValue:5签名合并生效更妙的是math.sum(...)等依赖add的函数自动支持CustomValue依赖注入传导生效。 官方文档中这一流程的详细说明含工厂函数 meta 选项lazy、recreateOnConfigChange、isTransformFunction等见 docs/core/extension.md。五、实用选型完整版还是轻量数字版mathjs 的构建脚本会生成两类入口对应不同的依赖注入组合入口适用场景说明完整版all需要矩阵、单位、表达式解析等全部能力工厂清单见 src/factoriesAny.js轻量数字版只要纯number运算追求体积与性能纯函数实现不依赖 typed-function见 src/entry/mainNumber.js 与 src/plain/number/还可以只取依赖组做树摇构建脚本会为每个函数生成依赖全部工厂的对象例如math.create(addDependencies)只加载add及其依赖不打包任何无关功能。这解释了为什么 mathjs 能同时服务浏览器小工具和科学计算服务。六、小结typed-function 类型分派一个函数名挂多套类型签名 自动类型转换 签名可合并让新类型能无痛加入已有函数依赖注入 工厂函数函数声明依赖、由create/import统一注入能力自动向下传导也允许整体替换为轻量实现两者配合构成了 mathjs 任意数据类型扩展的完整答案扩展一个函数整个函数生态随之受益。想深入源码建议按 src/utils/factory.js → src/core/create.js → src/core/function/typed.js → src/core/function/import.js 的顺序阅读再配合 examples/advanced/ 下的定制示例练习。【免费下载链接】mathjsAn extensive math library for JavaScript and Node.js项目地址: https://gitcode.com/gh_mirrors/ma/mathjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/4 15:56:54

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/3 12:09:35

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/4 17:01:23

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/4 12:33:12

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉