我的程序有一些具有相同字段名称的记录类型(每种记录类型意味着不同的内容)。编译器坚持认为与此记录形状匹配的函数参数必须是最后声明的类型,即使我声明具有明确字段名称的记录实例,并且始终将一致的类型传递到每个函数中。
处理这个问题的适当方法是什么?我知道我可以在函数上添加类型注释,但我觉得如果我以正确的方式做事,我不需要用类型注释来对抗编译器。
演示问题的最小代码:
type type1 = {x:int}
type type2 = {x:int}
let getX t =
t.x
getX {type1.x=1}
|> ignore
编译器输出:
$ fsharpc --nologo test.fs
/tmp/typetest/test.fs(7,6): error FS0001: This expression was expected to have type
type2
but here has type
type1
有几种方法可以解决这个问题:
-
按照您的建议键入注释:
let getX (t : type1) =
t.x
-
Define getX
在定义冲突类型之前:
type type1 = {x:int}
let getX t =
t.x
type type2 = {x:int}
-
调用函数时不要显式指定类型:
getX {x=1}
这些选项中哪一个是“正确”的方式很大程度上取决于具体情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)