作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到 Data.Set
的测试套件仅真正定义 Arbitrary Set a
明智地为a ~ Int
, 但要避免 GHC 特殊 ~
它用
instance Enum a => Arbitrary (Set a)
Arbitrary (Set Int)
使用实例而不需要任何 GHC 扩展?在 GHC-only 代码中,我会使用
FlexibleInstances
或
GADTs
然后要么
instance Arbitrary (Set Int)
instance a ~ Int => Arbitrary (Set a)
最佳答案
这可以使用我认为我第一次在 Oleg Kiselyov 的一篇论文中遇到的一个想法,它是 Control.Lens.Equality
的基础。 .
import Data.Functor.Identity
class IsInt a where
fromIntF :: f Int -> f a
instance IsInt Int where
fromIntF fx = fx
toIntF :: IsInt a => g a -> g Int
toIntF = unf . fromIntF . F $ id
newtype F g a b = F {unf :: g b -> a}
fromInt :: IsInt a => Int -> a
fromInt = runIdentity . fromIntF . Identity
toInt :: IsInt a => a -> Int
toInt = runIdentity . toIntF . Identity
instance IsInt a => Arbitrary (Set a)
Int
.为方便起见,我可以限制
IsInt
我需要的任何类(class)的类(class)
Int
是一个实例:
class (Show a, Read a, Integral a, Arbitrary a) => IsInt a where ...
关于haskell - 如何在 Haskell 98 中为特定类型的应用程序定义实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795706/
我是一名优秀的程序员,十分优秀!