Я пытаюсь определить тип с двумя параметрами i и m. Я хочу специализировать этот тип, исправляя два конкретных экземпляра, которые фиксируют параметр m. На данный момент у меня есть следующие определения:
-- | ZadehMembership: represents a membership value between 0 and 1 with min and max operators
newtype ZadehMembership = Z Double deriving (Show, Eq, Ord, Num)
-- | PAMembership: represents a membership value between 0 and 1 with algebraic sum and product operators
newtype PAMembership = PA Double deriving (Show, Eq, Ord, Num)
-- | FuzzySet type
newtype FuzzySet i m = FS (Map.Map i m) deriving (Eq, Ord)
add :: (Ord i, Eq m, L.BoundedLattice m) => FuzzySet i m -> (i, m) -> FuzzySet i m
add (FS fs) (i, m) = if m == L.bottom then FS fs else FS (Map.insert i m fs)
fromList :: (Ord i, Eq m, L.BoundedLattice m) => [(i, m)] -> FuzzySet i m
fromList = foldl add empty
Я использую определение FuzzySet следующим образом:
let fs = fromList [(1, Z 0.2), (2, Z 0.5)]
Я хочу определить Functor для типа FuzzySet, но у меня есть некоторые ограничения класса, которые должны выполняться для обоих параметров типа i и m, но это невозможно. Есть ли способ улучшить определения типов, чтобы решить эту проблему?
Спасибо.
Data.Set.Set
не является функтором/монадой?. Краткий ответ: к сожалению, наличие ограничений класса типов справляется со стандартнымFunctor
. Индексированные функторы с ними справиться, я думаю. - person chi   schedule 22.01.2016imap :: IxFunctor f => (a -> b) -> f j k a -> f j k b
по-прежнему не дает вам дескриптора для навешивания каких-либо ограничений наj
,k
,a
илиb
. Я думаю, ему нужно что-то вродеRFunctor
. - person Daniel Wagner   schedule 23.01.2016Constraint
-индексированный функтор, возможно, использующий некоторую магию поликиндинга, ноIFunctor
не такой уж зверь, и моя догадка была дикой.RFunctor
может быть действительно рабочим выбором. - person chi   schedule 23.01.2016