首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建具有Contravariant、Divisible和Decidable的ADT实例

创建具有Contravariant、Divisible和Decidable的ADT实例
EN

Stack Overflow用户
提问于 2017-08-28 21:48:08
回答 1查看 76关注 0票数 1

我正在尝试为Grouping1创建一个实例

代码语言:javascript
复制
import Data.Discrimination
import Data.Discrimination.Grouping (hashing)
import Data.Text (Text)
import Data.Vector (Vector)
import GHC.Generics
import GHC.Exts (toList, fromList)
import qualified Data.HashMap.Lazy as HashMap

data JSONPrimitive = JString | JNumber | JBool | JNull deriving (Show, Eq, Generic, Hashable, Grouping)
data JSONTypeF a =
    JObject (HashMap.HashMap Text a)
  | JArray (Maybe a)
  | JInvalidArray (Vector a)
  | JPrimitive JSONPrimitive
  deriving (Show, Eq, Functor, Generic)

instance (Grouping a, Eq a, Hashable a) => Grouping1 (HashMap.HashMap a) where
  grouping1 g = contramap toList $ grouping1 (divide id grouping g)
instance Grouping1 Vector where
  grouping1 g = contramap toList (grouping1 g)
instance Grouping Text where
  grouping = hashing

但是,我不确定如何定义JSONTypeF ADT的实例Grouping1 JSONTypeF

代码语言:javascript
复制
instance Grouping1 JSONTypeF where
  grouping1 g = contramap fun _
    where
      fun (JObject map) = undefined
      fun (JArray ary) = undefined
      fun (JInvalidArray ary) = undefined
      fun (JPrimitive primitive) = undefined
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 01:01:44

我用很难的方式做了,没有任何实例,尽管choose的一些嵌套可能会使它成为可能。

代码语言:javascript
复制
instance Grouping1 JSONTypeF where
  grouping1 g = Group $ \k -> do
    kb <- flip getGroup
    kc <- flip getGroup
    kd <- flip getGroup
    ke <- flip getGroup
    pure (\obj ->
            case obj of
              (JObject map) -> kb map
              (JArray ary) -> kc ary
              (JInvalidArray ary) -> kd ary
              (JPrimitive primitive) -> ke primitive
            ) k
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45920612

复制
相关文章

相似问题

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