【问题标题】:what does this error mean, and how to fix it?这个错误是什么意思,以及如何解决它?
【发布时间】:2017-09-01 18:33:27
【问题描述】:

这是我的代码

let rec Interest a b c =
    if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));;

错误是:

if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));;

-------------^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^

stdin(2,26):错误 FS0001:类型不匹配。期待一个 'a 但给定一个 'a -> int -> 'a 当统一 ''a' 和 ''a -> int -> 'a' 时,结果类型将是无限的 >

【问题讨论】:

标签: f#


【解决方案1】:

您已将Interest 定义为一个接受三个参数的函数,但您传递的参数与该参数不匹配。按照它的编写方式,您只需将一个参数传递给对 Interest 的递归调用 - 带括号的表达式 a ((1.0=a)*b) (c-1)。在这里,a 被推断为两个参数的函数,((1.0=a)*b)(c-1)

长话短说,这会抛出类型推断算法,直到它放弃说它无法掌握要给 Interest 的类型。

你想要的是这个:

let rec Interest a b c =
    if (c=0) then b else Interest a ((1.0=a)*b) (c-1)

(1.0=a) 也会有问题。这将计算为一个布尔值,您稍后要将该值与b 相乘。不确定意图是什么,但您可能正在寻找类似(if 1.0 = a then 1 else 0) 的东西?

与支持“布尔”和整数之间的隐式转换的类 C 语言不同,F# 要求您将所有转换显式化以确保正确性(这也适用于数字类型之间的转换)。

【讨论】:

  • 这不是一个元组。没有逗号。它将a 视为两个参数的函数。
  • 谢谢,所以在 3 个参数周围加上括号会导致问题,但是有没有办法在参数周围加上括号......以冗余地明确 3 个参数正在传入?附:编辑了 (1.0=a) .. 这是一个错字
  • 不,括号改变了这里的意思。您可以以 需要 将括号括在参数周围的方式编写此函数,但这将是一个类型(和使用特征)略有不同的函数。请参阅此处了解 curried 和 uncurried 函数之间的区别:stackoverflow.com/a/32236855/679898(另外,这会使您的问题重复;))
  • 这是有道理的......所以......“Interest a b c”需要3个参数,而“Interest (a b c)”需要1个参数,这是一个元组?
  • 是的,但它是 Interest (a, b, c) - 用逗号分隔元组元素(如之前的评论中所指出的)。
猜你喜欢
  • 1970-01-01
  • 2021-06-25
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多