1
我已经定义了F#树和堆栈类型,堆栈上有一个弹出成员。流行音乐的结果我无法得到类型签名。这里是我的代码,直到我尝试使用弹出:返回中等复杂度的难度F#类型签名
type Tree<'a> =
| Tree of 'a * 'a Tree * Tree<'a>
| Node of 'a
| None
type 'a Stack =
| EmptyStack
| Stack of 'a * 'a Stack
member x.pop = function
| EmptyStack -> failwith "Empty stack"
| Stack(hd, tl) -> (hd:'a), (tl:Stack<_>)
let myTree = Tree("A", Tree("B", Node("D"), None), Tree("C", Tree("E", None, Node("G")), Tree("F", Node("H"), Node("J"))))
let myStack = Stack((myTree, 1), Stack.EmptyStack)
现在我已经想尽各种办法来回报流行,而且每一个抛出一个不同类型的错误与签名:
let (tree, level), z = myStack.pop
throws: stdin(22,24):错误FS0001:此表达式预计有 ('a *'b)*'c 但这里有类型 (Tree * int)Stack - >(Tree * int )*(Tree * int)堆栈
//let (tree:Tree<_>, level:int), z:Stack<Tree<_>*int> = myStack.pop
let (tree:Tree<_>, level:int), z:Stack<'a> = myStack.pop
//let (tree:Tree<'a>, level:int), _ = myStack.pop
//let (tree:Tree<string>, level:int), z:Stack<Tree<string>*int> = myStack.pop
上面的尝试未注释的抛出: 标准输入(16,46):错误FS0001:预计这个表达式为具有类型 (树< 'B> * INT)*' C 但这里的类型是 “堆栈