Kriteria Haskell - 'nf' diterapkan pada terlalu sedikit argumen

Saya orang baru di Haskell. Saya sedang mengerjakan tolok ukur (Kriteria) pada algoritma pencarian biner. Saya terus mendapatkan kesalahan: 'nf' diterapkan pada terlalu sedikit argumen. Apa yang saya lakukan salah.

Terima kasih

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 sumber


Jawaban (1)


Tipe nf adalah (a->b)->a->b, sehingga mengharapkan dua parameter: fungsi dan masukan ke fungsi tersebut. Fungsi tersebut harus menghasilkan Benchmarkable.

Dalam kasus Anda, Anda hanya meneruskan satu parameter ke nf: fungsi itu sendiri, tetapi fungsi tersebut diterapkan sepenuhnya, sehingga tidak mengharapkan parameter tambahan apa pun, Anda juga tidak meneruskan parameter tambahan tersebut. Dalam hal ini, Anda harus menerapkan sebagian fungsi tersebut dan meneruskan parameter tambahan tersebut ke nf.

Anda mungkin terpaksa menyusun ulang parameter binSear atau membuat lambda pembantu untuk melakukannya, untuk memastikan bahwa currying terjadi pada parameter terakhir, dan Anda harus meneruskan parameter tersebut ke nf di luar tanda kurung.

person fgv    schedule 28.07.2015
comment
Saya baru saja melakukannya seperti: bench 1 $ nf (binSear 5452700 0 9999999) arr dan berhasil. Daripada Anda - person MatejKr; 28.07.2015
comment
@MatejKr Saya rasa penataan ulang sebenarnya tidak diperlukan dalam kasus ini. Yang perlu Anda pastikan adalah bahwa fungsi tersebut tidak dapat melakukan pekerjaan nyata apa pun sebelum diterapkan ke parameter akhir, karena jika tidak, pekerjaan tersebut dapat di-cache dan Criterion hanya akan benar-benar melakukan benchmark pada iterasi pertama. (Itu juga alasan mengapa Anda harus menyediakan fungsi dan argumen secara terpisah.) - person Ørjan Johansen; 28.07.2015