成员函数约束疯狂

时间:2015-05-18 02:19:07

标签: f# type-constraints

我应该去睡觉......但是所有需要的是让这个dang成员约束被接受......

我认为我正确且充分地应用了成员函数约束,但仍然得到:

  

错误FS0072:根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。

我甚至想到我在很多地方应用它......

// ... inside a class type
member public this.ToJSON() =
    let inline arrayToString (arr : ^T [] when ^T : (member ToJSON : unit -> string)) =
        let toString x = x.ToString()
        let len = Array.length arr
        let inline folder (sb : System.Text.StringBuilder,i) (element : ^T when ^T : (member ToJSON : unit -> string)) = 
            sb.Append(element.ToJSON() + if i < len then "," else ""), i+1
//--------------------^^^^^^^^^^^^^^^ complains here!
        arr

        |> Array.fold folder (new System.Text.StringBuilder(),1) 
        |> fst
        |> toString
    let inline arrayToString2 (arr : ^T [][] when ^T : (member ToJSON : unit -> string)) =
        let toString x = x.ToString()   
        let len = Array.length arr           
        arr
        |> Array.fold
            ( fun (sb : System.Text.StringBuilder,i) a ->
                sb.Append("[" + (arrayToString a) + if i < len then "]," else "]"),i+1
            ) (new System.Text.StringBuilder(),1) 
        |> fst
        |> toString
    sprintf 
        """{"SymbolTable":[%s],"ProductionTable":[%s],"ParserTables":[%s],"InitialTable":%d,"InitialState":%d}"""
        (arrayToString this.SymbolTable)
        (arrayToString this.ProductionTable)
        (arrayToString2 this.ParserTables)
        (this.InitialTable)
        (this.InitialState)

谁能告诉我怎么做对了?对于包含在类类型...

中的成员的数组类型,arrayToString应该是通用的

F#3.1顺便说一下。在.NET上(不是单声道或其他东西)。在VS 2013社区。便携式图书馆项目。

先谢谢!

修改

感谢评论部分中的ildjarns提示,正确的加密算法是这样的:

let inline folder (sb : System.Text.StringBuilder,i) (element : ^T when ^T : (member ToJSON : unit -> string)) = 
    sb.Append((^T : (member ToJSON : unit -> string) element) + if i < len then "," else ""), i+1

0 个答案:

没有答案