Haskell Criterion - 'nf'适用于太少的参数

时间:2015-07-28 13:46:55

标签: haskell benchmarking binary-search criterion

我是Haskell的新人。我正在研究二进制搜索算法的基准(Criteriaon)。我不断收到错误:'nf'适用于太少的争论,我做错了什么。

由于

binSear array serNum lowInx highInx
   | highInx < lowInx       = -1
   | array!!sred > serNum = binSear array serNum lowInx (mid-1)
   | array!!sred < serNum = binSear array serNum (mid+1) highInx
   | otherwise            = mid
   where
   mid = lowInx + ((highInx - lowInx) `div` 2)

main = do
        let arr = [1..10000000]
        defaultMain [
            bench "1" $ nf (binSear arr 54527 0 9999999)
          ]

1 个答案:

答案 0 :(得分:2)

nf 的类型是(a-&gt; b) - &gt; a-&gt; b ,所以它需要两个参数:一个函数和一个输入那个功能。该功能应该产生一个Benchmarkable。

在您的情况下,您只是将一个参数传递给 nf :函数本身,但该函数已完全应用,因此它不期望任何其他参数,也不会传递额外的参数。在这种情况下,您应该部分应用该函数并将该额外参数传递给nf。

您可能被迫重新排序binSear的参数或创建一个帮助器lambda来执行此操作,以确保在最后一个参数中发生currying,并且您应该将该参数传递给 nf 括号。