Критерий 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 вне скобок.