参数中定义的F#通用单位

时间:2016-03-11 22:53:14

标签: generics f# units-of-measurement .net-4.6

在定义具有参数的运算符时,我遇到了F#测量单位的问题,该参数具有根据另一个参数的通用测量单位定义的通用测量单位。例如:

type Quotient<[<Measure>]'b> =
| Divisible of int64<'b>
| Remaindered of int64<'b> * int64<'b>

let (|/) (x: int64<'a>) (y: int64<'a/'b>) =
    let q = x / y
    if q * y = x then Divisible q else Remaindered (q, x - (q * y))  

此处,y<'a/'b>中定义,其中<'a>x的单位。我希望(|/)的类型为int64<'a> -> int64<'a/'b> -> Quotient<'b>,但编译器告诉我类型为x:int64<'b> -> y:int64 -> Quotient<'b>

我想将此用于无法使用十进制数的类型转换。我的目标是创建用于处理Quotients的运算符,而不是将逻辑用于计算每个类型转换中的余数。是否有可能实现这一目标,还是应该以不同的方式进行类型转换呢?

1 个答案:

答案 0 :(得分:10)

有趣的问题。如果您取出from ftplib import FTP hosts = [('1.2.3.4', 'admin', '12345')] local_file = r'/Users/foo/Downloads/13.pic.jpg' remote_file_base_name_prefix = 'test_' counter = 0 remote_file_base_name_suffix='_13.pic.jpg' for host, name, password in hosts: f = FTP(host, name, password) f.cwd('Input') print remote_file_base_name_prefix+str(counter)+remote_file_base_name_suffix with open(local_file, 'rb') as f_local: f.storbinary('STOR {}'.format(remote_file_base_name_prefix+str(counter)+remote_file_base_name_prefix), f_local) print "{} - done".format(host) f.quit() 并将其替换为'a/'b,则您会看到编译器突然向'b运营商发出警告。

它告诉您减法左侧和右侧的单位必须相同,因此它将约-约束为度量'b。为什么呢?

1的单位为x

'a的单位为q

这告诉您实际上您的商需要两个测量参数。

'b

这是有道理的,因为任何余数都是原始单位。

type Quotient<[<Measure>]'a, [<Measure>]'b> =
    |Divisible of int64<'a>
    |Remaindered of int64<'a> * int64<'b>