在F#中,我试图获取给定列表的最后一个元素。我在下面写了代码
let rec findLast t =
match t with
| hd :: [] -> hd
| hd :: tl -> findLast tl
| _ -> -1
printfn "%A" (findLast [1,2,3,4,5])
但是当我试图在F#Interactive中执行它时,它抱怨如下
错误FS0001:此表达式应具有类型 int但这里有类型 'a *'b *'c *'d *'e
我只是想知道上面的代码有什么问题。我知道有很多聪明而优雅的方法可以从F#中的列表中获取最后一个元素。但我有兴趣知道上面的代码有什么问题吗?
答案 0 :(得分:2)
1,2,3,4,5
是一个元组。 'a * 'b * 'c * 'd * 'e
是一个元组定义。使用分号[1;2;3;4;5]
创建列表。 [1,2,3,4,5]
是一个元组列表,其中一个项目是五元组。
let rec findLast t =
match t with
| hd :: [] -> hd
| hd :: tl -> findLast tl
| _ -> -1
printfn "%A" (findLast [1;2;3;4;5])
答案 1 :(得分:1)
试试这个:
let rec lastElem = function
| [] -> None
| [x] -> Some x
| x::xs -> lastElem xs
您可以在REPL中尝试:
> lastElem [1;2;3];;
val it : int option = Some 3
> lastElem ["a";"b";"c"];;
val it : string option = Some "c"
答案 2 :(得分:1)
正如@ Phillip-Scott-Givens指出的那样,你可能已经完全普遍(特别是对于C#' ers),错误并使用逗号分隔列表而不是分号。
这导致元组列表[(1,2,3,4,5)]而不是整数列表[1; 2; 3; 4; 5]。在类型定义中获得意外的星号就是这样的症状:)
也就是说,这里有几个不同的函数可以从你的元组,列表和元组列表中获取最后一个值(参考:https://stackoverflow.com/a/1175123/5470873):
// Data:
let tuples = [ (1,2,3,4,5); ] // = [1,2,3,4,5]
let firstListElement = tuples.[0]
// Access:
let rec lastItemInList = function
| hd :: [] -> hd
| hd :: tl -> lastItemInList tl
| _ -> failwith "Empty list."
let lastValueOfFirstItem = function
| (_, _, _, _, last) :: _ -> last
| _ -> -1
let lastValueOfTuple = function _, _, _, _, last -> last
// same as: let lastValueOfTuple myTuple =
// match myTuple with
// | (_, _, _, _, last) -> last
// Examples:
tuples |> lastItemInList // val it : int * int * int * int * int = (1, 2, 3, 4, 5)
tuples |> lastValueOfFirstItem // val it : int = 5
tuples |> List.map lastValueOfTuple // val it : int list = [5]
firstListElement |> lastValueOfTuple // val it : int = 5