作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天我想研究是否有可能以这种方式构造一个数据类型,它不存储其类型签名的类型的数据,而是存储它的另一种表示。所以,这是我尝试使用类型构造函数为 a
的 GADT。 , 但类型为 ByteString
的数据构造函数.
{-# LANGUAGE GADTs #-}
import Data.ByteString.Char8
import Data.Serialize
data Serialized a where
MkSerialized :: (Serialize a) => ByteString -> Serialized a
decode'
通过以下方式发挥作用:
decode' :: (Serialize a) => Serialized a -> a
decode' (MkSerialized bs) = let Right r = (decode bs) in r
let s = MkSerialized (encode "test") :: Serialized String
print $ decode' s -- prints "test"
Serialized
成为
Functor
的一个实例.
instance Functor Serialized where
fmap f (MkSerialized bs) = MkSerialized (encode (f (right (decode bs))))
where right (Right r) = r
Serialize
在
fmap
中强制执行?
最佳答案
您可以使用 CoYoneda 仿函数来做到这一点。
这个想法很简单:有一个额外的功能领域,你可以在其中积累 fmap
荷兰国际集团的功能。当您解码您的值时,然后应用该功能。
这是代码:
{-# LANGUAGE GADTs #-}
import Data.ByteString.Char8
import Data.Serialize
data Serialized a where
MkSerialized
:: (Serialize a)
=> ByteString -> (a -> b) -> Serialized b
decode' :: Serialized a -> a
decode' (MkSerialized bs f) = let Right r = decode bs in f r
instance Functor Serialized where
fmap f (MkSerialized bs g) = MkSerialized bs (f . g)
fmap
的好处。 s 而不是重复的解码和编码,就像你的情况一样。
关于haskell - 具有类型约束的 GADT 的仿函数实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157579/
我是一名优秀的程序员,十分优秀!