2010-05-03 5 views
0

J'essaie d'avoir une liste de fonctions, mais semble être à venir les mains vides. Le code de base est quelque chose comme ceci:F # Liste des fonctions

let doSomething var = 
    var 

let doSomething2 var = 
    var 

let listOfStuff = [doSomething; doSomething2] 

et je reçois l'exception suivante:

Erreur 2 de restriction de valeur. La valeur 'listOfStuff' a été inférée pour avoir type générique val queue: ('_a -> ' _a) liste Soit définir 'queue' comme un simple terme de données, en faire une fonction avec des arguments explicites ou, si vous n'avez pas l'intention d'être générique, ajoutez une annotation type . C: \ FSharp \ SentimentFramework \ TradeSignalProcessor \ Program.fs 16 9 TradeSignalProcessor

J'ai essayé d'ajouter l'attribut [<GeneralizableValue>] mais cela ne fonctionne pas ...

Répondre

3

Vous voulez une liste, composée de fonctions? Je pense qu'il irait comme ceci:

let f x = x + 1 
let g x = x + 1 

let listOfFunc = [f; g] 

Si vous devez spécifier le paramètre, rappelez-vous juste utiliser la notation de type:

let f (x:string) = x + "1" 
+0

exactement. remarquez comment les fonctions sont du même type? – Shaun

+1

L'OP souhaite-t-il utiliser deux types de fonctions différents dans une liste? – Tejs

+0

J'ai ajouté les déclarations de types aux fonctions et tout nettoyé. Je dois avoir une certaine ambiguïté quelque part merci pour votre aide – akaphenom

0

Les listes doivent tous avoir le même type. Essayez d'utiliser un tuple pour cela.

... et essayez de faire comme le suggère l'erreur. Donnez à vos entrées un type à tout le moins.

2

Comme d'autres l'ont noté, indiquant les types explicites à vos fonctions ou à votre liste va résoudre votre problème. La raison pour laquelle cela se produit est que les fonctions peuvent avoir des types génériques, mais (en général) les valeurs ne peuvent pas. Le compilateur a déduit que vos deux fonctions ont le type 'a -> 'a pour tout type 'a. Cela signifie que votre liste aurait le type ('a -> 'a) list, qui est un type générique et n'est pas valide pour une valeur. La spécification d'un type explicite tel que let listOfStuff : (int -> int) list = ... résoudra l'ambiguïté. Cela dit, notez que je ne peux pas reproduire ce problème dans la dernière version du compilateur (F # 2.0.0.0). Il semble que les expressions de liste peuvent être généralisées (probablement parce qu'elles sont sans effet secondaire). Cependant, je vois une erreur analogue quand j'utilise une expression de tableau à la place.