我正在嘗試創建一個函式,該函式回傳每個子串列的第一個元素的串列,包括作為 [] 回傳的空串列。
let firstCol (lst: 'a list list) =
List.map List.head lst
只要沒有空串列,這就會起作用,但是當我的輸入包含空串列時,我收到以下錯誤訊息:
System.ArgumentException: The input list was empty.
我該怎么做?提前致謝。
uj5u.com熱心網友回復:
您可以使用List.tryHead或撰寫自己的函式,或者使用List.fold/ 之類的助手List.foldBack。
如果你這樣做,List.tryHead你會得到一個選項,要么是Some元素,要么None是串列為空。所以你必須考慮在這種None情況下會發生什么。您不能為子串列回傳空串列,因為串列必須具有相同的型別。但是您可以例如跳過空串列。或者只是保留選項。因為它表明串列何時為空。
let xs = [[1;2;3];[];[4;5;6];[];[7;8;9]]
printfn "%A" (List.map List.tryHead xs)
回來
[Some 1; None; Some 4; None; Some 7]
你可以跳過空的子串列
printfn "%A" (List.choose id (List.map List.tryHead xs))
所以你得到
[1;4;7]
或自己做,與 List.foldBack
let firstCol xs =
let folder xs acc =
match List.tryHead xs with
| Some x -> x :: acc
| None -> acc
List.foldBack folder xs []
或者更基本的
let rec firstCol xs =
match xs with
| [] -> []
| []::xss -> firstCol xss
| (x::xs)::xss -> x :: firstCol (xss)
最后一個版本不是尾遞回的,但無論如何,您應該嘗試和訓練以理解這樣的遞回定義。并且能夠自己將這樣的函式變成尾遞回。
uj5u.com熱心網友回復:
使用您當前擁有的簽名無法完成您的要求。考慮這個輸入:
[
[1; 2]
[]
[3; 4]
]
看起來您要求以下輸出:
[
1
[]
3
]
但是,這不是 F# 中的合法串列,因為它的元素沒有相同的型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329331.html
上一篇:將陣列中元素的值乘以2
