Как сделать мою функцию родовой - PullRequest
1 голос
/ 18 ноября 2010
    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.

Спасибо за помощь.

Ответы [ 3 ]

6 голосов
/ 18 ноября 2010

Ваши listIntoJsonArray и listIntoJsonObject являются значениями, а не функциями, поэтому вы встретили ограничение значения monster. Вы можете преобразовать их в функции, добавив явный аргумент, или ввести функции.

// 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
4 голосов
/ 18 ноября 2010

Я не пробовал код, но в целом eta-преобразование, например, изменение

let myFunVal = partialApplication toSomeArgs

на

let myFun rest = partialApplication toSomeArgs rest

, скорее всего это исправит.

2 голосов
/ 18 ноября 2010

csvList выглядит достаточно обобщенно: string -> string -> 'a list -> ('a -> string) -> string

Но вы столкнулись с Ограничением значения при попытке частичного применения с listIntoJsonArray и listIntoJsonObject; вам нужно добавить явные параметры:

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