具有两个输入的 Haskell 准则

问题描述 投票:0回答:1

我想使用标准对具有两个输入的函数进行基准测试。然而,根据标准进行基准测试的函数似乎只能接受一个输入。我对 Haskell 很陌生,我确信这里已经有这个问题的答案,但我找不到它们。

我的设置是这样的,其中调用基准测试时使用

Int
确定要测试哪个
bgroup
。我尝试使示例尽可能简单。

import Criterion.Main ( bench, bgroup, whnf, defaultMain, nf )

benchmark :: Int -> IO ()
benchmark 0 = defaultMain [
    bgroup "group1" [bench "test1" $ whnf fun l1 l2
                    ]]
main :: IO ()
main = do
    benchmark 0

相关声明为

fun :: [Int] -> [Double] -> [[Double]]
l1  :: [Int]
l2  :: [Double]

如果我省略

l2
,程序可以运行,但运行时间将以纳秒为单位,而我知道这个函数一次迭代大约需要一分钟。我虽然将呼叫更新为
whnf fun $ l1 l2
就可以了,但事实并非如此。

如何更新对

fun
的调用以便我可以传递两个变量?

haskell haskell-criterion
1个回答
0
投票

我查看了标准文档,它说:

第二个将导致结果被评估为弱头正常形式(Haskell 默认值):

whnf :: (a -> b) -> a -> Benchmarkable

正如这两种类型所表明的那样,当您想要对函数进行基准测试时, 您必须提供两个值:

  • 第一个元素是函数,包含除最后一个参数之外的所有参数。
  • 第二个元素是函数的最后一个参数。

所以:

bench "test1" $ whnf (fun l1) l2
© www.soinside.com 2019 - 2024. All rights reserved.