代码之家  ›  专栏  ›  技术社区  ›  akaphenom

如何使我的函数成为泛型

  •  1
  • akaphenom  · 技术社区  · 15 年前
        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或其部分应用的助手listintoksonarray或listintoksonabject通用的神奇酱汁。

    谢谢你的帮助。

    3 回复  |  直到 15 年前
        1
  •  6
  •   desco    15 年前

    您的listintoksonarray和listintoksonabject是值,而不是函数,因此您满足了 value restriction 怪物。可以通过添加显式参数将它们转换为函数,也可以转换为类型函数。

    // 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
    
        2
  •  4
  •   Brian    15 年前

    我没有尝试过代码,但一般来说,ETA转换,例如更改

    let myFunVal = partialApplication toSomeArgs
    

    let myFun rest = partialApplication toSomeArgs rest
    

    可能会解决这个问题。

        3
  •  2
  •   Community Mohan Dere    9 年前

    csvList 看起来足够普通: string -> string -> 'a list -> ('a -> string) -> string

    但你遇到了 Value Restriction 在尝试部分应用时 listIntoJsonArray listIntoJsonObject ;需要添加显式参数:

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