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を汎用にするための魔法のソースが見つからないようです。

助けてくれてありがとう。

4

3 に答える 3

6

listIntoJsonArrayとlistIntoJsonObjectは値であり、関数ではないため、値制限のモンスターに遭遇しました。明示的な引数を追加して関数に変換するか、関数を入力することができます。

// 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
于 2010-11-18T16:30:57.333 に答える
4

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

let myFunVal = partialApplication toSomeArgs

let myFun rest = partialApplication toSomeArgs rest

これを修正する可能性があります。

于 2010-11-18T16:36:05.400 に答える
2

csvList十分に一般的に見えます:string -> string -> 'a list -> ('a -> string) -> string

しかし、と;を使用した部分適用の試みで値制限に遭遇しました。明示的なパラメータを追加する必要があります。listIntoJsonArraylistIntoJsonObject

let listIntoJsonArray lst memF = csvList "[" "]" lst memF
let listIntoJsonObject lst memF = csvList "{" "}" lst memF
于 2010-11-18T16:34:56.683 に答える