具有递归功能和模式匹配的F#类型推断

时间:2018-10-27 20:07:48

标签: f#

我有以下F#代码

let Operation (l:int list) =
    let A,B = l.[0], l.[1]
    if A > B then (-)
    else if A%2=0 && B%2=0 then (*)
    else (-)

let m =
    function
    | [] -> []
    | x::rest -> rest

let rec ops (l:int list) (opList:int->int->int list) =
    let operation = Operation l
    if l.Length = 0 then opList
    else ops (m l) (operation::opList)

编译器在最后一行抱怨

  

该表达式应具有类型       'int-> int-> int list',但是这里有类型       ”列表”

它位于(operation::opList)的基础上,但操作的类型为int -> int -> int,而opList的类型为int->int->int list。我在这里做什么错了?

1 个答案:

答案 0 :(得分:3)

int->int->int list

等同于

int->int->(int list)

这是两个整数的函数,它返回一个整数列表。

你的意思是:

(int->int->int) list

这是两个返回一个int的int的函数的列表。

所以:

let Operation (l:int list) =
    let A,B = l.[0], l.[1]
    if A > B then (-)
    else if A%2=0 && B%2=0 then (*)
    else (-)

let m =
    function
    | [] -> []
    | x::rest -> rest

let rec ops (l:int list) (opList:(int->int->int) list) =
    let operation = Operation l
    if l.Length = 0 then opList
    else ops (m l) (operation::opList)