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

我没有尝试过代码,但一般来说,eta-conversion,例如改变

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

但是您在尝试使用and进行部分应用时遇到了值限制;您需要添加显式参数:listIntoJsonArraylistIntoJsonObject

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