Tôi đang cố gắng để mã hóa một danh sách các mục mà có các loại hạn chế được trường hợp của một số loại lớp:Danh sách các mặt hàng của các loại bị hạn chế bởi typeclass
{-# LANGUAGE RankNTypes, TypeSynonymInstances, LiberalTypeSynonyms #-}
module Test where
class Someable a where
some :: a -> String
data Some = Some String
type SomeGroup = forall a. Someable a => [a]
instance Someable Some where
some (Some v) = v
instance Someable SomeGroup where
some (x:xs) = (some x) ++ ", " ++ (some xs)
main = do
putStrLn $ show.some [Some "A", [Some "B", Some "C"]]
Nhưng biên soạn thất bại với lỗi:
Test.hs:14:10:
Illegal polymorphic or qualified type: SomeGroup
In the instance declaration for `Someable SomeGroup'
có vẻ như tôi thậm chí thất bại trong việc xác định dụ cho loại đồng nghĩa ...
tôi nhận thức được heterogenous collections bài viết wiki, nhưng muốn biết lý do tại sao chính xác cách tiếp cận của tôi không hoạt động - nó có vẻ tự nhiên đối với tôi để xác định loại bằng cách hạn chế thu thập chỉ để chứa các mục có loại là thể hiện của một số loại lớp.
Những gì bạn đang cố gắng làm ở đây có ý nghĩa, nhưng nó không được Haskell hỗ trợ tốt và thường là một triệu chứng của thiết kế không phải là thành ngữ. Nếu bạn tò mò về cách làm điều đó, @hammar cung cấp cho bạn một điểm khởi đầu. Nếu bạn gặp phải tình huống này trong mã thực, bạn có thể nên suy nghĩ lại cách tiếp cận của mình. –