【发布时间】:2011-05-15 20:34:13
【问题描述】:
我已经定义了 F# Tree 和 Stack 类型,在 Stack 上有一个 pop 成员。我无法在 pop 的结果上获得正确的类型签名。在我尝试使用 pop 之前,这是我的代码:
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)
现在我尝试了各种方法来返回 pop,每种方法都会引发不同类型的签名错误:
let (tree, level), z = myStack.pop
抛出: 标准输入(22,24):错误 FS0001:此表达式应具有类型 ('a * 'b) * 'c 但这里有类型 (Tree * int) Stack -> (Tree * int) * (Tree * int) Stack
//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:此表达式应具有类型 (树 * int) * 'c 但这里有类型 '一个堆栈
【问题讨论】:
标签: f#