gpt4 book ai didi

types - 类型 'float -> float' 与类型 'float' 不匹配

转载 作者:行者123 更新时间:2023-12-04 17:44:06 26 4
gpt4 key购买 nike

刚开始学习 F#,我正在尝试为 e 生成和评估泰勒级数的前 10 项。我最初编写了这段代码来计算它:

let fact n = function
| 0 -> 1
| _ -> [1 .. n] |> List.reduce (*)

let taylor e =
let term n = (e ** n) / (fact n)
[1 .. 10]
|> List.map (term)
|> List.reduce (+)

这会导致错误,因为 **运算符不适用于 int .
显然我需要将所有内容都转换到 float以便一切正常工作。所以:
let fact (n: float) = function
| 0.0 -> 1.0
| _ -> [1.0 .. n] |> List.reduce (*)

let taylor (e: float) =
let term (n: float) = (e ** n) / (fact n)
[1.0 .. 10.0]
|> List.map (term)
|> List.reduce (+)

这会产生编译器错误:
EvaluatingEtotheX.fs(9,39): error FS0001: The type 'float -> float' does not match the type
'float'

EvaluatingEtotheX.fs(9,36): error FS0043: The type 'float -> float' does not match the type
'float'

(第 9 行是 let term n = (e ** n) / (fact n) 所在的位置)。

为什么这不起作用?无论如何,这个错误究竟意味着什么?为什么编译器关心我传递了一个产生 float 的函数而不是真正的 float值(value)?请注意,我刚刚开始学习 F#,所以我不熟悉为什么这在这种情况下不起作用。

最佳答案

您正在混合两种类型的语法来定义 fact功能。

使用 function 时关键字,它隐式添加了一个参数,然后在定义的分支中使用。如果您检查您的签名 fact定义,你会看到float -> float -> float而不是 float -> float .您定义中的第一个浮点数对应于 n ,第二个是由您使用 function 的事实添加的关键词。

您可以使用 function 关键字

let fact = function
| 0.0 -> 1.0
| n -> [1.0 .. n] |> List.reduce (*)

或显式匹配表达式(编译器将能够将 n 的类型推断为 float ,无需手动指定)
let fact n =
match n with
| 0.0 -> 1.0
| _ -> [1.0 .. n] |> List.reduce (*)

附带说明,即使在这种情况下这不会是一个实际问题,但由于它们的二进制表示形式,将浮点数与精确值进行比较通常不是一个好主意。在您的情况下,保留 fact 可能是有意义的。对整数进行运算,然后转换结果:
let term n = (e ** n) / (float (fact (int n))) // assumes fact : int -> int

关于types - 类型 'float -> float' 与类型 'float' 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42287515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com