Haskell 标准 - 'nf' 应用于太少的参数
Haskell Criterion - 'nf' is applied to too few arguments
我是 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)
]
nf的类型是(a->b)->a->b,所以它需要两个参数:a函数和该函数的输入。该函数应该产生一个 Benchmarkable。
在您的情况下,您只是将一个参数传递给 nf:函数本身,但该函数已完全应用,因此它不需要任何其他参数,您也不需要传递那个额外的参数。在这种情况下,您应该部分应用该函数并将该额外参数传递给 nf。
您可能被迫重新排序 binSear 的参数或创建辅助 lambda 来这样做,以确保柯里化发生在最后一个参数中,您应该将该参数传递给 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)
]
nf的类型是(a->b)->a->b,所以它需要两个参数:a函数和该函数的输入。该函数应该产生一个 Benchmarkable。
在您的情况下,您只是将一个参数传递给 nf:函数本身,但该函数已完全应用,因此它不需要任何其他参数,您也不需要传递那个额外的参数。在这种情况下,您应该部分应用该函数并将该额外参数传递给 nf。
您可能被迫重新排序 binSear 的参数或创建辅助 lambda 来这样做,以确保柯里化发生在最后一个参数中,您应该将该参数传递给 nf 括号外。