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

标签 haskell functor

我试图定义一个带有两个参数im的类型。我想专门修复这个类型修复 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,但我有一些类约束必须满足类型参数 im 的要求,但事实并非如此可能的。有没有办法改进我的类型定义来解决这个问题?

谢谢。

最佳答案

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

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

不要将约束放在数据类型或实例上,而是将它们放在使用 FuzzySet i m 的函数上,就像您对 add 所做的那样。这样,尽管您可以为某些不符合约束的 x 创建一个 FuzzySet i x ,但您只能使用 FuzzySet i m 其中 m 执行

关于haskell - 修复类型定义以定义 Functor 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945969/

相关文章:

haskell - 即使我的应用程序不访问旧数据,GHC 运行时也会访问旧数据吗?

haskell - 重复追加到字符串haskell

math - Haskell 仿函数隐含定律

Haskell:顺序不敏感的函数式应用程序

serialization - Haskell中未定义长度列表的二进制序列化

haskell - 使用 Data.Tree.Zipper 遍历玫瑰树

c++ - 具有最少复制的正向仿函数

c++ - 运算符作为函数指针

haskell - 在编写我的 fmap 时遇到问题

c++ - 我在哪里可以找到,或者我如何创建一个优雅的 C++ 成员函数模板包装器机制而不需要 resporting to boost?