La méthode concat pose problème parce que c'est une méthode binaire. En fait, c'est une pseudo méthode binaire. En effet, si on naturellement:
class ostring s = object (self)
  val s = s
  method repr = s
  method concat t = {< s = s ^ t # repr >}
end;;
alors l'argument t n'est pas nécessairement du type de self, mais doit seulement posséder une méthode repr du bon type. Cela rend la class paramétrique (d'où le message d'erreur). Une solution est donc:
class ['a] ostring s = object (self)
  val s = s
  method repr = s
  method concat (t:'a) = {< s = s ^ t # repr >}
end;;
Une autre solution, sans doute meilleurs en pratique, et de contraindre le type 'a de t a être le même que le type de self (la classe n'est plus paramétrique)
class ostring s = object (self : 'a)
  val s = s
  method repr = s
  method concat (t:'a) = {< s = s ^ t # repr >}
end;;
Attention! on pourrait aussi contraindre t à être du type de la classe string
class ostring s = object (self : 'a)
  val s = s
  method repr = s
  method concat (t : ostring) = {< s = s ^ t # repr >}
end;;
Cette solution n'est pas bonne car dans une sous-classe enrichie ostring_plus, la méthode concat ne se comportera pas comme attendu: elle prendra et un argument du type ostring et non pas du type ostring_plus.