Sto scrivendo una libreria¹ in F # che fornisce alcune operazioni bit a bit, e voglio assicurarmi quante più funzioni possibili sono inline
lasciare binding con parametri di tipo statico (ciò consente io per scrivere una funzione e usarla per int16
, int32
e forse anche bignum
con poco overhead). A un certo punto questa rotta non funzionerà sicuramente. Alcune delle funzionalità fornite da detta libreria sono alquanto complicate.Utilizzo dei parametri di tipo statico di F # e costanti numeriche di codifica
¹Nota: sono a conoscenza dei problemi relativi all'esposizione di binding inline tramite un'interfaccia pubblica.
Tuttavia, voglio estendere questo nella misura massima possibile. In questo momento, sto cercando di scrivere l'algoritmo population count in questo modulo e sto affrontando un problema. Non sono sicuro di come codificare le maschere, ad es. 0x3333...
, che compaiono in questi algoritmi. Posso aggirare le costanti del turno e simili usando alcuni trucchi extra.
C'è qualche trucco che posso usare, sia tramite l'inferenza di tipo F # e parametri di tipo statico, o tramite bit-twiddling, per scrivere l'algoritmo nel modo che voglio? Esiste un modo per codificare questi tipi di costanti nella funzione statica generica?
Una domanda più vaga: ci sono alcune cose specifiche su cui posso fare affidamento per utilizzare i parametri di tipo statico al loro massimo, specialmente nel contesto dei numeri? Ad esempio, utilizzo intensamente lo GenericOne
e lo GenericZero
. Ci sono più cose come questa, che potrei aver perso?
quanto riguarda le risorse, un trucco utile è quello di definire i numeri generici in modo da poter scrivere cioè '42G '(vedi http://stackoverflow.com/questions/4732672/how-to-write-a-function-for-generic-umbers). Ho anche scritto un articolo con alcune informazioni in più, ma penso che probabilmente non troverai molte novità lì (vedi http://tomasp.net/blog/fsharp-generic-numeric.aspx). –
Usando il letterale numerico generico, puoi scrivere ie 'lasciare inline shift a = (a &&& 8G) <<< 2', ma suppongo che non sia la risposta alla tua domanda (perché potresti farlo con 'GenericOne') . Quindi, hai qualche esempio specifico più complesso in cui l'approccio diretto non funziona per te? –
'0x33 ...' è ''signedtype'.MaxValue/5 * 2 + 1', ti aiuta? – harold