2017-03-09 87 views
1

使用像show這樣的函數將評估在打印前給出的任何表達式。如果我撥打show (12+4),輸出將是16。我怎樣才能編寫直接打印輸出功能,即當與12+4稱爲將返回12+4(12+4)如何在Haskell評估之前打印函數的參數?

感謝

+1

這是不可能的。函數接收*值*作爲參數,而不是表達式。 16是一個值。 12 + 4是一個表達式,一種計算方式16.如果你想知道16是如何計算的,你將不得不用'+'來測試,而不是用'+'結果調用的函數。 – amalloy

+0

Haskell使用懶惰評估。該參數應作爲表達式接收,並在使用前不進行評估。 – user7685672

+0

@ user7685672這是一個實現細節。從概念上講,該功能對thunk沒有任何訪問權限,只有thunk代表的是什麼。 – chepner

回答

0

純函數不能打印任何東西。要打印某個函數,必須在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更先進的調試技術。

+0

謝謝,這很有用,但如果我用(12 + 4)調用該函數,show n仍然會評估參數。我正在打印12 + 4字面到終端 – user7685672

+0

@ user7685672我明白了。問題是12 + 4的計算結果爲16,並且無法區分這些整數。 – chi