我应该去睡觉......但是所有需要的是让这个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