2012-10-17 18 views
1

我有这个问题,我不明白它来自哪里。 代码:上课方法中的不受限制的价值

class applicationFrameworksManager = 
object(this) 
val mutable frameworks = [] 
method add_framework name =()(* if not (List.mem name frameworks) then frameworks <- List.append frameworks [name]; *) 
method get_frameworks = frameworks 

末;;

和错误:

Error: Some type variables are unbound in this type: 
    class applicationFrameworksManager : 
     object 
     val mutable frameworks : 'a list 
     method add_framework : 'b -> unit 
     method get_frameworks : 'a list 
     end 
    The method add_framework has type 'b -> unit where 'b is unbound 

化妆:* [genobjc.cmx]错误2

任何人可以帮助?我可以约束什么?谢谢。我会为这个类添加很多字符串,我只想在最后得到唯一的字符串。

+0

这与类型错误无关(Jeffrey Scofield的答案非常好),但如果您的目标是处理大量的唯一字符串,您可能更喜欢使用一组字符串(http:// caml。 inria.fr/pub/docs/manual-ocaml/libref/Set.html)而不是列表。另外,即使使用列表,'name :: frameworks'比'List.append frameworks [name]'效率更高(在后者中,每次添加新的'name'时,都会遍历'frameworks' ,在前者中你只需在'frameworks'前面添加'name') – Virgile

+0

这也没有什么可以直接看到你的问题,但是如果你是OCaml的初学者,我建议你不要直接跳到对象面向对象的编程风格,你已经知道了。 OCaml是一种完全不同的语言,使用不同的技术更方便。如果你的设置不使用面向对象的设施,你应该尽量避免使用它们,而应该熟悉更多的“功能”设计程序的方式。 – gasche

+0

感谢提示,我可以迭代设置?我需要在某个时候从那里获得它们。我选择管理班级内的所有内容,并且不会在代码中传播所有内容,因为我有更多的方法和操作,比我在这里发布的内容更多。 –

回答

3

[]的类型是多态的,因此其类型'a list包含一个未绑定的类型变量。如果你只是想添加字符串,简单的解决方法是声明类型:

val mutable frameworks : string list = [] 

你现在的类是多态的;即它可以用来管理任何事物的列表。您可以通过显式地为该类指定托管元素类型的类型参数来执行此操作。但这听起来像你不需要那样。

+0

谢谢,我与ocaml只有2周,我不知道为什么作品,但作品。 –

+0

我不知道这是否有帮助,但编译器试图告诉你,它不能让'add_framework'和'get_frameworks'这两个方法具有''a - > unit'和'a'类型。非绑定类型变量''a''意味着你可以传递任何东西,并期望得到任何东西(其他)。所以你可以存储一个'int'并且期望得到一个'string'。类型系统的要点是防止这种事情。所以,你必须指定一个特定的类型,或者将该类型作为该类的一个参数。 –