Haskell 哈斯克尔标准&x27;nf';应用于太少的参数

Haskell 哈斯克尔标准&x27;nf';应用于太少的参数,haskell,benchmarking,binary-search,criterion,Haskell,Benchmarking,Binary Search,Criterion,我是哈斯克尔的新人。我正在研究二进制搜索算法的基准(标准)。我不断得到错误:“nf”应用于太少的参数我做错了什么 谢谢 binSear array serNum lowInx highInx | highInx < lowInx = -1 | array!!sred > serNum = binSear array serNum lowInx (mid-1) | array!!sred < serNum = binSear array serNum

我是哈斯克尔的新人。我正在研究二进制搜索算法的基准(标准)。我不断得到错误:“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)
          ]
binSear数组serNum lowInx highInx
|高inx<低inx=-1
|阵列!!sred>serNum=BISEAR数组serNum lowInx(mid-1)
|阵列!!srednf的类型是(a->b)->a->b,因此它需要两个参数:一个函数和该函数的一个输入。该函数应该生成一个基准

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


您可能会被迫对binSear的参数进行重新排序,或者创建一个助手lambda来执行此操作,以确保在最后一个参数中执行currying操作,并且您应该将该参数传递到括号外的nf。

I yust的做法类似于:bench“1”$nf(binSear 5452700 0 999999)arr,并且它可以工作。比you@MatejKr我认为在这种情况下,实际上没有必要重新排序。您需要确保的是,在应用到最终参数之前,函数不能做任何实际的工作,因为否则该工作可能会被缓存,而Criteria只会真正对第一次迭代进行基准测试。(这也是为什么必须首先分别提供函数和参数的原因。)