3
我想要定义一个具有两个参数的类型i和m。我想专门研究这个类型,修复两个固定m参数的特定实例。目前,我有如下定义:固定类型定义来定义Functor的一个实例
-- | 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型函子,但我有一些类约束必须同时满足这两种类型参数i和m,但这是不可能的。有没有办法改善我的类型定义以解决这个问题?
谢谢。
这似乎是一个众所周知的问题“为什么Data.Set.Set'不是函子/ monad?”的变体。简短的回答:不幸的是,类型的类约束符合标准的“Functor”。 [索引仿函数](http://stackoverflow.com/questions/27771474/what-is-exactly-an-indexed-functor-in-haskell-and-what-are-its-usages)可以应付它们,我认为。 – chi
我认为索引仿函数可能是一个合适的解决方案,但是我怎样才能使用它们呢?谢谢 – escher
@chi你确定索引仿函数的概念“足够令人兴奋”吗?类型'imap :: IxFunctor f =>(a - > b) - > fjka - > fjkb'仍然不会给你一个句柄来挂起'j','k','a'或' b'关闭。我想他宁愿需要像['RFunctor'](http://hackage.haskell.org/package/rmonad-0.8.0.2/docs/Control-RMonad.html)。 –