我已经定义了F#树和栈类型,在栈上有一个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
| Emp
Push(A)
Push(B)
Pop
Pop
Push(C)
Push(A)
Pop
Push(X)
这将导致我得到这个线性列表:
X
C
但是,这看起来像一个数组吗?是stack={X,C}还是stack={C,X}?
据我所知,它应该是X,C,因为堆栈的顶部是头部,其他所有东西都是底部(尾部),所以在这种情况下,C必须是尾部,X是头部,这就是X,C。然而,在我刚刚接受这个之前,我只是认为征求别人的第二个意见是明智的,谢谢!
编辑:我只记得栈是后进先出( LIFO )结构……这只会让事情变得更复杂。如果“最后一个”是第一个被移除的,那么按照这个逻辑,数组看起来就像C,X,不是吗
我正在写一种基于堆栈操作的笑话语言。我试图找到使它完成图灵所需的最小数量的指令,但不知道基于一个堆栈的语言是否可以是图灵完整的。这些指令够了吗?
IF (top of stack is non-zero)
WHILE (top of stack is non-zero)
PUSH [n-bit integer (where n is a natural number)]
POP
SWAP (top two values)
DUPLICATE (top value)
PLUS (adds top two values, pops them, and pushes result)
我看了几个问题和
让我们假设我们有一个由枚举值索引的映射,如下所示
sealed trait A
case object B extends A
case object C extends A
type SafeMap = Map[A, String]
有没有可能以某种方式强制执行这种映射的穷举性?也许可以使用依赖类型?如果不是在Scala中,那么Idris也很有趣。
为了澄清,我希望对任何ADT都有一个通用约束,以检查Map是否为每个ADT变体定义了一个条目。