2010-11-18 9 views
1
let csvList startDelim endDelim lst memF = 
     let listIter (listStr: string) item = 
      if listStr.Length > 0 then 
       listStr + "," + (memF item) 
      else 
       memF item     
     startDelim + (List.fold listIter "" lst) + endDelim 

    let listIntoJsonArray = csvList "[" "]" 
    let listIntoJsonObject = csvList "{" "}" 

    let intConverter (item:int) : string = 
     item.ToString() 

    let objectConverter (item:SomeObject) : string = 
     item.value.ToString() 

    let objects = [{vaue: 12.3}; {vaule: 33.2}] 
    let ints = [1;2;4] 

    let o = listIntoJsonObject objects objectConverter 
    let i = listIntoJsonObject ints intConverter 

Je n'arrive pas à trouver la sauce magique pour rendre la liste csvList ou ses assistants partiellement appliqués listIntoJsonArray ou listIntoJsonObject génériques.Comment rendre ma fonction générique

Merci pour l'aide.

Répondre

6

Votre listIntoJsonArray et listIntoJsonObject sont des valeurs, pas des fonctions, donc vous avez rencontré value restriction monster. Vous pouvez les convertir en fonctions en ajoutant un argument explicite ou en tapant des fonctions.

// function case 

let csvList startDelim endDelim lst memF = 
    let listIter (listStr: string) item = 
     if listStr.Length > 0 then 
      listStr + "," + (memF item) 
     else 
      memF item     
    startDelim + (List.fold listIter "" lst) + endDelim 

let listIntoJsonObject x = csvList "{" "}" x 

let ints = [1;2;4] 

let i = listIntoJsonObject [1;2;4] string 
let y = listIntoJsonObject ["123"] id 


// type function case 

let csvList<'T> startDelim endDelim (lst : 'T list) memF = 
    let listIter (listStr: string) item = 
     if listStr.Length > 0 then 
      listStr + "," + (memF item) 
     else 
      memF item     
    startDelim + (List.fold listIter "" lst) + endDelim 

[<GeneralizableValue>] 
let listIntoJsonObject<'T> = csvList<'T> "{" "}" 

let ints = [1;2;4] 

let i = listIntoJsonObject [1;2;4] string 
let y = listIntoJsonObject ["123"] id 
2

csvList semble assez générique: string -> string -> 'a list -> ('a -> string) -> string

Mais vous avez rencontré Value Restriction dans votre tentative d'application partielle avec listIntoJsonArray et listIntoJsonObject; vous devez ajouter des paramètres explicites:

let listIntoJsonArray lst memF = csvList "[" "]" lst memF 
let listIntoJsonObject lst memF = csvList "{" "}" lst memF 
+0

N'a pas semblé faire l'affaire. Juste au moment où je sens que je tiens fermement la langue, cela prend un autre tour. Auront besoin de rechercher les restrictions de valeur plus ... Thx. – akaphenom

+0

@akaphenom: ma solution originale a fait une erreur (j'ai ajouté les paramètres à la définition de la fonction, mais je ne les ai pas passés comme arguments à csvList), cela devrait fonctionner correctement maintenant. F # est une bête sauvage, mais cela rend la domestication tellement plus excitante, et les récompenses tellement plus grandes :) –

4

Je n'ai pas essayé le code, mais en général, eta-conversion, par ex. changer

let myFunVal = partialApplication toSomeArgs 

à

let myFun rest = partialApplication toSomeArgs rest 

est susceptible de résoudre ce problème.