我正在尝试理解Prolog中的差异列表,但我正在努力实际实现一个,每次我尝试这样做,我得到一个列表列表,但这不是我想要的.我正在尝试实现一个追加谓词,但到目前为止运气不佳.很少有尝试,所有这些都无效.
app(X, Y, Z) :- Z = [X|Y].
?- app([a,b,c], [z], Z).
Z = [[a,b,c],z].
Run Code Online (Sandbox Code Playgroud)
要么
app(X, Y, Z) :- Z = [X|Hole], Hole = Y.
Run Code Online (Sandbox Code Playgroud)
与第一个结果相同(它们看起来基本相同).我在一本有效的书中有一个例子(尽管它不是谓词),我不明白其中的区别.X实例化到正确答案[a,b,c,z],与第二个例子有什么不同?
X = [a,b,c|Y], Y = [z].
Run Code Online (Sandbox Code Playgroud)
我错过了什么?谢谢.
我很难理解Java泛型中的通配符.具体来说,我有以下问题:
如果我们有LinkedList<?>,为什么我们不能添加Object它?我明白它不知道列表的类型,但是不会Object在列表中添加一个在任何情况下都覆盖我们?
上述类似的问题,如果我们有LinkedList<? extends Number>,为何我们不可以add一个Number呢?
最后,如果我们有LinkedList<? super Number>,为什么我们add一Integer到列表中,我们不应该只能够添加东西,都是数的超?
我想我正在试图理解通配符的工作方式,我已经阅读了关于它们的Oracle教程以及其他一些内容,但我不明白为什么它们可以正常工作.
可能重复:
main中的argc和argv
我很难理解用于一般主函数声明的符号,即int main(int argc, char *argv[]).我明白实际传递给main函数的是一个指向指针的指针char,但我觉得这个符号很难.例如:
为什么**argv指向第一个字符而不是整个字符串?同样,为什么*argv[0]指向与前一个示例相同的内容.
为什么*argv指向整个第一个字符串,而不是char像前一个例子那样的第一个字符串?
这有点无关,但是为什么*argv + 1指向一个字符串'减去第一个字符'而不是指向数组中的下一个字符串?
我在理解状态monad的情况下类型参数指示的内容时遇到了一些麻烦,但是对于其他mtl monad也是如此.在我理解的范围内,当我组成一个州立单体时,就像State String Int我所拥有的那样StateT String Identity Int.get对于MonadState类型类的方法,它返回m s,在这种情况下'm'是什么?它是Identity monad,Identity Int吗?在这种情况下,'s'表示状态的类型是'm'的参数?
谢谢,我显然在理解Haskell的类型系统时遇到了一些麻烦.