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.
Спасибо за помощь.
Ваши 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
Я не пробовал код, но в целом eta-преобразование, например, изменение
let myFunVal = partialApplication toSomeArgs
на
let myFun rest = partialApplication toSomeArgs rest
, скорее всего это исправит.
csvList выглядит достаточно обобщенно: string -> string -> 'a list -> ('a -> string) -> string
csvList
string -> string -> 'a list -> ('a -> string) -> string
Но вы столкнулись с Ограничением значения при попытке частичного применения с listIntoJsonArray и listIntoJsonObject; вам нужно добавить явные параметры:
listIntoJsonArray
listIntoJsonObject
let listIntoJsonArray lst memF = csvList "[" "]" lst memF let listIntoJsonObject lst memF = csvList "{" "}" lst memF