如何导出类型类?

Mai*_*tor 6 haskell module typeclass

我正在创建一个文件,Common.hs它导出我常用的函数.它还用我喜欢的版本取代了一些Prelude的功能:

-- Common.hs
module Common 
import qualified Prelude as Prelude
import qualified Data.Foldable as Foldable

sum      = Foldable.sum  -- I want to replace Prelude's sum
print    = Prelude.print -- I want to export Prelude's print
type Int = Prelude.Int   -- I want to export Prelude's Int
... etc (huge list) ...
Run Code Online (Sandbox Code Playgroud)

这样,每当我创建一个新的Haskell文件时,我只需要导入Common并编译它-XNoImplicitPrelude:

-- Test.hs
import Common
main = print (sum [1,2,3]) -- will be the `sum` version I want
Run Code Online (Sandbox Code Playgroud)

这种方法似乎有效,但我无法想出如何导出类型类:

-- Test.hs
import Common
import Prelude (Show)

data Foo = Foo Int Int deriving Show

main = print (Foo 1 2)
Run Code Online (Sandbox Code Playgroud)

注意我必须手动导入Prelude的Show.有可能Common.hs出口吗?

Cub*_*bic 10

您必须显式重新导出类型类(这意味着您还必须显式导出其他所有内容),即

你的序曲:

module CustomPrelude (
  sum,
  product,
  Prelude.IO,
  Prelude.String,
  Prelude.print,
  Prelude.Show,
  Prelude.show,
  (Prelude.$),
  Prelude.Int,
  (++)
  )
where

import qualified Prelude
import Data.Foldable
import Data.Monoid

(++) :: Monoid m => m -> m -> m
(++) = mappend
Run Code Online (Sandbox Code Playgroud)

用法:

{-# LANGUAGE NoImplicitPrelude #-}
module PreludeTest where

import CustomPrelude

data A x = A x x

instance Show x => Show (A x) where
    show (A x y) = "A " ++ show x ++ " " ++ show y

main :: IO ()
main = print $ A (1::Int) 2
Run Code Online (Sandbox Code Playgroud)

为了节省一些打字(并在编辑时保持理智),您可能希望这样做:A)将新的前奏分成几个专用文件B)模块导出,这样您就不必明确重复所有内容

例如:

module CustomPrelude.Classes (Show,show,Functor,fmap, Monoid,mempty,mappend, Monad,return,(>>=))
where

import Data.Monoid
Run Code Online (Sandbox Code Playgroud)
module CustomPrelude.Functions (
  module ReExport,
  Prelude.print,
  Prelude.IO, -- ok these technically aren't functions, but I didn't want to make yet another module just for demonstration purposes
  Prelude.String,
  Prelude.Int,
  (Prelude.$),
  (++)
)
where

import qualified Prelude
import Data.Foldable as ReExport
import Data.Traversable as ReExport
import Data.Monoid as ReExport


(++) :: Monoid m => m -> m -> m
(++) = mappend
Run Code Online (Sandbox Code Playgroud)
module CustomPrelude (
  module P
  )
where

import CustomPrelude.Classes as P
import CustomPrelude.Functions as P
Run Code Online (Sandbox Code Playgroud)

请注意,通过在导入时将重新导出的模块重命名为相同的名称,可以节省大量的打字工作.

  • 因为你可以导出一个完整的`模块`,你可以将你的`Common`分成两个部分(一个用你的方法导出所有东西然后一个*包裹*围绕它将导出你想要的类和完整的*内部*模块也是 (4认同)
  • @Carsten我目前正在编写这种效果的编辑. (3认同)
  • 注意`模块Common(模块Common)where ...`是完全有效的,并且意味着与`module Common where ...`相同.因此,通过编写`模块Common(模块Common,Show(..))来导出所有内容+`Show`将非常容易. (3认同)