我有一个作业问题,我是F#的新手,语法令人困惑,我不知道从哪里开始
例如,如果我有一个值递增的元组列表:
let tupleList = [(1,2,3);(10,12,15);(9,10,20)]
我应该编写一个函数,该函数返回具有最大中间值的元组。
因此函数应返回:
(10,12,15)
任何有关我应该考虑什么,在Internet上阅读或进行研究的提示,或任何其他帮助我学习如何做到这一点的提示,我们将不胜感激!
谢谢!
答案 0 :(得分:2)
您可能应该读一本关于F#的书或通过https://fsharpforfunandprofit.com/
您可以使用List.max
或List.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