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 

私はcsvListまたは部分的に適用されるヘルパーlistIntoJsonArrayまたはlistIntoJsonObject genericを作るための魔法のソースを見つけることができないようです。私の関数を汎用化する方法

ありがとうございました。

答えて

6

あなたのlistIntoJsonArrayとlistIntoJsonObjectは関数ではない値なので、value restrictionというモンスターと会ったことがあります。明示的な引数を追加するか、関数を入力することによって関数に変換することができます。

// 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は十分にジェネリックになりますstring -> string -> 'a list -> ('a -> string) -> string

しかし、あなたはlistIntoJsonArraylistIntoJsonObjectで部分アプリケーションであなたの試みでValue Restrictionが発生しました。明示的なパラメータを追加する必要があります。

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

トリックをしていないようです。私はちょうど私が言語をしっかりと保持しているように感じるとき、それは別の回りを取る。価値の制限をもっと研究する必要があります... Thx。 – akaphenom

+0

@akaphenom:私のオリジナルのソリューションは間違いがありました(私は関数定義にパラメータを追加しましたが、その後csvListに引数として渡しませんでした)、正しく動作するはずです。 F#は野生の獣ですが、それはあまりにもエキサイティングな熟練をもたらし、報酬はそれほど大きくなります:) –

4

私は、例えば、コードが、一般的に、ETA-変換を試していません

let myFun rest = partialApplication toSomeArgs rest 

let myFunVal = partialApplication toSomeArgs 

を変更すると、この問題を修正する可能性があります。

関連する問題