F#从元组列表中返回具有最大中间值的3个元素元组

时间:2019-05-04 22:40:39

标签: list f# tuples

我有一个作业问题,我是F#的新手,语法令人困惑,我不知道从哪里开始

例如,如果我有一个值递增的元组列表:

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]

我应该编写一个函数,该函数返回具有最大中间值的元组。

因此函数应返回:

  

(10,12,15)

任何有关我应该考虑什么,在Internet上阅读或进行研究的提示,或任何其他帮助我学习如何做到这一点的提示,我们将不胜感激!

谢谢!

4 个答案:

答案 0 :(得分:2)

您可能应该读一本关于F#的书或通过https://fsharpforfunandprofit.com/

您可以使用List.maxList.maxBy获取列表中的最大值。因为您有一个三元素元组,所以您需要对其进行解构(因为没有函数可以访问元组的第n个元素,只有第一个或第二个元素可以访问)。一旦暴露了中间值,就可以在其上运行maxby,并摆脱不必要的部分。

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]

tupleList
|> List.map (fun (a,b,c) -> (b, (a,b,c)))
|> List.maxBy fst
|> snd
  

val it:int * int * int =(10,12,15)

答案 1 :(得分:2)

如果无法使用内置函数,则可以使用(1)可变变量和while循环,或者(2)递归。

由于您正在学习函数式编程,因此您的教授很可能会喜欢递归。解决方法如下:

let max2 (a,b,c) (x,y,z) = if b > y then (a,b,c) else (x,y,z)

let maxMany tuples =
    let rec loop currentMaxTuple remainTuples =
        match remainTuples with
        | [] -> currentMaxTuple
        | tuple :: rest ->
            let newMaxTuple = max2 currentMaxTuple tuple
            loop newMaxTuple rest
    match tuples with
    | [] -> None
    | head :: rest -> Some (loop head rest)

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]
maxMany tupleList |> printfn "%A"

答案 2 :(得分:2)

与@Nghia Bui的解决方案稍有不同,您可以使用模式匹配来比较元组项。

let maxSnd tuples = 
    let rec loop list tuple = 
        match list, tuple with
        | [], _ -> tuple
        | (x, y, z) :: xs, (a, b, c) -> 
            if y < b then (a, b, c) else (x, y, z) 
            |> loop xs
    match tuples with
    | [] -> invalidArg "tuples" "Empty list"; 0, 0, 0
    | x :: xs -> loop xs x 

答案 3 :(得分:1)

有点晚了,但无论如何:

let maxByMiddle data =
    let rec find lst =
        match lst with
        | [] -> Error("No entries in list")
        | [a, b, c] -> Ok(a, b, c)
        | (_, bmax, _)::(a, b, c)::tail when b > bmax -> find ((a, b, c)::tail)
        | maxima::_::tail -> find (maxima::tail)


    find data