Критерий Haskell — «nf» применяется к слишком небольшому количеству аргументов

Я новичок в Haskell. Я работаю над эталоном (критерием) по алгоритму бинарного поиска. Я продолжаю получать сообщение об ошибке: «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)
          ]

person MatejKr    schedule 28.07.2015    source источник


Ответы (1)


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

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

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

person fgv    schedule 28.07.2015
comment
Я просто сделал это так: скамейка 1 $ nf (binSear 5452700 0 9999999) arr и это работает. Чем ты - person MatejKr; 28.07.2015
comment
@MatejKr Я не думаю, что в этом случае изменение порядка было необходимо. Вам нужно убедиться, что функция не может выполнять какую-либо реальную работу до того, как будет применена к конечному параметру, потому что в противном случае эта работа может быть закеширована, и Criterion действительно будет оценивать только первую итерацию. (Это также причина, по которой вы должны в первую очередь предоставлять функцию и аргумент отдельно.) - person Ørjan Johansen; 28.07.2015