2016-01-22 144 views
3

我想要定义一个具有两个参数的类型im。我想专门研究这个类型,修复两个固定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型函子,但我有一些类约束必须同时满足这两种类型参数im,但这是不可能的。有没有办法改善我的类型定义以解决这个问题?

谢谢。

+0

这似乎是一个众所周知的问题“为什么Data.Set.Set'不是函子/ monad?”的变体。简短的回答:不幸的是,类型的类约束符合标准的“Functor”。 [索引仿函数](http://stackoverflow.com/questions/27771474/what-is-exactly-an-indexed-functor-in-haskell-and-what-are-its-usages)可以应付它们,我认为。 – chi

+0

我认为索引仿函数可能是一个合适的解决方案,但是我怎样才能使用它们呢?谢谢 – escher

+0

@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)。 –

回答

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执行有用的操作,其中m确实是

相关问题