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