小编Ton*_* K.的帖子

Clojure:以单一方式避免NPE的惯用/清洁方式

我有点懊恼,一些内置的Clojure函数在我看来是一种不一致的行为.

我正在尝试这样做:

 (let [kwns (namespace (keyword v))]
   ...)
Run Code Online (Sandbox Code Playgroud)

在v可能的上下文中nil.该keyword函数按预期(返回nil)工作,但命名空间抛出NPE.

我认为monad并不经常用于Clojure,因为nil-punning似乎是惯用的形式(正如本文详细介绍的那样).

我预计kwns会出现零,而不是抛出NPE.当这种不一致引起丑陋的头脑时,保持代码清洁的推荐方法是什么...... 当然,对nil我的代码进行检查并不是我想要的答案.

clojure

6
推荐指数
1
解决办法
171
查看次数

在scala中折叠列表的有效方法,同时避免分配和变量

我在列表中有一堆项目,我需要分析内容以找出其中有多少是"完整"的.我开始使用分区,但后来意识到我不需要两个列表,所以我切换到折叠:

val counts = groupRows.foldLeft( (0,0) )( (pair, row) => 
     if(row.time == 0) (pair._1+1,pair._2) 
     else (pair._1, pair._2+1)
   )
Run Code Online (Sandbox Code Playgroud)

