当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Haskell98中为特定类型的应用程序定义实例?》经验,为你挑选了1个好方法。



1> dfeuer..:

这可以使用我认为我在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使用我需要的任何类来限制类,这Int是一个实例:

class (Show a, Read a, Integral a, Arbitrary a) => IsInt a where ...


值得一提的是:这为您提供了系统外的保证,但不在其中.也就是说,GHC不会从'IsInt a'推断出'a~Int`.这有时可能需要恼人的附加类型注释.但我不认为纯粹在H98(或H2010)中可以帮助它.
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有