Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何找到max';在F中的序列、列表或数组中的s索引#_F#_Functional Programming - Fatal编程技术网

F# 如何找到max';在F中的序列、列表或数组中的s索引#

F# 如何找到max';在F中的序列、列表或数组中的s索引#,f#,functional-programming,F#,Functional Programming,Seq.max查找最大值。我想要像Seq.findIndex Seq.maxIndex返回最大元素的索引 为什么不简单地使用 let l=[1;2;5;3];; Seq.findIndex (fun x -> x= Seq.max l) l ;; ? 或者,正如约翰·库尔邦(Johan Kullbom)在评论中所说: "let m = Seq.max l in Seq.findIndex (fun x -> x = m) l" 如果你觉得O(n)更好一点 然而,在我看来,获取索

Seq.max
查找最大值。我想要像
Seq.findIndex

Seq.maxIndex
返回最大元素的索引

为什么不简单地使用

let l=[1;2;5;3];;
Seq.findIndex  (fun x -> x= Seq.max l) l ;;
?

或者,正如约翰·库尔邦(Johan Kullbom)在评论中所说:

"let m = Seq.max l in Seq.findIndex (fun x -> x = m) l"
如果你觉得O(n)更好一点

然而,在我看来,获取索引的需要就像一种强制性的“代码气味”

在FP中,通常最好先使用现有函数,然后再使用自己的函数。 现在,在C程序员看来,这似乎是一个for(I)(for)(j)构造,但我敢打赌,如果你开始考虑FP,你可能真的不需要知道索引

或多或少是一个复制品

附言。 我无法抗拒。 在Haskell(ghc)中,这种方式应该是

let cmpSnd (_, y1) (_, y2) = compare y1  y2

let maxIndex l= fst $ maximumBy cmpSnd $ zip [0..] l
然而,由于F#中的zip似乎不允许列表长度不等的zip(?),因此使用mapi可能是一种可行的方法(F#中的我的haskell版本)

原因只是为了我能列个清单

let l= [[0;199;1];[4;4];[0;0;399]]
用makeIndex l进行测试;; 然后决定我真正想要的是

let cmpSnd' (a,(xs: int list))  = Seq.sum  xs;;
let maxIndex' seq=fst (Seq.maxBy cmpSnd' (zipIndex seq));;
现在是分解站点并使makeIndex成为函数的时候了

let maxIndexF seq maxF=fst (Seq.maxBy maxF (zipIndex seq));;

val l : int list list = [[1; 2; 199]; [3; 3]; [4; 1]; [0; 299]]

> maxIndexF l cmpSnd'
;;
val it : int = 3
> maxIndexF l cmpSnd
;;
val it : int = 2
完成它

let maxIndexF'  maxF=fst << Seq.maxBy maxF << zipIndex ;;

maxIndexF' cmpSnd' l;;
maxIndexF' cmpSnd l;;

让maxIndexF'maxF=fst我相信您正在寻找类似于:

let maxIndex seq = 
    fst (Seq.maxBy snd (Seq.mapi (fun i x -> i, x) seq))
请注意,为该函数指定一个空序列将导致ArgumentException

(或者,以流水线方式编写:

let maxIndex seq =  
    seq
    |> Seq.mapi (fun i x -> i, x)
    |> Seq.maxBy snd 
    |> fst

)

该解决方案将多次遍历序列(最坏情况为n*n次)。“让m=Seq.findIndex(fun x->x=m)l中的m=Seq.max l”将至少只遍历序列两次……是的(这里有对(i代表(j))的引用,但样式(在您的答案中给出)似乎表明您应该使用索引,如果您正在学习FP,而不仅仅是尝试用函数式语言重新编写命令式代码,那么这种感觉是错误的。我知道我可能会深入阅读问题,而不是编译和回答问题。我相信您是对的,因为索引可能一开始就不需要……)
let maxIndex seq =  
    seq
    |> Seq.mapi (fun i x -> i, x)
    |> Seq.maxBy snd 
    |> fst