2010-06-22 78 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