【发布时间】:2021-08-23 11:12:46
【问题描述】:
type Googol = {
number : float
power : float
result : float
}
let generatePowers (n:float) : list<Googol> =
let rec powerInner (n:float) (p:float) (acc : list<Googol>) =
match n with
| p when p <= 1.0 -> acc
| p when p > 1.0 -> powerInner n (p-1.0) ([{ number=n; power=p; result=n**p}]@acc)
let rec numberInner (n:float) (acc : list<Googol>) =
match n with
| n when n <=1.0 -> acc
| n when n >1.0 -> numberInner (n-1.0) ((powerInner n [])@acc)
numberInner n []
ProjectEuler.fsx(311,50): error FS0001: This expression was expected to have type
'Googol list'
but here has type
'Googol list -> Googol list'
我正在尝试解决这个问题-> https://projecteuler.net/problem=56 |但为此我需要生成低于 n [{ number=n; power=p; result=n**p}]@acc
这些列表我得到了上面的错误。请解释为什么错误说'Googol list -> Googol list' 在函数中,是我将函数作为参数插入函数还是在连接后插入实际列表。 @ 是函数吗?
【问题讨论】:
-
我只看了几秒钟,但注意到对 powerInner 的第二次调用得到了两个参数,而不是三个。应该是这样吗?
-
是的,@ 连接两个列表。您第一次使用@ 是不必要的,因为您可以简单地使用
{ number=n; power=p; result=n**p} :: acc,这是一个计算效率更高的运算符。它在 F# 列表的前面添加一个元素。 -
Bent Tranberg - 谢谢,不应该,无论如何
ProjectEuler.fsx(385,28): error FS0003: This value is not a function and cannot be applied. -
并切换到 ::