list.reduceと定義型の間のタイプ間マスッチ
-
29-09-2019 - |
質問
list.reduce hof内で使用している関数配列を作成しようとしています。以前はありました
let minimax = [| (min : int->int->int); max |]
うまく機能していましたが、今ではリストの最大値を取得したいので、私は考えました:
let minimax = [|List.min; List.max|]
ただし、これは次のエラーをスローします。
Minimax.fs(175,5):エラーFS0030:値制限。値「ミニマックス」は、汎用型val minimax:( '_a list->' _a)[] when '_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リスト」と一致しません。
ヒントをありがとう、
ペドロデュッソ
解決
問題はそれです min
2つの値で動作しますが List.min
値のリストを操作するため、1つの関数を他の関数に置き換えることはできません。以来 List.min
基本的にとして定義されています List.reduce min
, 、おそらくそれを取り除くことができます List.reduce
適用します minimax[minormax]
直接。それがあなたの元のソリューションよりもどのように優れているかわかりません min
と max
, 、しかし...おそらくあなたはいくつかの追加のコンテキストを提供できるので、あなたが解決しようとしている問題を正確に明確にすることができます。