2011-07-20 85 views
15

有沒有什麼辦法在ghci中打印出嵌套變量的推斷類型?考慮代碼,任何方式在do/while/let塊中打印出一個變量類型?

let f = g where 
    g (x :: Int) = x 

然後,很高興查詢g的類型,例如, :t f.g將打印出Int -> Int

+0

'g'與'f'有沒有相同的類型? ':t f'。 –

+2

這是一個玩具的例子 – gatoatigrado

+0

順便說一下,你是如何得到ghci接受多線聲明?它從來沒有爲我工作。 –

回答

9

您可以通過給出錯誤的類型註釋並檢查錯誤消息來哄騙這些信息。

*Main> let f = g where g::a; g (x::Int) = x 

<interactive>:1:23: 
    Couldn't match type `a1' with `Int -> Int' 
     `a1' is a rigid type variable bound by... 
+0

這絕對是更方便的解決方案。當你只有「a」時,它似乎工作得很好。然而,我確實碰巧遇到了一個特殊的情況,我在do塊中有一個變量,使用範圍變量,其中類型註釋似乎沒有任何顯示。 (奇怪的是,也許我應該提交一個bug)。 – gatoatigrado

10

ghci的調試器可以與正確放置斷點打印你(但你需要加載一個模塊中的定義):

{-# LANGUAGE ScopedTypeVariables #-} 

f a = g a where 
    g (x :: Int) = x 

然後在ghci的:

Prelude> :l tmp2.hs 
[1 of 1] Compiling Main    (tmp2.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :b 3 9 
Breakpoint 0 activated at tmp2.hs:3:7-9 
*Main> f undefined 
Stopped at tmp2.hs:3:7-9 
_result :: Int = _ 
a :: Int = _ 
g :: Int -> Int = _ 
[tmp2.hs:3:7-9] *Main> 
+0

我發現這比其他答案更容易,因爲有時你通過強制類型來得到不同的錯誤,但這樣你總能找出類型。 –