修复类型定义以定义Functor的实例

时间:2016-01-22 11:43:49

标签: haskell functor

我正在尝试定义一个包含两个参数 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)]

我想在FuzzySet类型上定义一个Functor,但我有一些类约束必须在类型参数 i m 上得到满足,但它不是可能。有没有办法改进我的类型定义以解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:1)

还没有人说过,但为什么不使用派生的Functor实例?

{-# LANGUAGE DeriveFunctor #-}
newtype FuzzySet i m = FS (Map.Map i m) deriving (Eq, Ord, Functor)

不是将约束放在数据类型或实例上,而是将它们放在使用FuzzySet i m的函数上,就像您为add所做的那样。这样,虽然您可以为某些不符合约束的FuzzySet i x创建x,但您只能使用FuzzySet i m执行有用的操作{} 1}}