aka*_*nom 1 generics f# value-restriction
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
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到使csvList或其部分应用的helpers listIntoJsonArray或listIntoJsonObject泛型的神奇酱油.
谢谢您的帮助.
你的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
Run Code Online (Sandbox Code Playgroud)