f# - 通用计量单位/匹配问题
问题描述
我已经阅读了很多关于度量单位的资源(包括良好的 Microsoft Doc 和 f# 以获取乐趣和利润),但我仍然无法使我的代码正常工作。
[<Measure>] type USD
[<Measure>] type JPY
[<Measure>] type EUR
type FxUnit<[<Measure>] 'u,[<Measure>] 'v> = {UnitRate : float<'u/'v>}
let getFx1 u =
match u with
| "USD" -> {UnitRate = 1.0<USD/USD>}
| "EUR" -> {UnitRate = 1.0<USD/EUR>}
这样我得到一个错误:
1.0<USD/EUR>
我试过这些:
let getFx1 u : (float<'u>) =
let getFx1 u : (float<'u/'v>) =
没有太大的成功。似乎通过匹配,我无法返回具有不同计量单位的某种类型的 FxUnit。
知道如何解决这个问题吗?
谢谢。
解决方案
问题是您正在尝试定义一个函数,该函数接受一个字符串并返回一个FxUnit<USD,USD>
or类型的值FxUnit<USD,EUR>
。一个函数不能有两种不同的返回类型,由运行时决定。
您可以使 FxUnit 采用区分联合的两个值而不是度量:
type Currency =
| USD
| JPY
| EUR
type FxUnit = { UnitRate : float; From : Currency; To : Currency }
let getFx1 u =
match u with
| "USD" -> {UnitRate = 1.0; From = USD; To = USD}
| "EUR" -> {UnitRate = 1.0; From = USD; To = EUR}
| _ -> failwithf "Unrecognised units %s" u
推荐阅读
- user-interface - 使用 backgroundWorker 时 C++ GUI 写入文本框
- oracle - Oracle 表单圆角按钮
- javascript - 使用 vanilla JS 从页面中删除渲染图像?
- android - Kotlin 协程 mvvm 从模型返回值
- php - laravel 为 foreach() 提供的一对多无效参数
- sql - 如何将 2 个条件计数查询组合成一个查询?
- python - 将此元组列表转换为字典
- c# - 如何在有 HttpGetAttribute 的地方添加 HttpHeadAttribute?
- html - 结合 rowspan 和 colspan 的引导程序
- docker - 我怎样才能让我的容器从开始 -> 健康