Ich versuche, eine getippte Version von React als Übung in Ocaml zu machen. Um es funktionaler zu machen, gebe ich einen Datensatz als Argument zum Rendern.Ocaml falscher Typ Inferenz
type ('props,'state) reactInstance =
{
props: 'props;
state: 'state;
updater: 'a . ('props,'state) reactInstance -> 'a -> 'state -> unit;}
and ('props,'state) reactClass =
{
getInitialState: unit -> 'state;
render: ('props,'state) reactInstance -> element;}
module type ComponentBluePrint =
sig
type props
type state
val getInitialState : unit -> state
val render : (props,state) reactInstance -> element
end
module type ReactClass =
sig
type props
type state
val mkUpdater :
props ->
((props,state) reactInstance -> 'e -> state) ->
(props,state) reactInstance -> 'e -> unit
val reactClass : (props,state) reactClass
end
module CreateComponent(M:ComponentBluePrint) =
(struct
include M
let rec mkUpdater props f i e =
let nextState = f i e in
let newInstance =
{ props; state = nextState; updater = (mkUpdater props) } in
()
let reactClass =
{ render = M.render; getInitialState = M.getInitialState }
end : (ReactClass with type props = M.props and type state = M.state))
Eine Sache, die ich nicht verstehe ist, warum der Compiler kann nicht die Art von updater = (mkUpdater props)
in let newInstance = { props; state = nextState; updater = (mkUpdater props) }
schließen.
Error: Signature mismatch:
Values do not match:
let mkUpdater :
props =>
(reactInstance props state => '_a => '_b) =>
reactInstance props state => '_a => unit
is not included in
let mkUpdater :
props =>
(reactInstance props state => 'e => state) =>
reactInstance props state => 'e => unit
Was ist der Unterschied zwischen '_a und' e? Es sieht genau dasselbe für mich. Wie kann ich diesen Typ prüfen?
Der Fehler, den Sie angegeben haben, ist nicht der Fehler, den Ihre Datei erzeugt. Der richtige Fehler ist "Fehler: Dieser Ausdruck hat Typ ('a ->' b -> 'c) ->' a -> 'b ->' d aber ein Ausdruck wurde vom Typ erwartet ('e,' c) reactInstance -> 'f ->' c -> Einheit Typ 'a ->' b -> 'c ist nicht kompatibel mit dem Typ (' e, 'c) reactInstance " – Drup
Es gibt mehrere Dinge, die aussehen wie Fehler in die Datei, aber es ist schwer, sie zu lösen, ohne zu wissen, was die angebliche Semantik Ihrer Operationen ist. Die erste Sache, die zu mir springt, ist das "a." Im Updaterfeld, bist du sicher, dass du ein forall hier benutzen möchtest? Es scheint nicht sehr nützlich zu sein. – Drup