เกณฑ์ 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 ดังนั้นจึงต้องมีพารามิเตอร์สองตัว: ฟังก์ชันและอินพุตของฟังก์ชันนั้น ฟังก์ชันควรสร้างการเปรียบเทียบได้

ในกรณีของคุณ คุณเพียงแค่ส่งพารามิเตอร์ตัวหนึ่งไปที่ nf นั่นคือตัวฟังก์ชันเอง แต่ฟังก์ชันนั้นถูกนำไปใช้โดยสมบูรณ์ ดังนั้นจึงไม่ได้คาดหวังพารามิเตอร์เพิ่มเติมใดๆ และคุณไม่ส่งพารามิเตอร์เพิ่มเติมนั้นด้วย ในกรณีนี้ คุณควรใช้ฟังก์ชันบางส่วนและส่งพารามิเตอร์พิเศษนั้นไปที่ nf

คุณอาจถูกบังคับให้เรียงลำดับพารามิเตอร์ของ binSear ใหม่หรือสร้างตัวช่วย lambda เพื่อดำเนินการดังกล่าว เพื่อให้แน่ใจว่าการแกงจะเกิดขึ้นในพารามิเตอร์สุดท้าย และคุณควรส่งพารามิเตอร์นั้นไปที่ nf นอกวงเล็บ

person fgv    schedule 28.07.2015
comment
ฉันทำมันเหมือน: bench 1 $ nf (binSear 5452700 0 9999999) arr และใช้งานได้ กว่าที่คุณ - person MatejKr; 28.07.2015
comment
@MatejKr ฉันไม่คิดว่าการเรียงลำดับใหม่มีความจำเป็นจริง ๆ ในกรณีนี้ สิ่งที่คุณต้องแน่ใจคือฟังก์ชันไม่สามารถทำงานจริงใดๆ ได้ก่อนที่จะนำไปใช้กับพารามิเตอร์สุดท้าย เพราะไม่เช่นนั้นงานนั้นอาจถูกแคชไว้และ Criterion จะเปรียบเทียบเฉพาะการวนซ้ำ ครั้งแรก เท่านั้น (นั่นคือเหตุผลว่าทำไมคุณต้องจัดเตรียมฟังก์ชันและอาร์กิวเมนต์แยกกันตั้งแต่แรก) - person Ørjan Johansen; 28.07.2015