Ocaml 如何从另一个 class 调用一个 class 中的方法
Ocaml how to call a method in one class from another class
我在 objects 和 class 方面遇到了一些麻烦。我正在尝试调用 class 家庭中的 class 孩子的方法,以便随时在家庭中添加一个孩子,但我收到一个我不太明白的错误。
class virtual person name lastName sex =
object
val name = (name:string)
val mutable lastName = (lastName:string)
val sex = (sex:char)
end;;
class man name lastName=
object
inherit person name lastName 'm'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class woman name lastName =
object
inherit person name lastName 'w'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class child name sex=
object
inherit person name "" 'm'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class family familyName man woman=
object
val man = man
val woman = woman
val mutable kids = ([] :string list)
initializer woman#changeLastName (man#printLastName)
method addKid kid = kids <- (kid#printLastName)::kids
method printFamily = (man#printNameAndLastNAme ^ ", " ^ woman#printNameAndLastName)
end;;
Error: Some type variables are unbound in this type:
class family :
'a ->
(< printLastName : 'c; printNameAndLastNAme : string; .. > as 'b) ->
(< changeLastName : 'c -> unit; printNameAndLastName : string;
.. >
as 'd) ->
object
val mutable kids : string list
val man : 'b
val woman : 'd
method addKid : < printLastName : string; .. > -> unit
method printFamily : string
end
The method addKid has type
(< printLastName : string; .. > as 'e) -> unit
where 'e is unbound
添加方法addKid时出现错误。还有最后一个方法 printFamily,我想在男人和女人的名字后面添加孩子的名字列表,让它看起来像这样:
- (字符串 * 字符串) * 字符串列表 = (("man", "woman"), ["kid1" ;
"kid2"]).
我一直在试验这个,但我无法将字符串与列表合并,得到预期的错误 (string*string)*string。
感谢您的宝贵时间:)
class 中所有值的类型都应与其定义绑定。例如:
# class ident x = object
method x = x
end;;
Characters 6-11:
class ident x = object
^^^^^
Error: Some type variables are unbound in this type:
class ident : 'a -> object method x : 'a end
The method x has type 'a where 'a is unbound
这意味着,您需要将其绑定到具体类型:
class ident x = object
method x : int = x
end;;
class ident : int -> object method x : int end
或者使您的 class 多态并将值绑定到新引入的类型变量:
# class ['a] ident x = object
method x : 'a = x
end;;
class ['a] ident : 'a -> object method x : 'a end
在您的情况下,man
、woman
和 kid
未绑定。因为,每次定义 class 时都会创建同名类型,您可以将它们绑定到 man
、woman
和 child
(并修复方法中的拼写错误)
class family familyName man woman =
object
val man : man = man
val woman : woman = woman
val mutable kids = ([] :string list)
initializer woman#changeLastName (man#printLastName)
method addKid (kid : child) = kids <- (kid#printLastName)::kids
method printFamily = (man#printNameAndLastName ^ ", " ^ woman#printNameAndLastName)
end;;
我在 objects 和 class 方面遇到了一些麻烦。我正在尝试调用 class 家庭中的 class 孩子的方法,以便随时在家庭中添加一个孩子,但我收到一个我不太明白的错误。
class virtual person name lastName sex =
object
val name = (name:string)
val mutable lastName = (lastName:string)
val sex = (sex:char)
end;;
class man name lastName=
object
inherit person name lastName 'm'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class woman name lastName =
object
inherit person name lastName 'w'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class child name sex=
object
inherit person name "" 'm'
method printNameAndLastName = (name ^ " " ^ lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class family familyName man woman=
object
val man = man
val woman = woman
val mutable kids = ([] :string list)
initializer woman#changeLastName (man#printLastName)
method addKid kid = kids <- (kid#printLastName)::kids
method printFamily = (man#printNameAndLastNAme ^ ", " ^ woman#printNameAndLastName)
end;;
Error: Some type variables are unbound in this type:
class family :
'a ->
(< printLastName : 'c; printNameAndLastNAme : string; .. > as 'b) ->
(< changeLastName : 'c -> unit; printNameAndLastName : string;
.. >
as 'd) ->
object
val mutable kids : string list
val man : 'b
val woman : 'd
method addKid : < printLastName : string; .. > -> unit
method printFamily : string
end
The method addKid has type
(< printLastName : string; .. > as 'e) -> unit
where 'e is unbound
添加方法addKid时出现错误。还有最后一个方法 printFamily,我想在男人和女人的名字后面添加孩子的名字列表,让它看起来像这样:
- (字符串 * 字符串) * 字符串列表 = (("man", "woman"), ["kid1" ; "kid2"]).
我一直在试验这个,但我无法将字符串与列表合并,得到预期的错误 (string*string)*string。
感谢您的宝贵时间:)
class 中所有值的类型都应与其定义绑定。例如:
# class ident x = object
method x = x
end;;
Characters 6-11:
class ident x = object
^^^^^
Error: Some type variables are unbound in this type:
class ident : 'a -> object method x : 'a end
The method x has type 'a where 'a is unbound
这意味着,您需要将其绑定到具体类型:
class ident x = object
method x : int = x
end;;
class ident : int -> object method x : int end
或者使您的 class 多态并将值绑定到新引入的类型变量:
# class ['a] ident x = object
method x : 'a = x
end;;
class ['a] ident : 'a -> object method x : 'a end
在您的情况下,man
、woman
和 kid
未绑定。因为,每次定义 class 时都会创建同名类型,您可以将它们绑定到 man
、woman
和 child
(并修复方法中的拼写错误)
class family familyName man woman =
object
val man : man = man
val woman : woman = woman
val mutable kids = ([] :string list)
initializer woman#changeLastName (man#printLastName)
method addKid (kid : child) = kids <- (kid#printLastName)::kids
method printFamily = (man#printNameAndLastName ^ ", " ^ woman#printNameAndLastName)
end;;