sto cercando questo:Perché i tipi flessibili non sono consentiti nelle definizioni dei tipi di record?
type TS1<'state, 'action> = {
actions : 'state -> #seq<'action>
move : 'state -> 'action -> 'state
state0 : 'state
}
Ma il tipo correttore non mi lascia:
.../stdin(2,29):error FS0715: Anonymous type variables are not permitted in this declaration
Tuttavia, se dispiego la definizione di tipo flessibile, sto bene:
type TS2<'state, 'action, 'actions when 'actions :> seq<'action>> = {
actions : 'state -> 'actions
move : 'state -> 'action -> 'state
state0 : 'state
}
sono insoddisfatto dover aggiungere il tipo 'actions
variabile rende il collegamento ai sistemi di transizione deterministici come oggetti matematici meno evidenti.
Non vedo cosa potrebbe andare storto consentendo tipi flessibili nelle definizioni dei record. È in qualche modo pericoloso? C'è un altro modo in cui potrei ottenere la chiarezza della definizione che vorrei?
Aggiornamento. Speravo di essere in grado di scrivere funzioni sui tipi di TS che sfruttano le implementazioni conosciute; cioè, voglio essere in grado di definire una funzione
let has_action a ts s = Set.contains a <| ts.actions s
Questo ovviamente non digitare se il tipo dell'organo azioni è actions : 'state -> seq<'action>
. Posso farlo con la seconda definizione, nel qual caso has_action
ha tipo
has_action : a:'a -> ts:TS2<'s,'a,Set<'a>> -> s:'s -> bool when 'a : comparison
Il tipo di questo esempio indica che il tipo flessibile in TS1 forse non aiuterebbe. Non c'è modo di evitare il disordinato parametro di terzo tipo in TS2? Mi sembra che l'esatta implementazione della raccolta di azioni per uno stato sia un dettaglio di implementazione che non dovrebbe essere esposto nel tipo.
Compila per me, se si rimuove il '#' da prima il 'seq'. –
@MarkPattison ha un buon punto: è più semplice rimuovere il '#' - perché pensi di averne bisogno? – Carsten
riguardo al tuo aggiornamento IMO il terzo parametro è una parte vitale del tuo record quindi no non penso che dovresti liberartene qui (btw: non devi scriverlo - puoi usare '_' se invece tu Mi piace) - nel caso in cui tu voglia sapere (ma non sarà d'aiuto): l'unico posto dove puoi usare 'forall' quantificazione è su (interfaccia) membri (ho scritto su un problema simile qui: http: // gettingsharper. de/2014/09/29/church-numerals-net-and-working-around-the-value-restriction /) – Carsten