为什么不能在F#中添加int和float文字?

时间:2017-08-16 09:55:10

标签: casting f# literals

在F#中,如果您编写<configuration> <!-- Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380 --> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /> </environmentVariables> </aspNetCore> </system.webServer> </configuration> ,则会出现语法错误。你必须写,例如3 + 2.5使其有效,在数学繁重的域中会产生很多数字文字。

看到尽可能多的其他语言(例如C#)处理这个问题就好了,在执行算术运算时,有没有特别的原因导致F#没有隐式地将int文字转换为float(这是我所知道的无损转换)?

2 个答案:

答案 0 :(得分:6)

intfloat是&#34;安全&#34;是的。然而,正如其他人所提到的,一般来说,类型之间缺乏隐式转换被认为是F#的一个很好的特征。

F#比C#具有更广泛的类型推断。使用推断的类型可以通过大型代码库传递。数值类型之间的隐式转换可能会使推理变得复杂,这会使得更难理解类型错误并增加编译器代码本身的维护负担。事实上,F#并不执行任何implicit conversions defined in C#

  

通过消除不必要的强制转换,隐式转换可以提高源代码的可读性。但是,由于隐式转换不需要程序员从一种类型明确地转换为另一种类型,因此必须采取注意以防止意外结果

同样,这会降低便利性,但会减少不正确行为的可能性,这可能会在以后或其他人身上造成更大的不便。

基本上,这种方法为了另一种便利(不必在任何地方写入类型名称)以及一些增加的安全性/显性性来换取一些便利。我个人认为这对F#来说是一个很好的权衡。

答案 1 :(得分:2)

F#是一种功能性的第一语言,功能语言的核心价值之一是能够推理您的代码。这是一种花哨的说法,很容易理解你的代码和它在做什么。现在明确的操作意味着你的代码会更容易推理,不相信我吗?

这是一些python代码,它接受一个数字,将其转换为字符串,然后返回一个数字,猜测它返回的内容:

float(str(0.47000000000000003))
你猜的是0.47000000000000003吗?对不起,实际上是0.46999999999999997!当从double转换为decimal到float时,有各种各样的怪异!最好选择一种类型并坚持下去。现在不断指定类型可能一开始看起来很烦人,但是永远不必担心你的函数正在使用什么类型的值,而不是发送的类型...如果库为你选择类型,上帝会帮助你好吧......好吧,我们只是说随着时间的推移,你会欣赏这种明确性;)