gpt4 book ai didi

haskell - 如何在 Haskell 98 中为特定类型的应用程序定义实例?

转载 作者:行者123 更新时间:2023-12-04 12:05:32 25 4
gpt4 key购买 nike

我注意到 Data.Set 的测试套件仅真正定义 Arbitrary Set a明智地为a ~ Int , 但要避免 GHC 特殊 ~它用

instance Enum a => Arbitrary (Set a)

我怎样才能确保只有 Arbitrary (Set Int)使用实例而不需要任何 GHC 扩展?在 GHC-only 代码中,我会使用 FlexibleInstancesGADTs然后要么
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com