8

Tôi đang cố gắng show một số loại Tagged s b (Data.Tagged) trong mô-đun cũng nhập từ thư viện accelerate. Rất tiếc, thư viện tăng tốc xác định cá thể hiển thịGiải quyết các trường hợp trùng lặp trong thư viện bên ngoài

instance Kit acc => Show (acc aenv a) where 

trong Data.Array.Accelerate.Pretty.hs. Đọc xung quanh một chút, không có gì tôi có thể làm để tránh nhập khẩu trường hợp này, mà rõ ràng là chồng chéo với dụ Data.Tagged Show. Thực tế, trường hợp tăng tốc chung giúp tôi không in được bất cứ thứ gì thuộc loại *->*->*.

Dưới đây là một ví dụ đơn giản mà chứng tỏ vấn đề:

{-# LANGUAGE FlexibleContexts, OverlappingInstances, IncoherentInstances #-} 

import Data.Array.Accelerate 
import Data.Tagged 

main :: (Show (Tagged Int Int)) => IO() 
main = let x = Tagged 3 
    in print (x::Tagged Int Int) 

Lỗi:

Overlapping instances for Show (Tagged * Int Int) 
     arising from a use of `print' 
    Matching instances: 
     instance Show b => Show (Tagged k s b) -- Defined in `Data.Tagged' 
     instance [overlap ok] accelerate-0.13.0.5:Data.Array.Accelerate.Trafo.Base.Kit 
          acc => 
         Show (acc aenv a) 
    -- Defined in `Data.Array.Accelerate.Pretty' 

Tôi có một vài câu hỏi:

  1. Tôi nghĩ OverlappingInstances sẽ cho phép tôi để giải quyết ví dụ, nhưng tôi nhận được cùng một lỗi.
  2. IncoherentInstances nên chắc chắn để tôi biên dịch ... đúng không? Nhưng nó không.
  3. Tại sao báo cáo GHC các Data.Tagged hiển thị ví dụ như Show (Tagged k s b) khi dụ (sao chép từ Data.Tagged) là:

    instance Show b => Show (Tagged s b) where 
    

Tôi tin rằng tôi đã thấy trước nơi tôi chỉ có thể để giải quyết các trường hợp chồng chéo bằng cách thêm chữ ký kiểu chữ rõ ràng (để buộc GHC chọn trường hợp cụ thể nhất), nhưng ví dụ của tôi ở cấp cao nhất và không liên quan đến đa hình, tôi không biết mình có thể hiểu rõ hơn về loại.

Ấn tượng của tôi là GHC sẽ có thể chọn trường hợp Data.Tagged vì (tôi nghĩ) Tagged không phải là trường hợp Accelerate.Base.Kit và do đó không đáp ứng các ràng buộc về thể hiện (tôi biết chúng tôi chỉ khớp với RHS của các trường hợp, nhưng GHC sẽ có thể hình dung ra rằng một trong những trường hợp không thể nào áp dụng ...)

EDIT

tôi tạo ra một báo cáo lỗi here, và các trường hợp vi phạm hiện đã bị xóa trong đầu repo. Có một câu trả lời tuyệt vời cho # 3 bên dưới, nhưng tôi vẫn muốn biết tại sao OverlappingInstances/IncoherentInstances không hoạt động.

Trả lời

5

tôi chỉ biết câu trả lời cho 3.

Khi một loại được biên soạn với -XPolyKinds và không hạn chế về loại một loại biến, GHC in các loại rất nặng. Sau tên kiểu, nó sẽ in ra một danh sách các loại biến đa hình, sau đó là các biến kiểu. Vì vậy, k hiển thị trong chữ ký loại có nghĩa là biến loại s có thể thuộc bất kỳ loại nào. (Do cách nó được sử dụng, b phải có loại *, vì vậy nó không phải là loại đa hình, do đó loại của nó không được liệt kê.)

Là một ví dụ về cách lố bịch này có thể nhận được, đây là một ví dụ từ các tài liệu cá tuyết chấm đen của một thư viện tôi đang làm việc trên bây giờ ..

(SingI Nat a, SingI Nat b, SingI Nat c, SingI Nat d, SingI Nat e) => StaticSize ((,,,,) Nat Nat Nat Nat Nat) ((,,,,) Nat Nat Nat Nat Nat a b c d e) 

Đó là sử dụng một bạt 5-tuple, quá. Điều đó chỉ làm cho nó thêm ngớ ngẩn, vì điều đó có nghĩa là bộ tuple xuất hiện trong cả loại và loại.