仍然不能百分之百地理解如何制作更复杂类型的实例。拥有这个:
data CouldBe a = Is a | Lost deriving (Show, Ord) 创建了一个Functor实例,并以Maybe为例:
instance Functor CouldBe where
fmap f (Is x) = Is (f x)
fmap f Lost = Lost 做了这样的事:
tupleCouldBe :: CouldBe a -> CouldBe b -> CouldBe (a,b)
tupleCouldBe x y = (,) <$> x <*> yCouldBe需要成为Applicative的一个实例,但是你会怎么做呢?当然,我可以查找并复制它,但我想了解它背后的过程,并最终得到CouldBe的CouldBe声明。
发布于 2022-04-25 22:53:47
使用我的新https://hackage.haskell.org/package/idiomatic包,您可以导出和的Applicative。
{-# 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
data Terminal
instance (Applicative f, Monoid m) => Idiom Terminal f (Const m) where
idiom :: f ~> Const m
idiom = mempty在这种情况下,它放弃了Is映射到Lost的参数。
注意,没有办法定义CouldBe的右偏定义,因为它需要一个应用程序态射,它可以从任何情况下产生一个a。
via Idiomatically CouldBe '[RightBias ..] idiom :: Const () ~> Identity
idiom (Const ()) = Identity ??https://stackoverflow.com/questions/55075707
复制相似问题