假设你在 haskell 中有一个 nullary 函数,它在代码中被多次使用。它总是只评估一次吗?我已经测试了以下代码:
sayHello :: Int
sayHello = unsafePerformIO $ do
putStr "Hello"
return 42
test :: Int -> [Int]
test 0 = []
test n = (sayHello:(test (n-1)))
当我调用测试 10 时,它只写一次“Hello”,所以它表示函数的结果在第一次评估后存储。我的问题是,有保障吗?我会在不同的编译器中得到相同的结果吗?
编辑 我使用 unsafePerformIO 的原因是检查 sayHello 是否被多次评估。我不在我的程序中使用它。通常我希望 sayHello 每次评估时都有完全相同的结果。但这是一个耗时的操作,所以我想知道是否可以通过这种方式访问它,或者是否应该将它作为参数传递到需要确保它不会被多次评估的地方,即:
test _ 0 = []
test s n = (s:(test (n-1)))
...
test sayHello 10
根据答案,应该使用它。