假设我已经定义了一个度量单位:
[<Measure>] type Blob
我想要一个类型,以每秒Blobs的值作为构造函数参数:
type Something(flowRate:double<Blob/s>) = ...
F#对此抛出一个摇摆不定 - "double不期望任何类型的参数,但这里给出了1个类型的参数"
我理解这个消息.我曾经认为我试图做的很明显,但我承认语法可能是错误的.问题是,我如何在代码中表达这种关系?
我想知道是否有任何甜言蜜语为"英尺"与"英寸"或"厘米"等提供某种抽象.我正在考虑在Java中做类似以下的事情:
u(56).feet() + u(26).inches()
Run Code Online (Sandbox Code Playgroud)
并能够得到类似的东西
结果为17.7292米.
一种可能的方法是,在创建新值时,立即将其转换为"基础"单位,如米或其他东西,以便您可以轻松添加它们.
但是,我宁愿有能力保存单位,所以就像这样
u(799.95555).feet() - u(76).feet()
Run Code Online (Sandbox Code Playgroud)
回报
723.95555 feet
Run Code Online (Sandbox Code Playgroud)
并不是
243.826452 meters - 23.1648 meters = 220.661652 meters
//220.661652 meters to feet returns 723.955551 feet
Run Code Online (Sandbox Code Playgroud)
既然这个问题看起来很普遍,那么是否存在任何框架甚至是一种优雅处理这种问题的编程语言?
我想我可以在我的方法中添加单位,将匹配单位+-*/添加到一起,只在需要时进行转换以便[加/减/乘/除],这对于加法和减法非常有用:
//A
{
this.inches = 36.2;
this.meters = 1;
}
//total length is 1.91948 m
Run Code Online (Sandbox Code Playgroud)
如果我用值添加到对象B
//B
{
this.inches = 0.8;
this.meters = 2;
}
//total length is 2.02032 m
Run Code Online (Sandbox Code Playgroud)
我得到一个新的对象
{
this.inches = 37;
this.meters = 3;
}
//total length is 3.9398 meters
Run Code Online (Sandbox Code Playgroud)
这真是太棒了,每当我想要没问题时我都可以转换它.但是乘法等操作会失败......
//A * …Run Code Online (Sandbox Code Playgroud) 我试图用这样的boost-units制作一个带尺寸的矢量类,
//vector will be constructed vec<si::length> v(10, 1.0*si::metre);
template<typename dimension>
class vec
{
public:
//constructor setting all values to q.
vec(const size_t, const boost::units::quantity<dimension> q)
//etc
}
Run Code Online (Sandbox Code Playgroud)
这一切工作正常,除了operator*=和operator/=那些元素方式乘法和除法.由于这些不会改变维度,因此只有在乘以/除以无量纲数量时才有意义:我正在努力寻找未锁定到特定系统的任意无量纲数量(例如si或cgs单位).
我想要的东西,
/** Multiply a dimensionless vector. */
vec<dimension>&
operator*=(const vec<boost::units::dimensionless_type>& b);
Run Code Online (Sandbox Code Playgroud)
或许是一些元编程魔术(我注意到boost :: units :: is_dimensionless存在,但我不知道如何使用它,因为我不熟悉一般的元编程技术)
template<typename dimension>
template<typename a_dimensionless_type>
vec<dimension>&
vec<dimension>::operator*=(const vec<a_dimensionless_type>& b){
//some compile time check to make sure that a_dimensionless_type is actually dimensionless?
//the rest of the function
}
Run Code Online (Sandbox Code Playgroud)
我想要以下示例进行编译
vec<si::dimensionless> d(10, 2.0);
vec<si::length> l(10, …Run Code Online (Sandbox Code Playgroud) 我在使用metascala中的度量单位功能时遇到了问题,该功能在Units.scala文件中定义.
对于本问题的其余部分,我将使用简化方案,只有一种单位类型,长度.
所以现实中的类型看起来像
Quantity[_1, _0, _0, _0, _0, _0, _0]
^ ^ ^ ^ ^ ^ ^
| | | | | | |
| Mass | Crncy.| Mol |
Length Time Temp. Lum.Intensity
Run Code Online (Sandbox Code Playgroud)
这足以证明问题:
Quantity[_1]
^
|
Length
Run Code Online (Sandbox Code Playgroud)
一旦需要推断出类型,麻烦就开始了.
考虑这个例子(也看看UnitsTest.scala中的代码):
val length: Quantity[_1] = m(5)
val area: Quantity[_2] = length * length // (1) Works
val dist: Quantity[_1] = area / length // (2) Doesn't work!
Run Code Online (Sandbox Code Playgroud)
我在最后一行收到错误说:
type mismatch;
found : …Run Code Online (Sandbox Code Playgroud) 从概念上讲,在我看来,使用基于单位强制执行的类型(Meters,Seconds,Kilograms)会有很大的好处(额外检查传递args,摆脱变量中的单位名称等)但我没有遇到过多少代码哪个.我见过的代码确实使用了自定义类型.
我看到boost有一个单元库(boost :: units就够了)然而,我没有看到它被广泛使用的广泛使用的证据(在基本的谷歌搜索中).
有这么好的理由吗?
这些似乎意味着必须有某种原因这种做法没有像我期望的那样被广泛采用.也许比某些原因值得更麻烦?
所以我问:
有没有理由不使用单位执行类型?特别是有理由不使用boost :: units吗?
我正在创建材料及其物理属性的链接数据,而我在为某些属性设置单位时遇到问题.我个人的材料:AlMg3有一些机械性能,如:
:AlMg3 prop:hasTensileStrength "300" .
:AlMg3 prop:hasYieldStrength "2" .
:alMg3 prop:hasDensity "2200" .
Run Code Online (Sandbox Code Playgroud)
如何为这些值设置单位?我的第一个想法是创建新的数据类型,例如:
unit:megaPascal rdf:type rdfs:datatype ;
rdfs:label "MPa" .
unit:Pascal rdf:type rdfs:datatype ;
rdfs:label "Pa" .
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它们:
:AlMg3 prop:hasTensileStrength "300"^^unit:megaPascal .
:AlMg3 prop:hasYieldStrength "2"^^unit:Pascal .
Run Code Online (Sandbox Code Playgroud)
然后我想把这些单位联系起来:
unit:megaPascal prop:hasBaseUnit unit:Pascal .
unit:pascal prop:hasBaseSIUnit unit:kilogramPerMeterSecondSquared .
Run Code Online (Sandbox Code Playgroud)
这可能吗?单位是数据类型,我不能在它们之间放置数据类型属性,除了注释属性?是否有可能使这些单位个体(甚至是类)并使用它们之后的数据类型?
我看到了用于QUDT(数量,单位,尺寸和数据类型)的OWL本体,但我打算尝试创建一些更简单的东西.
为了练习一点F#,我正在建立一个简单的游戏.游戏涉及resources玩家可以花费.有3种资源.游戏中的项目和动作具有关联cost,可以组合任意数量的这些资源的数量(或者没有,用于自由行动).我开始实现这一点很多:在F#中创建一个包含多个浮点数测量单位的列表
[<Measure>] type gold
[<Measure>] type wood
[<Measure>] type stone
type Resource =
| Gold of int<gold>
| Wood of int<wood>
| Stone of int<stone>
Run Code Online (Sandbox Code Playgroud)
现在我需要一个集合数据类型来表示一个cost.我希望它:
包含Resources.理想情况下,它将被限制为每种类型不超过1个资源,但我可以不用安全.
无序.理想情况下(1<gold>, 2<wood>)需要平等(2<wood>, 1<gold>)而不重新定义类型的相等性.
可以轻松地与另一个相同类型的集合(动作可能有可选成本,这将加上正常成本)和可减少(从玩家的资源池).
什么是一个很好的F#集合类型呢?我意识到没有多少是无序的.我在看,Set<'T>但"基于二叉树"部分让我有点困惑,我不确定它是否适合我的需要.
你怎么看 ?我错过了设计中明显的东西吗?
我想在我的Django项目中实现不同的测量系统,以便用户可以选择他们想要使用公制或英制单位.但是,我不知道这样做的正确方法是什么.
目前我的模型没有测量单位感知字段(它们是整数/十进制字段),我希望我不必直接更改字段.
由于我当前的数据库值已经表示度量值,我计划保持这种方式,这意味着我将不得不处理用户输入/值输出转换.Pint似乎是一个很好的图书馆.
如果没有在应用程序中编辑字段,但是使用注册模式或其他内容,这是否可行?我想要实现的是这样的:
这种解决方案可以更容易地将其插入现有应用程序,因为在应用程序中不会直接更改任何字段和表单.使用注册模式的基本示例会很有帮助.
欢迎提供任何相关信息,包括在非Django项目中如何完成此操作的一般概念和模式.
我目前正在使用Pint来处理单位和单位转换.例如,这似乎适用于已在Pint中定义的单元
>>> import pint
>>> ureg = pint.UnitRegistry()
>>> Q = ureg.Quantity
>>> a = Q(5, 'm/s')
>>> a
<Quantity(5, 'meter / second')>
>>> a.to('ft/s')
<Quantity(16.404199475065617, 'foot / second')>
Run Code Online (Sandbox Code Playgroud)
我试图定义自己的单位,代表百分比.就单位转换而言,百分比只是无量纲分数的100倍,这就是我定义它的方式.
>>> ureg.define('percent = dimensionless * 100 = pct')
>>> a = Q(5, 'pct')
>>> a
<Quantity(5, 'percent')>
Run Code Online (Sandbox Code Playgroud)
但是我似乎无法在fraction('dimensionless')和'pct'.之间来回转换.
>>> a.to('dimensionless')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
a.to('dimensionless')
File "C:\Python35\python-3.5.1.amd64\lib\site-packages\pint\quantity.py", line 263, in to
magnitude = self._convert_magnitude_not_inplace(other, *contexts, …Run Code Online (Sandbox Code Playgroud) types ×3
boost ×2
c++ ×2
f# ×2
python ×2
alias ×1
boost-units ×1
collections ×1
constructor ×1
django ×1
generics ×1
gis ×1
linked-data ×1
owl ×1
pint ×1
rdf ×1
scala ×1
semantic-web ×1
sql ×1
sql-server ×1
t-sql ×1