Tôi muốn xác định typeclass sau Mapping
:Haskell: các lớp học kiểu chất vấn
{-# LANGUAGE MultiParamTypeClasses #-}
class Mapping k v m where
empty :: m v
insert :: k -> v -> m v -> m v
search :: k -> m v -> Maybe v
delete :: k -> m v -> m v
Một thể hiện của Mapping
là Data.Map.Map
{-# LANGUAGE ..., FlexibleInstances #-}
instance Ord k => Mapping k v (Map.Map k) where
empty = Map.empty
search = Map.lookup
insert = Map.insert
delete = Map.delete
Và bây giờ tôi muốn tạo ra một loại Trie :: * -> * -> * -> *
như
{-# LANGUAGE ..., UndecidableInstances #-}
data Trie m k v = Trie {
trValue :: Maybe v,
trChildren :: m (Trie m k v)
}
instance Mapping k (Trie m k v) m => Mapping [k] v (Trie m k) where
search [] tree = trValue tree
search (x:xs) tree =
search xs =<< search x (trChildren tree)
Cho đến nay rất tốt, bây giờ tôi cũng muốn xác định 's insert
và empty
, và đó là nơi tôi gặp vấn đề.
tôi sẽ thảo luận empty
vì nó đơn giản và insert
cần nó dù sao đi nữa .. Nếu tôi cố gắng này:
instance Mapping k (Trie m k v) m => Mapping [k] v (Trie m k) where
empty = Trie { trValue = Nothing, trChildren = empty }
...
và làm cho tôi nhận được lỗi sau:
Could not deduce (Mapping k (Trie m k1 v) (m k1))
from the context (Mapping [k1] v (Trie m k1),
Mapping k1 (Trie m k1 v) (m k1))
arising from a use of `empty' at test.hs:27:49-53
Possible fix:
add (Mapping k (Trie m k1 v) (m k1)) to the context of
the instance declaration
or add an instance declaration for (Mapping k (Trie m k1 v) (m k1))
In the `trChildren' field of a record
In the expression: Trie {trValue = Nothing, trChildren = empty}
In the definition of `empty':
empty = Trie {trValue = Nothing, trChildren = empty}
Tôi đã đã cố gắng và cố gắng giải quyết nó nhưng thất bại.
Có ai biết cách làm cho nó hoạt động không? Thậm chí có thể không?
BTW, tôi đề nghị xóa 'v' khỏi định nghĩa lớp loại (nhưng để nó trong chữ ký của các phương thức). Bạn không cần nó, ít nhất là cho tất cả các cấu trúc bạn đã đưa ra cho đến nay, bởi vì tất cả chúng sẽ lấy bất kỳ kiểu chứa nào, và nó làm mọi thứ đơn giản hơn. –