List.reduce和已定义类型之间的类型不匹配

时间:2010-06-22 21:29:55

标签: list f# type-mismatch

我正在尝试创建一个函数数组,我在List.reduce HOF中使用它。 我以前有一个

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 list'类型不匹配

感谢任何提示,

Pedro Dusso

1 个答案:

答案 0 :(得分:4)

问题是min对两个值进行操作,但List.min对值列表进行操作,因此您不能仅将一个函数替换为另一个函数。由于List.min基本上定义为List.reduce min,因此您可以直接删除List.reduce并应用minimax[minormax]。我无法看到这比使用minmax的原始解决方案更好,但是......也许您可以提供一些额外的背景,以便更准确地说明您正在尝试的问题解决。