Haskell 没有其他限制性更小的方法。我按照Wall的错误消息集成了代码。因此,在分数双精度的定义中,“并非双精度的所有元素都有乘法逆”,这一事实启发了我。考虑到关系的标识只有一个形式函数,我假设在必要时可以使用“未定义”来解决与IDRM相关的问题,因此我完成了这个意

Haskell 没有其他限制性更小的方法。我按照Wall的错误消息集成了代码。因此,在分数双精度的定义中,“并非双精度的所有元素都有乘法逆”,这一事实启发了我。考虑到关系的标识只有一个形式函数,我假设在必要时可以使用“未定义”来解决与IDRM相关的问题,因此我完成了这个意,haskell,category-abstractions,Haskell,Category Abstractions,没有其他限制性更小的方法。我按照Wall的错误消息集成了代码。因此,在分数双精度的定义中,“并非双精度的所有元素都有乘法逆”,这一事实启发了我。考虑到关系的标识只有一个形式函数,我假设在必要时可以使用“未定义”来解决与IDRM相关的问题,因此我完成了这个意义上的代码。由于“墙”不再产生错误消息,是否可以制定一个比您建议的更简单、限制更少的折叠约束实例?Double有理由需要与兼容。通常不赞成使用未定义或错误来满足类型类的要求fmap产生异常将非常令人惊讶。如果我的解决方案太复杂,那么通过查看您的


没有其他限制性更小的方法。我按照Wall的错误消息集成了代码。因此,在分数双精度的定义中,“并非双精度的所有元素都有乘法逆”,这一事实启发了我。考虑到关系的标识只有一个形式函数,我假设在必要时可以使用“未定义”来解决与IDRM相关的问题,因此我完成了这个意义上的代码。由于“墙”不再产生错误消息,是否可以制定一个比您建议的更简单、限制更少的折叠约束实例?
Double
有理由需要与兼容。通常不赞成使用
未定义
错误
来满足类型类的要求<代码>fmap产生异常将非常令人惊讶。如果我的解决方案太复杂,那么通过查看您的关系需要什么来简化。如果您不需要类别界面,那么您可以删除
Identity
/
Inf
,只需使用
Map a(Set b)
表示。如果您不需要枚举输入(例如,对于
可折叠的
),请删除
映射a(集合b)
表示,只需使用
a->集合b
。在
枚举
有界的
:这看起来非常适合(cc@AlbertoCapitani)@duplode有点离题了:数据宇宙是哥德尔编号系统的一个版本吗?
{-# LANGUAGE OverloadedLists, GADTs, TypeFamilies, ConstraintKinds, 
FlexibleInstances, MultiParamTypeClasses, StandaloneDeriving, TypeApplications #-}

import Prelude ()

import Control.Category.Constrained.Prelude
import qualified Control.Category.Hask as Hask
-- import Data.Constraint.Trivial
import Data.Foldable.Constrained
import Data.Map as M
import Data.Set as S
import qualified Data.Foldable as FL

main :: IO ()
main = print $ fmap (constrained @Ord (+1))
             $ RMS ([(1,[11,21]),(2,[31,41])])

data RelationMS a b where
  IdRMS :: RelationMS a a
  RMS :: Map a (Set b) -> RelationMS a b 
deriving instance (Show a, Show b) => Show (RelationMS a b)

instance Category RelationMS where
    type Object RelationMS o = Ord o
    id = IdRMS
    RMS mp2 . RMS mp1
      | M.null mp2 || M.null mp1 = RMS M.empty
      | otherwise = RMS $ M.foldrWithKey 
            (\k s acc -> M.insert k (S.foldr (\x acc2 -> case M.lookup x mp2 of
                                                        Nothing -> acc2
                                                        Just s2 -> S.union s2 acc2
                                             ) S.empty s
                                    ) acc
            ) M.empty mp1

(°) :: (Object k a, Object k b, Object k c, Category k) => k a b -> k b c -> k a c
r1 ° r2 = r2 . r1

instance (Ord a, Ord b) => Semigroup (RelationMS a b) where
    RMS r1 <> RMS r2 = RMS $ M.foldrWithKey (\k s acc -> M.insertWith S.union k s acc) r1  r2 

instance (Ord a, Ord b) => Monoid (RelationMS a b) where
    mempty = RMS M.empty
    mappend = (<>)

instance Functor (RelationMS a) (ConstrainedCategory (->) Ord) Hask where
    fmap (ConstrainedMorphism f) = ConstrainedMorphism $
            \(RMS r) -> RMS $ M.map (S.map f) r


fldl :: (a -> Set b -> a) -> a -> RelationMS k b -> a
fldl f acc (RMS r) = M.foldl f acc r

fldMp :: Monoid b1 => (Set b2 -> b1) -> RelationMS k b2 -> b1
fldMp m (RMS r) = M.foldr (mappend . m) mempty r


-- instance Foldable (RelationMS a) (ConstrainedCategory (->) Ord) Hask where
    -- foldMap f (RMS r)
        -- | M.null r = mempty
        -- | otherwise = FL.foldMap f r
    -- ffoldl f = uncurry $ M.foldl (curry f)