关于在F#中定义类型级自然数并用于C#实现带编译期维度检查的Matrix<M,N>类型的技术咨询
在F#中定义类型级自然数并用于C#实现编译期维度检查的
Matrix<M,N>类型的技术咨询 嘿,我之前琢磨过一个问题:能不能在C#里把矩阵的维度做成类型层面的属性?简单说就是想搞出一套泛型类Matrix<M, N>,其中M和N是自然数,最终目标是实现编译期维度校验——比如要是有人尝试把3x3矩阵和2x3矩阵相乘,直接在编译阶段就报错;或者能写出只接受方阵的函数(比如参数限定为Matrix<M, M>)。
可惜试了一圈发现C#里好像做不到,核心问题在于C#泛型类型Matrix<M, N>里的M和N必须是类型,不能是整数。不过我发现其他语言有对应的解决思路:
- 像Haskell这类函数式语言支持定义类型级自然数,要是C#也有这特性,那实现
Matrix<M, N>就顺理成章了。我对F#不算太熟,但查过相关回答,看起来F#是能做到这一点的。 - C++里可以用非类型模板参数,编译器会根据代码里实际用到的矩阵尺寸,在编译时生成对应的类。
- Haskell还有个叫索引类型族的特性,简直完全命中我想要的这个需求。
现在因为C#和F#都是.NET生态的语言,我最关心的就是F#的方案:有没有可能先在F#里实现我需要的类型级自然数,然后打包成库给C#项目用?最好是只在F#里搞定类型级自然数的定义,然后在C#里直接用它来实现Matrix<M, N>?
备注:内容来源于stack exchange,提问作者ummg
相关产品推荐
相关产品推荐

