2013-02-22 24 views
14

Có cách nào trong ghci (hoặc ghc) để tìm loại suy luận của hàm cục bộ không?Tìm loại được suy ra cho hàm cục bộ

Ví dụ: nếu tôi có một hàm

f l = map f' l 
    where f' = (+1) 

là có một :t -like cách ghci để xem những gì các loại suy ra cho f' là?

Trả lời

5

Tôi không biết cách nào để thực hiện điều đó từ GHCi.

Tuy nhiên, nếu bạn đang sử dụng trình chỉnh sửa như Emacs hoặc Vim, bạn có thể thử ghc-mod. Đây là một công cụ bên ngoài cắm vào một trình soạn thảo và cung cấp cho bạn một số chức năng giống như IDE cho các chương trình Haskell, bao gồm khả năng nhận loại biểu thức tùy ý, bao gồm cả định nghĩa cục bộ.

Trong Emacs, bạn sẽ sử dụng C-c C-t để tìm loại biểu thức.

Nếu bạn không sử dụng Emacs hoặc Vim, bạn có thể quấn ghc-mod dưới dạng phần mở rộng GHCi hoặc gì đó, nhưng tôi nghĩ điều đó sẽ hơi khó xử. Tôi không thể tưởng tượng một cách tốt để làm điều đó mà không có một giao diện người dùng giống như trình chỉnh sửa. Tuy nhiên, ghc-mod chính nó chỉ là một công cụ dòng lệnh độc lập, do đó, nó rất dễ dàng để làm việc với. Nếu bạn có thể nghĩ về một giao diện người dùng tốt cho nó độc lập với một trình soạn thảo văn bản hiện có, hãy tìm nó!

Tất nhiên, nếu bạn không sử dụng Emacs hoặc Vim, có thể bạn nên: P.

+0

Tôi đang gặp sự cố khi làm việc, nhưng điều này trông thật tuyệt vời! – amindfv

8

Thật vậy, tôi đã học được điều này nhờ có câu trả lời tuyệt vời của hammar here. Đây là phiên bản ngắn:

Prelude> :l /tmp/foo.hs 
[1 of 1] Compiling Main    (/tmp/foo.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :break f 
Breakpoint 0 activated at /tmp/foo.hs:(1,1)-(2,18) 
*Main> f [1..10] 
Stopped at /tmp/foo.hs:(1,1)-(2,18) 
_result :: [b] = _ 
[/tmp/foo.hs:(1,1)-(2,18)] *Main> :step 
Stopped at /tmp/foo.hs:1:7-14 
_result :: [b] = _ 
f' :: b -> b = _ 
l :: [b] = _ 
[/tmp/foo.hs:1:7-14] *Main> :t f' 
f' :: b -> b 
+1

Điều này chỉ hiển thị loại 'f'' về các biến kiểu, mà tôi cho rằng không hoàn toàn trả lời câu hỏi của OP. Bạn có thể tiến thêm một bước nữa với ': print f'' sẽ bắt buộc đánh giá' f''. Sau đó ': t f'' sẽ hiển thị loại cụ thể. –

+0

Điều này thật thú vị, tôi không thể có được loại đầy đủ, ngay cả với ghi chú của @ Code-Guru. Ví dụ. trong trường hợp này, nó phải là 'f ':: (Num b) => b -> b' – amindfv

+0

Vâng, tôi muốn được giải thích về hành vi có tính chất gritty ở đây với/không có chữ ký kiểu đa hình, cũng như trong sự hiện diện của các phần mở rộng như 'NoMonomorphismRestriction' và có thể là' MonoLocalBinds'. @amindfv bạn đang sử dụng phiên bản GHC nào? – jberryman

0

hdevtools, nó khá nhanh và dễ sử dụng, mặc dù chỉ tích hợp cho Vim.

+0

Bạn có thể mô tả cách nhận dạng biểu thức bằng hdevtools không? – amindfv

+0

hdevtools loại tệp.hs cột hàng – lethalman

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