2017-09-13 57 views
6

Khi tôi nhập :t lệnh trong GHCi Tôi thấy kiểu đa hình:Làm thế nào để in loại chức năng đa hình (hoặc giá trị) trong ghci với các quy tắc mặc định kiểu được áp dụng?

ghci> :t 42 
42 :: Num t => t 
ghci> :t div 
div :: Integral a => a -> a -> a 

Nhưng sau khi tôi thực sự đánh giá chức năng như vậy tôi thấy kết quả của kiểu mặc định quy tắc. Có một số lệnh hoặc khả năng quan sát trong ghci làm thế nào loại sẽ được thay đổi sau khi loại quy tắc mặc định được áp dụng theo báo cáo Haskell và/hoặc thực hiện ghc?

+0

Bạn thấy kết quả của các quy tắc mặc định loại như thế nào? ': t 42 \' div \ '2' hiển thị' Integral a => a', và do đó, kết quả của việc kết buộc, v.v. –

+0

@ n.m. Tôi đã nói về kết quả thực tế. Giống như '2^100 \' div \ '2' in' 633825300114114700748351602688' vì loại mặc định cho trường hợp này là 'Số nguyên'. Ngay cả khi 'ghci' nói rằng loại hằng số này là đa hình, trong thực tế nó là cụ thể và tôi muốn xem loại đơn hình nào được sử dụng. – Shersh

+1

@Shersh Đó chỉ là GHCi. REPL chọn một loại ('Integer', trong trường hợp này) bởi vì nó phải hiển thị một cái gì đó. Trong "thực" mã nó sẽ được đa hình cho đến khi bối cảnh chọn một loại. –

Trả lời

5

Bạn có thể làm điều này bằng cách bật hạn chế monomorphism và sau đó ràng buộc nó vào một cái tên mới:

Prelude> :set -XMonomorphismRestriction 
Prelude> let n = 42 
Prelude> :t n 
n :: Integer 
Prelude> let p = (^) 
Prelude> :t p 
p :: Integer -> Integer -> Integer 
Prelude> let e = (**) 
Prelude> :t e 
e :: Double -> Double -> Double 
Prelude> let d = div 
Prelude> :t d 
d :: Integer -> Integer -> Integer 

Nếu bạn không ưa thích sự cần thiết phải luôn xác định biến mới, bạn có thể làm được việc này bằng cách sử dụng

Prelude> :def monotype (\e -> return $ ":set -XMonomorphismRestriction\nlet defaulted = "++e++"\n:t defaulted") 

(bạn có thể muốn đưa địa chỉ trong hồ sơ .ghci của bạn luôn luôn có các lệnh có sẵn) và sau đó

Prelude> :monotype (^) 
defaulted :: Integer -> Integer -> Integer 
.210

Tất nhiên, toàn cầu tác dụng phụ tiềm ẩn tạo điều kiện cho những hạn chế monomorphism là vô cùng xấu xí, nhưng oh well ...

+0

Nó hoạt động với 'div' cho tôi (8.0.2). Có lẽ yêu cầu ': t d' :) –

+0

Vâng, cũng hoạt động ở 8.3 và 7.10, khi thực sự viết': t d' thay vì ': t div'. Các ngón tay của tôi đã gõ quá nhanh ở đó ... – leftaroundabout

+0

Điều đó thực sự hữu ích! Không hoàn hảo (vì tôi không thể viết ': t div') nhưng đã đủ tốt rồi. – Shersh

4

Không phải là một giải pháp hoàn hảo, nhưng nó có thể là một bước đầu tiên.

> import Data.Typeable 
> let withType x = (x, typeOf x) 
> withType [] 
([],[()]) 
> withType 56 
(56,Integer) 

Lưu ý rằng, kể từ khi loại a được đổi tên thành (a,TypeRep), GHCi sẽ không sử dụng tất cả các kỳ diệu mặc định của nó. Tuy nhiên, một số có thể được hiển thị.

Tùy chọn của GHCi :set +t cũng thú vị, nhưng có thể in loại đa hình trước mặc định GHCi.

+0

Đó là một giải pháp thú vị! – Shersh

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