我必须创建一个将数字列表拆分为两个列表的函数:
[Int(17);Float(18.9);Int(777);Float(15.5)]
-> [Int(17);Int(777)] , [Float(18.9);Float(15.5)]
type number =
| Int of int
| Float of float
;;
let rec split_number_list: number list -> number list * number list = function lis ->
match lis with
|[] -> li,fi
|(Int n)::l -> ((Int n)::li,fi)
|(Float n)::l -> (li,(Float n)::fi)
我有两个问题。首先,
li
出现“未绑定值”,然后我尝试创建两个名为 li
和 fi
的空列表,但这没有用。其次我不知道如何在函数中调用split_number_list
。
当你写
|[] -> li,fi
或 |(Int n)::l -> ((Int n)::li,fi)
时,编译器会感到惊讶,因为你告诉它“return li,fi”,即使你从未告诉它这个“li,fi”是什么。此时没有名为“li,fi”的变量,因此编写函数应返回该变量是没有意义的。
所以你需要以某种方式定义
li,fi
。您可以使用 let ... in ...
构造来做到这一点:
type number =
| Int of int
| Float of float
;;
let rec split_number_list: number list -> number list * number list =
function
|[] -> ...
|(Int n)::l -> let li,fi = ... in ...
|(Float n)::l -> let li,fi = ... in ...