为什么不能在 F# 中添加 int 和 float 文字?
Why can't you add int and float literals in F#?
在 F# 中,如果您编写 3 + 2.5
,则会出现语法错误。你必须写例如3. + 2.5
让它工作,这在具有许多数字文字的数学密集型领域中会变得烦人。
看到许多其他语言(例如 C#)处理得很好,是否有特殊原因导致 F# 在执行算术运算时不将 int 文字隐式转换为 float(据我所知这是一种无损转换)操作?
F# 是一种函数式第一语言,函数式语言的核心价值之一是能够推理您的代码。这是一种很容易理解您的代码及其作用的奇特方式。现在显式操作意味着您的代码将更容易推理,不相信我吗?
这里是一些 python 代码,它接受一个数字,把它变成一个字符串,然后再变成一个数字,猜猜它是什么 returns:
float(str(0.47000000000000003))
你猜到 0.47000000000000003 了吗?抱歉,实际上是 0.46999999999999997!从 double 到 decimal 到 float 转换时有各种各样的怪异!最好选择一种类型并坚持下去。现在不断地指定类型一开始可能看起来很烦人,但是永远不必担心你的函数使用什么类型的价值,与发送的类型相比......如果库为你选择类型,上帝会帮助你好吧...好吧,我们只是说随着时间的推移您会欣赏这种明确性;)
int
到float
确实是"safe"。然而,正如其他人所提到的,通常类型之间缺乏隐式转换被许多人认为是 F# 的一个很好的特性。
F# 的类型推断比 C# 广泛得多。通过使用推断的类型可以通过大型代码库一路传递。数字类型之间的隐式转换可能会使推理变得复杂,从而使理解类型错误变得更加困难,并增加编译器代码本身的维护负担。事实上,F# 不执行任何 implicit conversions defined in C#.
By eliminating unnecessary casts, implicit conversions can improve source code readability. However, because implicit conversions do not require programmers to explicitly cast from one type to the other, care must be taken to prevent unexpected results.
同样,这降低了便利性,但减少了不正确行为的可能性,这可能在以后或对其他人造成更大的不便。
基本上,这种方法以一些方便换取了另一种方便(不必到处写类型名称)并且增加了一些 safety/explicitness。我个人认为这对 F# 来说是一个很好的权衡。
在 F# 中,如果您编写 3 + 2.5
,则会出现语法错误。你必须写例如3. + 2.5
让它工作,这在具有许多数字文字的数学密集型领域中会变得烦人。
看到许多其他语言(例如 C#)处理得很好,是否有特殊原因导致 F# 在执行算术运算时不将 int 文字隐式转换为 float(据我所知这是一种无损转换)操作?
F# 是一种函数式第一语言,函数式语言的核心价值之一是能够推理您的代码。这是一种很容易理解您的代码及其作用的奇特方式。现在显式操作意味着您的代码将更容易推理,不相信我吗?
这里是一些 python 代码,它接受一个数字,把它变成一个字符串,然后再变成一个数字,猜猜它是什么 returns:
float(str(0.47000000000000003))
你猜到 0.47000000000000003 了吗?抱歉,实际上是 0.46999999999999997!从 double 到 decimal 到 float 转换时有各种各样的怪异!最好选择一种类型并坚持下去。现在不断地指定类型一开始可能看起来很烦人,但是永远不必担心你的函数使用什么类型的价值,与发送的类型相比......如果库为你选择类型,上帝会帮助你好吧...好吧,我们只是说随着时间的推移您会欣赏这种明确性;)
int
到float
确实是"safe"。然而,正如其他人所提到的,通常类型之间缺乏隐式转换被许多人认为是 F# 的一个很好的特性。
F# 的类型推断比 C# 广泛得多。通过使用推断的类型可以通过大型代码库一路传递。数字类型之间的隐式转换可能会使推理变得复杂,从而使理解类型错误变得更加困难,并增加编译器代码本身的维护负担。事实上,F# 不执行任何 implicit conversions defined in C#.
By eliminating unnecessary casts, implicit conversions can improve source code readability. However, because implicit conversions do not require programmers to explicitly cast from one type to the other, care must be taken to prevent unexpected results.
同样,这降低了便利性,但减少了不正确行为的可能性,这可能在以后或对其他人造成更大的不便。
基本上,这种方法以一些方便换取了另一种方便(不必到处写类型名称)并且增加了一些 safety/explicitness。我个人认为这对 F# 来说是一个很好的权衡。