List 如何使用option从f中的列表中获取第n个元素
我是f的新手,我正在尝试做以下练习: 实现一项功能List 如何使用option从f中的列表中获取第n个元素,list,functional-programming,f#,List,Functional Programming,F#,我是f的新手,我正在尝试做以下练习: 实现一项功能 let rec nth(n : int) (l : List<'a>) : Option<'a> = 返回l中n位置的元素。该函数必须适当处理索引无效的情况 这是我当前的代码,但我有点卡住了: let rec nth (n : int) (l : List<'a>) : Option<'a> = if n > l.Length then None else
let rec nth(n : int) (l : List<'a>) : Option<'a> =
返回l中n位置的元素。该函数必须适当处理索引无效的情况
这是我当前的代码,但我有点卡住了:
let rec nth (n : int) (l : List<'a>) : Option<'a> =
if n > l.Length then
None
else
match l with
| [] -> None
谢谢你的帮助 您是否可以使用核心库提供的任何功能?如果是,我建议使用以下功能:
let nth (n : int) (l : 'a list) : 'a option =
if n < 1 || n > l.Length then None else Some l.[n - 1]
let nth (n : int) (l : 'a list) : 'a option =
let rec inner i = function
| [] -> None
| x :: _ when i = 0 -> Some x
| _ :: xs -> inner (i - 1) xs
if n < 1 then None else inner (n - 1) l
这只是检查索引是否在允许的边界内,然后返回相应索引处的元素。索引项操作符是基于零的,因此我们需要从传递到函数中的数字中减去一,列表迭代由编译器在幕后完成
如果需要完全手动操作,我建议使用以下功能:
let nth (n : int) (l : 'a list) : 'a option =
if n < 1 || n > l.Length then None else Some l.[n - 1]
let nth (n : int) (l : 'a list) : 'a option =
let rec inner i = function
| [] -> None
| x :: _ when i = 0 -> Some x
| _ :: xs -> inner (i - 1) xs
if n < 1 then None else inner (n - 1) l
这将检查下边界,如果没有问题,则开始使用内部函数迭代列表,并递减索引,直到它为零,以便知道它到达了正确的索引。如果列表较短,则不返回任何值。有一个内置函数list.tryItem 让我们记录:int l:列表= l |>List.tryItem n
我也是一个初学者,但是你不能在else路径中使用一些l.[index]吗?是的,tryItem肯定是最简单的解决方案欢迎使用SO,Esté。不幸的是,我应该在不使用f内置函数的情况下构建自己的函数ttp已经有一个核心函数List.tryItem可以实现这一点。顺便说一句,你可能想要这个以零为基础的函数,因为F中的所有其他函数通常都是这样。它似乎可以工作,谢谢!尽管我认为我应该用模式匹配来完成,即使在练习中没有指定。:'使用match l with可以如下重写内部函数:让rec internal i l=match l with |…它生成完全相同的代码。换句话说,函数允许您省略最后一个参数,并隐式匹配它。