2011-07-20 19 views
15

Có cách nào để in ra loại suy luận của biến lồng nhau trong ghci không? Hãy xem xét mã,Bất kỳ cách nào để in ra một loại biến trong khối do/while/let?

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

thì tốt hơn là truy vấn loại g, ví dụ: :t f.g sẽ in ra Int -> Int.

+0

Không 'g' có cùng kiểu với' f'? ': t f'. –

+2

Đó là ví dụ về đồ chơi – gatoatigrado

+0

Ngẫu nhiên, làm cách nào bạn nhận được ghci để chấp nhận tuyên bố nhiều dòng? Nó không bao giờ làm việc cho tôi. –

Trả lời

9

Bạn có thể thu thập thông tin này bằng cách đưa ra chú thích loại sai thích hợp và kiểm tra thông báo lỗi.

*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

Đây chắc chắn là giải pháp thuận tiện hơn. Khi bạn chỉ có "a", nó có vẻ hoạt động khá tốt. Tuy nhiên, tôi xảy ra để có một trường hợp cụ thể mà tôi có một biến trong một khối làm, sử dụng các biến scoped, nơi chú thích kiểu dường như không tiết lộ bất cứ điều gì. (lẻ, có lẽ tôi nên gửi một lỗi). – gatoatigrado

10

ghci debugger có thể in nó cho bạn với một breakpoint đặt đúng cách (nhưng bạn sẽ cần phải tải định nghĩa của bạn trong vòng một module):

{-# LANGUAGE ScopedTypeVariables #-} 

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

Sau đó, trong 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

Tôi thấy điều này dễ hơn câu trả lời khác, bởi vì đôi khi bạn gặp các lỗi khác nhau bằng cách buộc loại, nhưng theo cách này bạn luôn tìm ra loại. –

Các vấn đề liên quan