如果我在下面创建添加功能

let add x y =
    x + y


然后单独运行下面的行,我会收到一条错误消息,因为默认情况下F#会假定x和y应该为整数。

add 5.4 3.2


就是说,如果我一起运行它们,那么add的工作就很好了,因为它现在将其视为一个具有两个浮点数的函数(这意味着编译器会提前进行类型推断)。

这就引出了一个问题,为什么相同的前瞻过程不允许F#知道toHackerTalk正在接收字符串?即使我一起运行以下各行,由于短语的类型不确定,也会给我一个错误。

let toHackerTalk phrase =
    phrase.Replace('t', '7').Replace('o', '0')

toHackerTalk "this be strange"

最佳答案

我认为这是简单的看法。在第一种情况下,编译器了解+(它是在F#内核中定义的),并且仅选择默认类型的int(可能在规范中的某个地方定义),如果它看到了float用法,则选择其他版本的+

另一方面,编译器没有足够的信息来选择具有Replace成员的类型,因此它无法编译该函数

10-04 12:14
查看更多