List 如何使用option从f中的列表中获取第n个元素

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

我是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
        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 |…它生成完全相同的代码。换句话说,函数允许您省略最后一个参数,并隐式匹配它。