F#函数类型不匹配

时间:2013-10-09 11:06:50

标签: types f#

我的测试功能出了什么问题?

let divisorOf(d, n) = n % d = 0

let notDivisible(d, n) = not (divisorOf(d, n))

let rec test(a, b, c) = function
  | (a, b, _) when (a > b) -> true
  | (a, b, c) -> notDivisible(a, c) && test(a + 1, b, c)

我遇到编译错误,第7行的表达式有函数类型,而不是bool。

(7,40): error FS0001: This expression was expected to have type
    bool    
but here has type
    'a * 'a * 'b -> bool    

2 个答案:

答案 0 :(得分:5)

当您使用关键字function时,您正在创建一个隐含的lambda。据推断,对此的输入是int*int*int。要解决此问题,只需进行更改

let rec test(a,b,c) =

let rec test =

如果你想明确参数,你也可以把它写成

let rec test(d, e, f) = match (d,e,f) with //change letters to avoid variable hiding
  | (a, b, _) when (a > b) -> true
  | (a, b, c) -> notDivisible(a, c) && test(a + 1, b, c)

答案 1 :(得分:2)

John的回答是完全正确的,但为了其他可能会读到这一点的人,这是你发布的代码的一种惯用形式:

let divisorOf d n = n % d = 0

let notDivisible d n = not <| divisorOf d n
//Could also be let notDivisible d n = not(divisorOf d n)

let rec test =
    function
    | (a, b, _) when (a > b) -> true
    | (a, b, c) -> (notDivisible a c) && test (a + 1, b, c)

我只是懒得指出这一点,因为在divisorOf和notDivisible上你已经为参数声明了一个元组,这是一个常见的问题,那些不习惯写咖喱论据的人开始编写F#。

我只是将此作为答案发布,因为评论时间太长了。