在定义具有参数的运算符时,我遇到了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的运算符,而不是将逻辑用于计算每个类型转换中的余数。是否有可能实现这一目标,还是应该以不同的方式进行类型转换呢?
答案 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>