2010-06-22 70 views
1

我想做一個函數數組,我在List.reduce HOF中使用。 我曾經有一個List.reduce和定義類型之間的類型不匹配

let minimax = [| (min : int->int->int); max |] 

這是偉大的工作,但現在我希望得到一個列表的最大值,所以我想:

let minimax = [|List.min; List.max|] 

然而,這引發以下錯誤:

Minimax.fs(175,5):錯誤FS0030:值限制。值'minimax'已被推斷爲具有通用類型 val minimax:('_a list - >'_a)[]當_a時:比較
將'minimax'定義爲簡單數據項,使其成爲函數明確的參數,或者,如果你不打算它是通用的,添加一個類型註釋。

我添加類型註釋是這樣的:

let minimax = [|(List.min:TreeOfPosition list -> TreeOfPosition); List.max|] 

,它編譯。現在的問題是與List.reduce,

| BranchP(position, children) -> List.reduce (minimax.[minOrmax]) (List.map (loop (1 - minOrmax)) children) 

類型不匹配。期待TreeOfPosition - > TreeOfPosition - > TreeOfPosition但鑑於一個TreeOfPosition列表 - > TreeOfPosition類型 'TreeOfPosition' 不匹配類型 'TreeOfPosition列表'

感謝您的任何提示,

佩德羅Dusso

回答

4

問題是min對兩個值進行操作,但List.min對值列表進行操作,因此您不能僅將一個函數替換爲另一個值。由於List.min基本上定義爲List.reduce min,因此您可以直接刪除List.reduce並直接應用minimax[minormax]。我看不出這會比你的原始解決方案minmax更好,但是...也許你可以提供一些額外的上下文,所以它更清楚你到底想要解決什麼問題。

+0

是的,我錯過了一些情景化,但你的提示(因爲List.min基本上定義爲List.reduce min)工作得很好!謝謝! – 2010-06-23 00:24:09