2009-01-06 14 views
3

J'ai lu le blurb au StrangeLights, j'ai lu le passage de Expert F # (page 119), mais je ne vois pas comment ils s'appliquent à mon code:F # erreur de compilation FS0030, problèmes avec la restriction de valeur

Pour mes tests, je veux vérifier l'égalité entre les flotteurs, avec un peu de tolérance. Je convertir tout pour les unités de mesure, mais je veux être en mesure d'être « générique »:

let toleq (e:float<_>) a b = (abs (a - b)) < e 

Je peux ensuite utiliser pour vérifier l'égalité sur les différents « types » de flotteur, ou curry pour faire un personnalisé:

toleqm = toleq 1.0e-10<m> 

Mais je reçois le message suivant:

Type inference has inferred the signature 
    val toleq : float<'u> -> float<'u> -> float<'u> -> bool 
Either define 'toleq' as a simple data term, make it a function, or add a 
    type constraint to instantiate the type parameters. 

Je ne vois pas comment je peux faire plus pour en faire une fonction - Je ne vois pas les paramètres implicites .

Quoi de neuf?

+0

Je ne peux pas reproduire ce message d'erreur sur 1.9.6.2, pouvez-vous montrer le programme minuscule entier qui le génère? – Brian

+0

Il n'y a pas de petit programme, juste essayé en FSI, cette seule ligne me donne l'erreur. – Benjol

+0

Croisement vers une autre question sur le même thème: http://stackoverflow.com/questions/1131456/understanding-f-value-restriction-errors – Benjol

Répondre

2

Eh bien, je foiré un peu et a trouvé la solution, en désespoir de cause, mais je ne suis pas sûr que je comprends pourquoi ...

let toleq (e:float<_>) (a:float<_>) (b:float<_>) = (abs (a - b)) < e 

Ugh, il est presque aussi laid que des déclarations génériques en C# .