所以我一直在使用Cabal在Haskell中安装软件包.我无法看到大多数这些文档(一般来说),而且我被告知学习haskell的最佳方法之一就是阅读包中的代码,弄清楚它的作用,然后玩它在GHCi或其他东西.但是你怎么做的?将这些软件包安装到沙箱或其他东西之后,我甚至看不到模块名称是什么,更不用说它们的源代码 - 我如何找到这些信息?
如果我要选择一个阵列中的所有元素arr同时满足谓词p_1和p_2,然后我有两个选项实现:
选项1:
arr.select{|x| x.p_1}.select{|x| x.p_2}
Run Code Online (Sandbox Code Playgroud)
选项2:
arr.select{|x| x.p_1 && x.p_2}
Run Code Online (Sandbox Code Playgroud)
这两者之间有显着差异吗?在我的用例中,谓词p_1减少了列表p_2,并且比列表p_2更昂贵p_1.因此,我怀疑p_1之前要p_2做得更快.但是,上述任何一个选项都有所作为吗?
我正在尝试将数组实现为Haskell中的列表列表.特别是,我有一些m我给出的数组,以及一个p我想要满足的谓词,我想创建一个索引列表,(x,y)使得该列表的x第th个元素y满足p.我把它设置为以下列表理解:
[(x,y) | x<-[1..],y<-[1..],p ((m !! y) !! x)]
Run Code Online (Sandbox Code Playgroud)
当它试图m在第一行中找到不存在的元素时会引发错误.我可以看到一个立即解决这个问题的方法就是改变内在的理解x和y类似的东西,y<-[1..length m]但我觉得有一种可行的方法可以利用懒惰.我只是不知道它是什么.
在写这个问题时,我意识到我想在GraphQL中做一些非常具体的事情,而我看不到实现它的好方法。这个想法是这样的:
GraphQL的优点之一是它允许您进行灵活的查询。例如,如果我想找到所有comments的所有posts每一个user在特定的forum话,我可以让查询
query{
findForum(id:7){
users{
posts{
comments{
content
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
太好了 通常,您希望收集数据以使其发生变异。因此,在这种情况下,也许我不想获取所有这些注释,而是想删除它们。幼稚的建议是deleteComment在comment类型上实现一个字段,该字段会使被调用的对象发生变化。这很糟糕,因为该请求被标记为query,因此它不应更改数据。
由于我们正在对数据进行变异,因此我们绝对应该将其标记为mutation。但是随后,我们失去了进行所需查询的能力,因为findForum它是查询字段,而不是突变字段。解决此问题的一种方法可能是在突变类型内重新定义您需要的所有查询字段。显然,这不是一个好主意,因为您需要重复很多代码,并且还会使功能成为该功能query的严格子集mutation。
现在,我认为“常规”解决方案是创建一个可以完成此任务的突变字段,而无需执行其他任何操作。因此,您定义了一个deleteAllUserPostCommentsByForum带参数的变体字段,并以明显的方式实现它。但是现在您失去了灵活性!如果您改为决定要user显式查找并删除其所有帖子,或者只想删除其某些帖子,则需要一个全新的突变字段。尽管与REST相比,GraphQL对于我来说很有用,但这确实像是一种事情。
那么,有没有一种好的方法可以同时避免这些问题?
我在haskell代码中定义了一个新类型,它将一个字符串列表列为记录.一个例子可能是
Board{size=(4,7),pieces=[["OA","AA","AA"],["BBB","BOO"],["OCCC","CCCO","OOCO"]]}
我已经将它设置为一个派生的实例Show和Read.如果我只是将上面的代码输入到ghci中,那么我就会得到我所放入的内容,这很好.但是,如果我用show来调用它,我会得到
"Board {size = (4,7), pieces = [[\"OA\",\"AA\",\"AA\"],[\"BBB\",\"BOO\"],[\"OCCC\",\"CCCO\",\"OOCO\"]]}"
语音标记很好,但我不知道为什么反斜杠存在.你不被允许下一个演讲标记或什么?在任何情况下,如果我试图打电话read来取回它,现在完全打破了.我试图告诉我没有任何字符串是数据构造函数,我得到一个很长的错误 - 我不知道为什么它认为它们是.
这有什么办法吗?