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:
- 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. IncoherentInstances
nên chắc chắn để tôi biên dịch ... đúng không? Nhưng nó không.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.