在这种情况下真的需要 FlexibleContexts 吗?

阿尔贝托·卡皮塔尼

我发布的问题没有意义。

类型签名由 ghci 提供。

我误读了:不是(MonadReader (Map k (Set a -> Set a)) m ;

而是:MonadReader (Map k (Set a -> Set a) m)

这只是一个疏忽。很抱歉浪费您的时间。

========================================

在这种情况下真的需要 FlexibleContexts 吗?

“m”代表哪个单子?

我尝试用 [] 替换“m”,但没有用。

{-# LANGUAGE FlexibleContexts #-}

module LeftCensorsList where

import Data.Set as S
import Data.Map as M
import Data.List as L
import Control.Monad.Reader

-- ============================== FUNCTIONS ==============================

censorsList :: Ord a => Map a (Set a -> Set a) -> [Set a] -> ([Set a], [Set a])
censorsList _ [] = ([],[])
censorsList cnsrmap (xs:xss) = runReader (go xs xss [xs]) cnsrmap
    where
    go _ [] invacc = pure (reverse invacc,[])
    go cnsrs (ys:yss) invacc = do
        ys' <- applyCensors cnsrs ys
        if S.null ys'
          then pure (reverse invacc,ys:yss)
          else go ys' yss (ys': invacc)        

applyCensors :: (MonadReader (Map k (Set a -> Set a)) m, Ord k) => Set k -> Set a -> m (Set a)  -- <<<<<
applyCensors cnsrs xs = go (S.toList cnsrs) xs
    where
    go [] ys = pure ys
    go (cnsr:rest) ys = do
        ys' <- applyCensor cnsr ys    
        if S.null ys'
          then pure S.empty
          else go rest ys'        

applyCensor :: (MonadReader (Map k (t -> t)) m, Ord k) => k -> t -> m t -- <<<<<
applyCensor cnsr xs = do
    cnsrmap <- ask
    case M.lookup cnsr cnsrmap of
        Nothing -> pure xs
        Just f  -> pure $ f xs

-- ============================== TEST ==============================
 
t1,t2,t3, t4 :: ([Set Int],[Set Int])
t1 = censorsList M.empty $ L.map S.fromList [[1,3,13],[2,4,6]]  -- ok
t2 = censorsList exCensorsMap $ L.map S.fromList [[1,3,13],[2,4,6]]  -- ok
t3 = censorsList exCensorsMap []  -- ok
t4 = censorsList exCensorsMap $ L.map S.fromList [[1,4,13],[2,4,5]]  -- ok

-- ============================== EXAMPLES ==============================

-- -------------------- MAPS --------------------

exCensorsMap :: Map Int (Set Int -> Set Int)
exCensorsMap = M.fromList $
    [(1,censor1)
    ,(2,censor2)
    ,(3,censor3)
    ,(4,censor4)
    ]
 
-- -------------------- CENSORS --------------------

censor1, censor2, censor3, censor4 :: Set Int -> Set Int
censor1 = \xs -> xs S.\\ (S.fromList [2,4])
censor2 = \xs -> xs S.\\ (S.fromList [3])
censor3 = \xs -> xs S.\\ (S.fromList [1,2])
censor4 = \xs -> xs S.\\ (S.fromList [2,5])
托马斯·M·杜比森

您正在实例化的 monad 是 reader monad:

applyCensors :: (Ord k) => Set k -> Set a -> Reader (Map k (Set a -> Set a)) (Set a)

您可以通过注意runReader那里的类型和统一来自己推断出这一点

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在这种情况下,我真的需要两张桌子吗?

在这种情况下,我真的需要实现迭代器吗?

在这种情况下,我需要“默认”语句吗?

Go:在这种情况下需要频道吗?

在这种情况下,我真的应该实现IDisposable吗?

在这种情况下,Python 3不需要__init__.py吗?

我需要在这种情况下创建片段吗?

在这种情况下,我需要实施全文搜索吗?备择方案?

在这种情况下可以实现hashCode()方法吗?

在这种情况下可以重写ToString()方法吗

在这种情况下使用 SQL PIVOT 吗?

在这种情况下应该使用cron工作吗?

我可以在这种情况下使用枚举吗?

在这种情况下,数组会取消分配吗?

Swift在这种情况下会复制突变吗?

在这种情况下eval()是邪恶的吗?

在这种情况下我必须删除内存吗?

在这种情况下应避免附着吗?

在这种情况下可以更改图标吗?

在这种情况下可以实现Rest Api吗?

在这种情况下我应该检查指针吗?

FlexibleContexts扩展的优点是什么?您能用一个简单的例子解释一下吗?

什么时候使用await关键字?在这种情况下我需要它吗?

python argparse在这种情况下有解决方案吗?在这种情况下,我们有未知的参数名称,需要将它们与值匹配?

我需要在这种情况下调用ReleaseBuffer吗?

Perl:在这种情况下可以跳过中间哈希变量吗?

在这种情况下,使用片段而不是html字符串有任何优势吗?

使用Storm,在这种情况下锚定元组有显着的好处吗?

优化-在这种情况下,工会是最好的方法吗?