2014-10-29 11 views
10

Cho một số trở ngại typeclass:Làm cách nào để tìm ra loại (cụ thể) nào đáp ứng một tập hợp các ràng buộc về kiểu chữ?

{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses #-} 
import Data.Array.Unboxed(Ix,IArray,UArray) 

type IntLike a = (Ord a, Num a, Enum a, Show a, Ix a, IArray UArray a) 

Làm thế nào tôi có thể tìm ra các loại đáp ứng IntLike, ví dụ: tất cả các hạn chế nêu cùng?

tôi có thể ghép lại với nhau các thông tin cần thiết từ đầu ra của lệnh ghci của :info, và sau đó doublecheck công việc của tôi bằng cách gọi (hoặc có ghci typecheck)

isIntLike :: IntLike -> Bool 
isIntLike = const True 

tại nhiều loại hình, ví dụ .

Có cách nào để ghci thực hiện việc này cho tôi không?

Tôi hiện đang quan tâm đến các loại cụ thể, nhưng sẽ không nhớ có giải pháp tổng quát hơn, công cụ thông minh với bối cảnh hợp nhất!

+1

Bạn có thể thực hiện việc này bằng cách sử dụng mẫu haskell: 'main = print $ (reify '' Show >> = stringE. Show)'. Điều này sẽ không hoạt động đối với các từ đồng nghĩa của loại - thay vào đó, reify trả về AST thể hiện chính từ đồng nghĩa của loại, mà không mở rộng nó. Bạn có thể kiểm tra các từ đồng nghĩa loại là những ràng buộc, trích xuất các ràng buộc mà từ đó loại từ đồng nghĩa bao gồm, và tiếp tục 'reify'ing những từ đó. – user2407038

+0

Phải, dường như chứa tất cả thông tin tôi cần để thực hiện giao lộ, cảm ơn! Tôi sẽ nói những gì tôi có thể roi lên, nhưng tôi phải nói rằng hack GHCi gần như có vẻ thực tế hơn :-) – yatima2975

+0

@ user2407038 bạn có thể biến nhận xét đó thành câu trả lời như tôi đã trả lời qeustion không? – sclv

Trả lời

1

Câu trả lời của cộng đồng Wiki dựa trên các nhận xét:

Bạn có thể thực hiện việc này bằng cách sử dụng mẫu haskell.

main = print $(reify ''Show >>= stringE . show). 

Điều này sẽ không hoạt động cho các từ đồng nghĩa loại - thay vào đó, sửa lại trả về AST thể hiện chính từ đồng nghĩa, mà không mở rộng. Bạn có thể kiểm tra các từ đồng nghĩa loại là những ràng buộc, trích xuất các ràng buộc mà từ đó loại từ đồng nghĩa bao gồm, và tiếp tục sửa đổi những từ đó.

+0

Giá trị chỉ ra điều này có thể được thực hiện chỉ trong GHCi với '-XTemplateHaskell' khi sử dụng' $ (Language.Haskell.TH.Syntax.reify '' Show >> = Language.Haskell.TH.Lib.stringE. Show) ' – Alec

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