但是我为很多并行用户提供了很多行,并且它导致了大量的GC活动(假设我...... GC 可能来自其他东西,但我怀疑这是因为我理解它将在折叠的每个项目上分配一个新的元组.

暂时,我把它重写为

var complete = 0
var incomplete = 0
list.foreach(row => if(row.time != 0) complete += 1 else incomplete += 1)
Run Code Online (Sandbox Code Playgroud)

它修复了GC,但引入了变量.

我想知道是否有一种方法可以在不使用变量而不滥用GC的情况下这样做?

编辑:

我已收到的答案很难打电话.大型列表上的var实现似乎要快得多(比如40%),甚至比尾部递归优化版本更强大,但应该是等效的.

dhg的第一个答案似乎与尾递归的性能相当,这意味着大小传递是超级高效的......事实上,当优化时,它的运行速度比尾递归的速度快一些.我的硬件.

optimization functional-programming scala

5
推荐指数
1
解决办法
653
查看次数

通过在Scala中组合Option [谓词]函数来构建最小谓词函数(可能使用scalaz)

我有一个列表,我希望过滤结果.

用户可以为行上的任何属性提供特定限制(例如,我只想查看x == 1的行).如果它们没有指定限制,那么当然不使用谓词.当然,最简单的形式是:

list.filter(_.x == 1)
Run Code Online (Sandbox Code Playgroud)

有许多可能的简单谓词,我正在构建一个新的谓词函数,其代码将用户搜索项(例如Option [Int])转换为谓词函数或Identity(返回true的函数).代码看起来像这样(缩短了,为了清楚起见添加了显式类型):

case class ResultRow(x: Int, y: Int)

object Main extends App {
  // Predicate functions for the specific attributes, along with debug output
  val xMatches = (r: ResultRow, i: Int) => { Console println "match x"; r.x == i }
  val yMatches = (r: ResultRow, i: Int) => { Console println "match y"; r.y == i }
  val Identity = (r : ResultRow) => { Console println "identity"; true }

  def makePredicate(a: …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala composition scalaz

5
推荐指数
1
解决办法
1118
查看次数

Haskell:如何生成两个简单代数数据类型的笛卡尔积

我正在学习Haskell,所以我正在写一些简单的纸牌游戏.我已经定义了一些数据类型:

data Rank = Ace|Two|Three|Four|Five|Six|Seven|Eight|Nine|Ten|Jack|Queen|King deriving (Eq,Show,Ord)

data Suit = Hearts|Spades|Diamonds|Clubs deriving (Show)

data Card = Card Rank Suit 
Run Code Online (Sandbox Code Playgroud)

现在我想创建一张52张牌的原始牌组.我确信有一种光滑的方式可以做到,但我能想到的只有:

 pristineDeck = [Card Ace Hearts, Card Two Hearts, ...]
Run Code Online (Sandbox Code Playgroud)

我可以让Haskell为我生成这个列表吗?

haskell

5
推荐指数
2
解决办法
566
查看次数

PostgreSQL 9.1 可以泄漏锁吗?(共享内存不足/增加 max_pred_locks_per_transaction)

我们最近升级到了 postgresql 9.1.6(从 8.3)。我们的测试服务器表明 max_pred_locks_per_transaction 应至少设置为 900(这远远超出了建议设置 64)。

我们现在正在生产中,我不得不多次增加这个参数,因为我们的日志将开始填充:

ERROR:  53200: out of shared memory
HINT:  You might need to increase max_pred_locks_per_transaction.
Run Code Online (Sandbox Code Playgroud)

客户端连接设置为 600(但池系统永远不会超过 100 个客户端):

max_pred_locks_per_transaction:我们达到了 3000。大约一天就用完了。到了9000,大概3天就用完了。

我现在将其设置为 30000,并且由于该数字是每个允许的客户端连接分配的平均数,因此我现在有大约 5 GB 的共享内存专用于锁定空间!

我确实将共享缓冲区设置得相当高(目前为 24GB),超过了 40% RAM 的值。(我计划在下次重新启动时将其调低至 RAM 的 25% 左右)。

编辑:这种调整结果是一个坏主意。我的数据库有很多繁重的查询,并且有一半的大RAM专用于shared_buffers可以防止它阻塞,因为它可以完全缓存较大的表。

平均而言,我一次会看到大约 5-10 个活跃查询。我们的查询负载远远超过我们的更新负载。

有人愿意告诉我如何找出这里出了什么问题吗?有了如此小的更新集,我真的不明白为什么我们如此频繁地耗尽锁……对我来说,它确实闻起来像泄漏。

有谁知道如何检查锁的去向吗?(例如,我如何阅读有关此问题的 pg_locks 的内容)

locking postgresql-9.1

2
推荐指数
1
解决办法
3875
查看次数

在Lift中,如何在重复(自动复制)CssSel变换中选择顶级元素

我有以下html结构:

<div class="top_level">
   ... other elements ...
</div>
Run Code Online (Sandbox Code Playgroud)

我希望输出结果为DIV序列:

<div id="1" class="top_level">
   ... other elements ...
</div>
<div id="2" class="top_level">
   ... other elements ...
</div>
<div id="3" class="top_level">
   ... other elements ...
</div>
Run Code Online (Sandbox Code Playgroud)

我试图通过CssSel变换来做到这一点,其中嵌套元素本身将被循环(div中有一个表),所以我有类似于:

".top_level *" #> groups.map(group =>
  ".top_level [id]" #> group.id & // WHAT CSS Selector can I use? 
  ".the_row *" #> group.rows.map( ... )
  )
Run Code Online (Sandbox Code Playgroud)

一切正常,除了ID没有设置.我可以看到我的选择器".top_level [id]"是嵌套的,因此它有意义它不起作用,但我想不出还有什么可以放在那里得到我正在寻找的结果.

scala lift

2
推荐指数
1
解决办法
561
查看次数

Clojure:如何获取定义地图的文件/行号?

我知道我能得到:line并且:file从一个变种的元数据; 但是,我正在构建一个系统,用户可以在其中传递原始地图,最后我会将数据"链接"在一起.当此链接失败时,我想报告他们指定地图的文件/行.例如:

 (defn generate-stuff []
    (make-thing { :k (make-thing { :k v }) }))

 (link (generate-stuff) (other-generator))
 ;; outputs file/line of the map containing the errant :k/v pair
Run Code Online (Sandbox Code Playgroud)

我假设写一个宏来关联文件/行与集合的元数据几乎肯定是要走的路,但由于没有任何"var"可供查看,我不知道从哪里获取行号.我看到了get-line-number的定义,但它需要一个读者,虽然我可以找到所有特殊的读者和 *default-data-reader-fn*数据读取器(这是零),但我似乎无法弄清楚如何访问"代码"读者.

clojure reader

2
推荐指数
1
解决办法
798
查看次数