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