gpt4 book ai didi

.net - 获取 f# 中列表的最后一个元素

转载 作者:行者123 更新时间:2023-12-02 18:00:31 25 4
gpt4 key购买 nike

我想获取列表的最后一个元素,我的逻辑是反转列表并获取其头部:

module Program1 = 

let last list =
let newList=List.rev list;
List.head newList;
newList

let mainP1()=
let list= [ 1; 2; 3]
printfn "Ultimul element al listei %A este %A" list (last list )

但它给了我这个错误

Error       Type mismatch. Expecting a
unit list
but given a
int list
The type 'unit' does not match the type 'int'

有人可以帮我吗?

最佳答案

这里有很多东西需要解压。

首先,您的函数没有返回您希望它返回的内容。看到最后一行,即 newList 的那一行吗?这就是你的函数的返回值。函数体的最后一行是它的返回值。所以你返回的是反向列表,而不是最后一个元素。

第二,由于您没有返回 List.head 调用的结果,因此您忽略它。没有对这个结果做任何事情。忽略。 F# 编译器会尝试在此处为您提供帮助:如果您忽略某个值,则意味着您做错了什么,并且如果您这样做,F# 将会提示(发出警告)。

但该规则有一个异常(exception):您可以忽略 unit 类型的值。逻辑是,如果您有一个 unit 类型的值,那么您一定是由于产生了副作用而获得了它。因为如果没有副作用,并且没有结果值(unit 表示“无值”),那么还有什么意义呢?

因此,编译器会这样思考:如果您忽略了某个值,则该值必须是 unit 类型。由于 List.head newList 的类型为 unit,因此 newList 必须为 unit list 类型。因此,list 必须是 unit list 类型。因此,您的函数的类型为 unit list -> unit list (即,它采用 unit list 作为参数,并返回另一个 unit list 作为结果)。

由于您尝试将 int 列表 传递给采用 单元列表 的函数,编译器无法忍受:Expecting a单位列表,但给定一个 int 列表

最后,仅仅为了得到最后一个值而反转列表是非常浪费的!您正在重新分配大量您并不真正需要的内存。实现这一目标的一种不太浪费的方法是使用递归。这样想:单元素列表的最后一个元素是该元素,较长列表的最后一个元素是其尾部的最后一个元素。我们可以直接用 F# 编写:

let rec last list =
match list with
| [x] -> x // The last element of one-element list is the one element
| _::tail -> last tail // The last element of a longer list is the last element of its tail
| _ -> failwith "Empty list" // Otherwise fail

另外,还有一个现成的函数 List.last 您可以直接使用(除非这是家庭作业,在这种情况下您应该在问题中提及)。

let mainP1()=
let list= [ 1; 2; 3]
printfn "Ultimul element al listei %A este %A" list (List.last list)

但请注意,如果列表为空,列表中可能没有最后一个元素。在这种情况下,List.last(以及List.head)将因异常而崩溃,这通常不是一个好主意。如果您需要处理空列表情况,请查看 List.tryLast:

let mainP1()=
let list= [1; 2; 3]
match List.tryLast list with
| Some x -> printfn "Ultimul element al listei %A este %A" list x
| None -> printfn "Lista %A este goală" list

关于.net - 获取 f# 中列表的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com