首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非Contravariant/Contravariant/Divisible/Decidable?的好例子

非Contravariant/Contravariant/Divisible/Decidable?的好例子
EN

Stack Overflow用户
提问于 2019-05-14 11:39:27
回答 1查看 734关注 0票数 10

打字员科代表Haskell生态系统中的标准和基本抽象:

代码语言:javascript
复制
class Contravariant f where
    contramap :: (a -> b) -> f b -> f a

class Contravariant f => Divisible f where
    conquer :: f a
    divide  :: (a -> (b, c)) -> f b -> f c -> f a

class Divisible f => Decidable f where
    lose   :: (a -> Void) -> f a
    choose :: (a -> Either b c) -> f b -> f c -> f a

然而,要理解这些类型分类背后的概念并不那么容易。我认为,如果你能看到一些反例,这将有助于更好地理解这些类型的人。因此,本着https://stackoverflow.com/questions/7220436/good-examples-of-not-a-functor-functor-applicative-monad的精神,我正在寻找满足以下要求的数据类型的对比示例:

  • 不是Contravariant的类型构造函数
  • 一个类型构造函数,它是Contravariant,而不是Divisible
  • 一个类型构造函数,它是Divisible,但不是Decidable
  • 一个类型构造函数,是一个Decidable
EN

回答 1

Stack Overflow用户

发布于 2019-05-14 11:59:17

(部分答覆)

非反差

代码语言:javascript
复制
newtype F a = K (Bool -> a)

不是逆变(然而,它是一个协变函子)。

反变,但不可除

代码语言:javascript
复制
newtype F a = F { runF :: a -> Void }

是反变体,但它不能是Divisible,因为否则

代码语言:javascript
复制
runF (conquer :: F ()) () :: Void

关于“可分但不可分”的注记

我没有一个合理的可分的例子,这是不可分的。我们可以看到,这样的反例必须是这样的,因为它违反了法律,而不仅仅是类型签名。事实上,如果Divisible F坚持,

代码语言:javascript
复制
instance Decidable F where
    lose _ = conquer
    choose _ _ _ = conquer

满足方法的类型签名。

在库中,当Const m是单半群时,我们发现m是可除的。

代码语言:javascript
复制
instance Monoid m => Divisible (Const m) where
  divide _ (Const a) (Const b) = Const (mappend a b)
  conquer = Const mempty

也许这不可能是合法的Decidable?(我不确定,它似乎符合Decidable定律,但库中没有Decidable (Const m)实例。)

判断力

摘自图书馆:

代码语言:javascript
复制
newtype Predicate a = Predicate (a -> Bool)

instance Divisible Predicate where
  divide f (Predicate g) (Predicate h) = Predicate $ \a -> case f a of
    (b, c) -> g b && h c
  conquer = Predicate $ const True

instance Decidable Predicate where
  lose f = Predicate $ \a -> absurd (f a)
  choose f (Predicate g) (Predicate h) = Predicate $ either g h . f
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56129585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档