我建立一個函數,給定一個組合列表,返回兩個名單:多類型列表
let rec split2 l =
match l with
[] -> ([], [])
| (x, y)::ls -> let (xs, ys) =
split ls in (x::xs, y::ys);;
val split2 : l:('a * 'b) list -> 'a list * 'b list
lsts = [('a', 1); ('b', 2); ('c', 3); ('d', 4)]
split2 lsts;;
val it : int list * char list = ([1; 2; 3; 4], ['a'; 'b'; 'c'; 'd'])
現在,我申請的概念,更復雜的列表:
let l1 = [('a', 1, 'a'); ('b', 2, 'b'); ('c', 3, 'c'); ('d', 4, 'd')]
功能我使用類型的問題,所以我建立第二個。在這種情況下,我已經仔細地定義了類型,但是即使編譯時它仍然會返回錯誤l1
。
let rec split3 (l:(char * int * char) list) =
match l with
[] -> ([], [], [])
| (x, y, z)::ls ->
let (xs, ys, zs) =
split3 ls in (xs, ys, zs);;
val split3 : l:(char * int * char) list -> 'a list * 'b list * 'c list
split3 l1;;
error FS0030: Value restriction. The value 'it' has been inferred to
have generic type val it : '_a list * '_b list * '_c list
Either define 'it' as a simple data term, make it a function with explicit
arguments or, if you do not intend for it to be generic, add a type annotation.
爲什麼,即使類型聲明,它需要進一步的類型註釋?
是的。這讓我想到了第二個問題:第一個例子中的'two elements'列表和第二個'three elements'列表有什麼不同?它們都是由字符和整數組成的,畢竟。 – Worice
對不起,我的第一個評論是無關緊要的。編譯器不能推斷函數的返回類型。您可以明確指出:'let rec split3(l:(char * int * char)list):(char list * int list * char list)=' – Petr
更多關於值限制錯誤,因爲它有時很難理解:https: //blogs.msdn.microsoft.com/mulambda/2010/05/01/finer-points-of-f-value-restriction/ – Petr