如何仅导入 haskell 中的特定实例
How to import just specific instances in haskell
我面临以下问题:我在一个模块中定义了 class 类型的多个实例,但不想导出所有实例。我该怎么做?
module SomeModule
( calculate
)
where
class Something a where
calculate :: a -> Int
instance Something Double where
calculate x = calculate $ roundToInt x
instance Something Int where
calculate x = doSomething x
roundToInt :: Double -> Int
roundToInt = round
doSomething :: Int -> Int
doSomething _ = 42
在这个(简化的)示例中,我有两个 class Something
类型的实例,它们相互依赖,但我只想导出 Double
s 的实例而不是 Int
s。但在我的示例中,两个实例都被隐式导出。有解决办法吗?
您可以将要隐藏的实例放在未导出的 newtype
上。
module SomeModule (calculate) where
newtype NotInt = NotInt Int
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculate (NotInt (round x))
instance Something NotInt where calculate _ = 42
如果有很多您不想导出的实例,参数化的新类型可能会减少样板文件。
{-# LANGUAGE FlexibleInstances #-}
module SomeModule (calculate) where
newtype Hidden a = Hidden a
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculate (Hidden (round x :: Int))
instance Something (Hidden Int) where calculate _ = 42
另一种选择是不首先定义实例,而只是使用与 class 的方法名称不同的名称来实现您关心的其他方法。
module SomeModule (calculate) where
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculateInt (round x)
calculateInt :: Int -> Int
calculateInt _ = 42
我面临以下问题:我在一个模块中定义了 class 类型的多个实例,但不想导出所有实例。我该怎么做?
module SomeModule
( calculate
)
where
class Something a where
calculate :: a -> Int
instance Something Double where
calculate x = calculate $ roundToInt x
instance Something Int where
calculate x = doSomething x
roundToInt :: Double -> Int
roundToInt = round
doSomething :: Int -> Int
doSomething _ = 42
在这个(简化的)示例中,我有两个 class Something
类型的实例,它们相互依赖,但我只想导出 Double
s 的实例而不是 Int
s。但在我的示例中,两个实例都被隐式导出。有解决办法吗?
您可以将要隐藏的实例放在未导出的 newtype
上。
module SomeModule (calculate) where
newtype NotInt = NotInt Int
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculate (NotInt (round x))
instance Something NotInt where calculate _ = 42
如果有很多您不想导出的实例,参数化的新类型可能会减少样板文件。
{-# LANGUAGE FlexibleInstances #-}
module SomeModule (calculate) where
newtype Hidden a = Hidden a
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculate (Hidden (round x :: Int))
instance Something (Hidden Int) where calculate _ = 42
另一种选择是不首先定义实例,而只是使用与 class 的方法名称不同的名称来实现您关心的其他方法。
module SomeModule (calculate) where
class Something a where calculate :: a -> Int
instance Something Double where calculate x = calculateInt (round x)
calculateInt :: Int -> Int
calculateInt _ = 42