首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用实例

应用实例
EN

Stack Overflow用户
提问于 2019-03-09 09:06:19
回答 1查看 749关注 0票数 5

仍然不能百分之百地理解如何制作更复杂类型的实例。拥有这个:

代码语言:javascript
复制
data CouldBe a = Is a | Lost deriving (Show, Ord) 

创建了一个Functor实例,并以Maybe为例:

代码语言:javascript
复制
instance Functor CouldBe where 
  fmap f (Is x) = Is (f x) 
  fmap f Lost   = Lost 

做了这样的事:

代码语言:javascript
复制
tupleCouldBe :: CouldBe a -> CouldBe b -> CouldBe (a,b)
tupleCouldBe x y = (,) <$> x <*> y

CouldBe需要成为Applicative的一个实例,但是你会怎么做呢?当然,我可以查找并复制它,但我想了解它背后的过程,并最终得到CouldBe的CouldBe声明。

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 22:53:47

使用我的新https://hackage.haskell.org/package/idiomatic包,您可以导出和的Applicative

代码语言:javascript
复制
{-# Language DataKinds                #-}
{-# Language DeriveGeneric            #-}
{-# Language DerivingVia              #-}
{-# Language StandaloneKindSignatures #-}

import Data.Kind
import GHC.Generics
import Generic.Applicative

type CouldBe :: Type -> Type
data CouldBe a = Is a | Lost
  deriving
  stock (Eq, Ord, Show, Generic1)

  -- > pure @CouldBe 10
  -- Is 10
  -- > liftA2 (+) (Is 1) Lost
  -- Lost
  -- > liftA2 (+) Lost (Is 10)
  -- Lost
  deriving (Functor, Applicative)
  via Idiomatically CouldBe '[LeftBias Terminal]

-- > tupleCouldBe Lost Lost
-- Lost
-- > tupleCouldBe (Is 1) Lost
-- Lost
-- > tupleCouldBe Lost (Is 20)
-- Lost
-- > tupleCouldBe (Is 1) (Is 20)
-- Is (1,20)
tupleCouldBe :: CouldBe a -> CouldBe b -> CouldBe (a, b)
tupleCouldBe = liftA2 (,)

为什么要这么做?偏左意味着我们选择Is构造函数作为pure构造函数。

这意味着当提升不同的构造函数时,我们从构造函数中“缺陷”。

Terminal描述了我们如何将任何Applicative转换为Const mempty

代码语言:javascript
复制
data Terminal

instance (Applicative f, Monoid m) => Idiom Terminal f (Const m) where
  idiom :: f ~> Const m
  idiom = mempty

在这种情况下,它放弃了Is映射到Lost的参数。

注意,没有办法定义CouldBe的右偏定义,因为它需要一个应用程序态射,它可以从任何情况下产生一个a

代码语言:javascript
复制
  via Idiomatically CouldBe '[RightBias ..]
代码语言:javascript
复制
  idiom :: Const () ~> Identity
  idiom (Const ()) = Identity ??
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55075707

复制
相关文章

相似问题

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