有沒有什麼辦法在ghci
中打印出嵌套變量的推斷類型?考慮代碼,任何方式在do/while/let塊中打印出一個變量類型?
let f = g where
g (x :: Int) = x
然後,很高興查詢g
的類型,例如, :t f.g
將打印出Int -> Int
。
有沒有什麼辦法在ghci
中打印出嵌套變量的推斷類型?考慮代碼,任何方式在do/while/let塊中打印出一個變量類型?
let f = g where
g (x :: Int) = x
然後,很高興查詢g
的類型,例如, :t f.g
將打印出Int -> Int
。
您可以通過給出錯誤的類型註釋並檢查錯誤消息來哄騙這些信息。
*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...
這絕對是更方便的解決方案。當你只有「a」時,它似乎工作得很好。然而,我確實碰巧遇到了一個特殊的情況,我在do塊中有一個變量,使用範圍變量,其中類型註釋似乎沒有任何顯示。 (奇怪的是,也許我應該提交一個bug)。 – gatoatigrado
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>
我發現這比其他答案更容易,因爲有時你通過強制類型來得到不同的錯誤,但這樣你總能找出類型。 –
'g'與'f'有沒有相同的類型? ':t f'。 –
這是一個玩具的例子 – gatoatigrado
順便說一下,你是如何得到ghci接受多線聲明?它從來沒有爲我工作。 –