F#代码有什么问题?

时间:2015-10-27 20:54:59

标签: f# f#-interactive f#-3.0

在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#中的列表中获取最后一个元素。但我有兴趣知道上面的代码有什么问题吗?

3 个答案:

答案 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