使用像show
這樣的函數將評估在打印前給出的任何表達式。如果我撥打show (12+4)
,輸出將是16
。我怎樣才能編寫直接打印輸出功能,即當與12+4
稱爲將返回12+4
或(12+4)
如何在Haskell評估之前打印函數的參數?
感謝
使用像show
這樣的函數將評估在打印前給出的任何表達式。如果我撥打show (12+4)
,輸出將是16
。我怎樣才能編寫直接打印輸出功能,即當與12+4
稱爲將返回12+4
或(12+4)
如何在Haskell評估之前打印函數的參數?
感謝
純函數不能打印任何東西。要打印某個函數,必須在IO monad中返回一個值。
但是,我想你只是想打印參數來進行調試。對於這個特定的任務,有一個名爲Debug.Trace.trace
的效用函數就是這樣做的。
的典型用法如下:
import Debug.Trace
fib :: Int -> Int
fib n | trace ("fib input:" ++ show n) False = undefined
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
第一分支「技巧」 GHC評估trace ("fib input:" ++ show n) False
,其打印一些調試輸出之後返回False
。由於守衛是假的,= undefined
部分將被忽略。
不要使用此功能比任何其他的調試。
你可能也想看看在GHCi debugger更先進的調試技術。
謝謝,這很有用,但如果我用(12 + 4)調用該函數,show n仍然會評估參數。我正在打印12 + 4字面到終端 – user7685672
@ user7685672我明白了。問題是12 + 4的計算結果爲16,並且無法區分這些整數。 – chi
這是不可能的。函數接收*值*作爲參數,而不是表達式。 16是一個值。 12 + 4是一個表達式,一種計算方式16.如果你想知道16是如何計算的,你將不得不用'+'來測試,而不是用'+'結果調用的函數。 – amalloy
Haskell使用懶惰評估。該參數應作爲表達式接收,並在使用前不進行評估。 – user7685672
@ user7685672這是一個實現細節。從概念上講,該功能對thunk沒有任何訪問權限,只有thunk代表的是什麼。 – chepner