Критерий Haskell - 'nf' применяется к слишком малому количеству аргументов

Я новый парень для Хаскелла. Я работаю над тестом (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 ответ

Решение

Тип nf - (a-> b) -> a-> b, поэтому он ожидает два параметра: функцию и вход для этой функции. Функция должна производить Benchmarkable.

В вашем случае вы просто передаете nf один параметр: саму функцию, но эта функция полностью применяется, поэтому она не ожидает никаких дополнительных параметров и не передает этот дополнительный параметр. В этом случае вам следует частично применить функцию и передать этот дополнительный параметр в nf.

Возможно, вам придется изменить порядок параметров binSear или создать вспомогательную лямбду, чтобы гарантировать, что карри происходит в последнем параметре, и вы должны передать этот параметр в nf вне скобок.

Другие вопросы по тегам