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)
请注意,通过在导入时将重新导出的模块重命名为相同的名称,可以节省大量的打字工作.
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |