Có cách nào để làm cho GHC cung cấp các ràng buộc lớp kiểu của các lỗ được định kiểu không?


103

Hành vi hiện tại

Prelude> show _

<interactive>:7:6:
    Found hole ‘_’ with type: a0
    Where: a0 is an ambiguous type variable
    Relevant bindings include it :: String (bound at <interactive>:7:1)
    In the first argument of show’, namely ‘_’
    In the expression: show _
    In an equation for it’: it = show _

Hành vi mong muốn

Sẽ thật tuyệt nếu GHC cũng cho tôi biết rằng lỗ đã định Showhình có giới hạn loại kiểu.

Misc

Phiên bản GHC 7.8.1


16
AFAIK, điều này hiện không thể thực hiện được, nhưng nó chắc chắn sẽ hữu ích. Có thể đáng để mở một yêu cầu tính năng trên trình theo dõi lỗi GHC cho việc này.
kosmikus

11
Tôi đồng ý rằng điều này sẽ hữu ích. Tôi đã báo cáo nó dưới dạng một yêu cầu tính năng trên GHC trac: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese

4
Còn bây giờ bạn có thể sử dụng pre-type-lỗ lừa: show (undefined :: () -> ()); GHC sẽ cho biết thêm trong phần kiểm tra lỗi kiểu.
phadej

1
Đây là một yêu cầu tính năng hay một câu hỏi thực tế? Có nghĩa là, bạn có biết chắc chắn rằng không có cách nào để tạo GHC như bạn mong muốn, hoặc có khả năng bạn có thể đạt được những gì bạn muốn với trình biên dịch hiện tại, nhưng bạn không chắc chắn bằng cách nào?
stakx - không còn đóng góp vào

1
@stakx Nó là một chút của cả hai. Ban đầu khi tôi viết câu hỏi này, tôi đã bối rối tại sao GHC không cung cấp các ràng buộc của lớp kiểu và nghĩ rằng tôi đã sử dụng các lỗ đã nhập sai. Sau đó, một số nói với tôi rằng hiện tại điều này không thể làm được, nhưng có thể được thêm vào GHC. Vì vậy, sau đó tôi đã hy vọng rằng nó sẽ sớm được thêm vào. Nhiều người dường như muốn sử dụng nó. Thủ thuật của phadej dường như có hiệu quả trong thời gian ngắn, nhưng không thanh lịch hoặc dễ sử dụng như giải pháp dựa trên lỗ được đánh máy.
Wizek

Câu trả lời:


2

Điều này hiện đã được khắc phục ở GHC 8.0 nhờ vé GHC của @ DominiqueDevriese .

Do mặc định kiểu mở rộng , điều này không rõ ràng ngay trong GHCi. Với ví dụ của bạn,

> show _

  <interactive>:7:6: error:
     Found hole: _h :: ()
      Or perhaps ‘_h is mis-spelled, or not in scope
     In the first argument of show’, namely ‘_h
      In the expression: show _h
      In an equation for it’: it = show _h
     Relevant bindings include
        it :: String (bound at <interactive>:7:1)

loại lỗ được đặt mặc định (). Đây rõ ràng là hành vi mong muốn , mặc dù có một lập luận rằng mặc định mở rộng không nên áp dụng cho các lỗ (vì cách sử dụng phổ biến của chúng là để trình biên dịch cho bạn biết kiểu suy luận).

Tuy nhiên, nếu bạn biên dịch với GHC hoặc tắt các quy tắc mặc định mở rộng trong GHCi (qua :set -XNoExtendedDefaultRules), chúng tôi sẽ thấy kết quả của những cải tiến:

<interactive>:3:1: error:
     Ambiguous type variable a0 arising from a use of show
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what a0 should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
     In the expression: show _
      In an equation for it’: it = show _

<interactive>:3:6: error:
     Found hole: _ :: a0
      Where: a0 is an ambiguous type variable
     In the first argument of show’, namely ‘_’
      In the expression: show _
      In an equation for it’: it = show _
     Relevant bindings include
        it :: String (bound at <interactive>:3:1)

1

Không hiện tại là không thể, nhưng nó có thể được thêm vào GHC theo suy đoán.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.