
Haskellã§æ°ããããŒã¿åãå®çŸ©ããäž»ãªæ¹æ³ã¯ãããŒã¿æ§é ã䜿çšããããšã§ãã ãã ãã newtype
ããããŸãã Haskellãã©ã¯ãã£ã·ã§ããŒã¯çµ¶ããnewtype
ã³ã³ã¹ãã©ã¯ãã䜿çšããŸã;人æ°ã®ããlint linterã¯ãå¯èœã§ããã°data
ãnewtype
ã«çœ®ãæããdata
ãææ¡ããŸãã
ãããããªãã§ããïŒ
æåã¯ãã®èšäºãåå¿è
åãã«èšç»ããŸããã å®éã newtype
ã³ã³ã¹ãã©ã¯ãã¯Haskellãã¥ãŒããªã¢ã«ã®æåã®ç« ã§èšåãããŠããŸãã ããã¯åçŽãªã¢ã€ãã¢ã®ããã§ãïŒããŒã¿åã®è¡šçŸãå¶éããå®è¡é床ãåäžãããŸãã ããŸããŸãªãœãŒã¹ã§ã newtype
ããã€ã³ã¿ãŒã®ãã¹ããä¿åããåç
§ãèŠã€ããããšãã§ããŸãã ããããã³ã³ãã€ã©ã§ãã®æ§é ãå®éã«äœãèµ·ããã®ãããªãããããšãŠãã¯ãŒã«ã§å¿
èŠãªã®ãã«ã€ããŠã®è©³çްãªåæã¯èŠã€ãããŸããã§ããã ãããã®ã®ã£ãããåããããã«ãHabrã«é¢ããèšäºãæžãããšã«ããŸããã
ãã®ããã haskellã¹ã¿ãã¯ãšHaskellããã³GHCã©ã³ã¿ã€ã ã¢ãã«ã®åºæ¬çãªç¥èãå¿
èŠã§ãïŒé
å»¶èšç®ãšã¯äœãããµã³ã¯ïŒèšç®ãããŠããªããªããžã§ã¯ãïŒãGHCã¹ã¿ãã¯ãšããŒãã«ã€ããŠå°ãèããããšããããŸãïŒã
æå³è«
newtype
ã³ã³ã¹ãã©ã¯ãã®æ§æã¯ãããŒã¿ã³ã³ã¹ãã©ã¯ããšãŸã£ããåãã§ãããã ãã newtype
ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãšããã¯ã¹åãããåãã£ãŒã«ãã1ã€ã ãnewtype
ããšãã§ããŸãã
ãšããã§ãããããçš®é¡ã®ã¬ã³ãŒãæ§æãšãã¡ã³ãã ã¿ã€ããæ©èœããŸãã
newtype MyFunnyA abc = MyFunnyA { getA :: a }
ãããã MyValDL
ïŒ MyValDS
ïŒãšMyValN
éãã¯äœã§ããïŒ
Haskell'98ã¬ããŒãã¯ã newtype
ã³ã³ã¹ãã©ã¯ãããæ¢åã®è¡šçŸãšåäžã®è¡šçŸãæã€æ°ããåãå°å
¥ãããšè¿°ã¹ãŠããŸãã ã€ãŸãã Int
ãšMyValN
ååã§ãã ããããããã¯data
åã§ã¯ããã§ã¯ãããŸãããïŒ ããã£ããããã åé¡ã®äºå®ã¯ãHaskellã«ã¯æã¡äžãã£ãã¿ã€ããšæã¡äžãã£ãŠããªãã¿ã€ãããããšããããšã§ãã 远å ã®ããã èŠçŽ ïŒããã ããŸãã¯typesïŒã¯ã data
ã䜿çšããŠå®£èšããããã¹ãŠã®ã¿ã€ãã«è¿œå ããdata
-ãããã¯æµ®ãäžããdata
ïŒããã°ã©ã ã®å Žåãããã ã¯undefined
ïŒã ã€ãŸããã MyValDLC ⥠:: MyValDL
ããšã ⥠:: MyValDL
ãã¯ç°ãªãå€ã§ãã data
ãšã¯ç°ãªãã newtype
åã¯çºçããŸããïŒunliftedåïŒãã€ãŸãã ⥠:: MyValN
å
¥ãåã«ãªã£ãåãã "åå
¥"ãããŸãïŒ MyValN â¥
viaãä»ããŠïŒã
ã³ã³ãã€ã©ãŒã«ãšã£ãŠãéèµ·ããåãšã¯ããã€ã³ã¿ãŒã®äœåãªã¬ã€ã€ãŒãæå³ãããšèšãããšãã§ããŸãïŒãã€ã³ã¿ãŒã¯ãã¹ãããããªããžã§ã¯ãããŸãã¯äžïŒæªå®çŸ©ïŒãåç
§ã§ããŸãïŒã ããã°ã©ããŒã«ãšã£ãŠãããã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®data
ãã£ãŒã«ãã«undefined
ãå«ãŸããå Žåããã¹ãŠã倱ãããããã§ã¯ãªãããšãæå³ããŸãããã®ãã£ãŒã«ãã«è§ŠãããŸã§ãããã°ã©ã ã¯äžæããŸããã äžæ¹ãæªèšç®ãã£ãŒã«ãã¯ã¡ã¢ãªãªãŒã¯ïŒäžé£ã®ãµã³ã¯ïŒã§ããå¯èœæ§ããããŸãã MyValDS
ã¯ããå°ãè€éã§ãMyValDS
ã¯ããã«MyValDSC â¥
ã«èšç®ãããããã§ãããããã2ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã»ãã³ãã£ã¯ã¹ã¯åãã§ãã ã¡ãªã¿ã«ãå°éå®¶ã¯ãããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®ãã£ãŒã«ããå³å¯ã«å®£èšããããšããå§ãããŸãããã ãããã£ãŒã«ããé
å»¶çã«äœ¿çšããå¿
èŠãå®éã«ããå Žåãé€ããŸãã
Haskell wikiã«ã¯ãããŒã¿ãšnewtype
éãã瀺ãçŽ æŽãããäŸããããŸãã ããã§ããããæäŸããç¡æã®ç¿»èš³ãšç§ã®ã¿ã€ãåã«åãããŠèª¿æŽããŸãïŒ
äžèšã®èª¬æã¯ã Haskell wikiã®ç§ã®è§£éã§ãã ããããç§ãã¡ã¯ããã§æ¢ãŸãããããã«ããã€ãã®è³ªåãæ€èšããŸãã
ã©ã®ããã«æ©èœããŸããïŒ
ã³ã³ãã€ã©ãŒã«å
ã®åãšãã®newtype
ã©ãããŒã®åã衚çŸãèŠæ±ãããšããããšã¯ã次ã®ããšãæå³ããŸãã
- åã·ã¹ãã "
data A
"ããã³ " newtype NA = NA
"ã§ã¯ããããã¯ç°ãªãåã§ãã - å®è¡æã«ã¯ãã
NA
ããšã A
ãã®è¡šçŸã¯åãã§ãã
GHCã¯ããç®ã«èŠãããHaskellåã·ã¹ãã ãšä»£è¡šåã®2ã€ã®ã¬ãã«ã§åãåŠçããŸãã ç®ã«èŠããåã·ã¹ãã ã¯ãHaskellã§ããã°ã©ãã³ã°ãããšãã«äœ¿çšãããã®ã§ãã ãã ããããæç¹ã§ãã³ã³ãã€ã©ã¯Haskellåããã·ã³ãã¥ãŒã«å€æããŸãã å€ãã®å ŽåãHaskellã®2ã€ã®ç°ãªãåããã·ã³ã³ãŒãã§åã衚çŸãæã€ããšããããŸãã 仿¥ã®GHCã§ã¯ãããŒã«ã·ã¹ãã ã䜿çšããŠãåãåç®äžã ãã§ãªãããã®è¡šçŸã«åŸã£ãŠæ¯èŒããããšãã§ããŸãã ããã«ããã Data.Type.Coercionããã³Data.Coerceã¢ãžã¥ãŒã«ã«èªç±ãªå倿ã®ã¡ã«ããºã ïŒHasââkellåã·ã¹ãã ã®ã¬ãã«ã§ã®ã¿è¡šç€ºå¯èœïŒãå®è£
ã§ããŸããã
äžèšãèæ
®ãããšã newtype
ãå®è£
ããäžè¬çãªèãæ¹ã¯æããã§ãnewtype
ãã¹ãŠã®ããã¯ãããå€ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒïŒãªããžã§ã¯ãæ
å ±ããŒãã«ïŒãžã®ãã€ã³ã¿ãŒãæã€èª¬æã®åœ¢åŒã§æç€ºãããŸãã ãããã£ãŠã newtype
åã®å€ã¯ããã®èª¬æã§ãã¹ããããå€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãžã®ãã€ã³ã¿ãŒãçŽæ¥äœ¿çšã§ããŸãã type
å矩èªã®ãããªãã®ããããäœãã¬ãã«ã§ã®ã¿å€æããŸãã

ãã¹ãŠã®Haskellããã°ã©ããŒã¯ãGHCããœãŒã¹ã³ãŒããçŽæ¥ã¢ã»ã³ãã©ãŒã«ã³ã³ãã€ã«ããã®ã§ã¯ãªããããã€ãã®æ®µéã§è€éãªäžé£ã®ã³ãŒã倿ãå®è¡ãããã®ã»ãšãã©ãã¹ãŠãæé©åããããšãç¥ã£ãŠããŸãã æåã«ãHaskellæ§æããªãŒã¯ãèšèªã®ç°¡æããŒãžã§ã³ã§ããGHCã³ã¢ïŒFã·ã¹ãã ã«åºã¥ããŠããŸãïŒã«å€æãããŸãã æ¬¡ã«ãCoreã¯æ©èœçãªSTGïŒSpineless Tagless G-machineïŒã«å€æãããæ¬¡ã«åœä»€åC--ïŒäŸå€åŠçãšã¬ããŒãžã³ã¬ã¯ã¿ãŒããµããŒãããç¹å¥ãªäžéèšèªïŒã«å€æãããããããããŸããŸãªæ¹æ³ã§ã¢ã»ã³ãã©ãŒã«å€æãããŸãã
newtype
åã®ã³ã³ã¹ãã©ã¯ã¿ãå®è¡æã«ãæ¶ããããšããã¹ããŒãã¡ã³ãã®ããã§ãã ãããããããã©ã®ããã«èµ·ããããçè§£ããããšã¯éåžžã«é£ããããšã倿ããŸããã GHC Webãµã€ãã§ã®STGã®èª¬æã¯ãSTGã代衚çãªã¿ã€ãã§ã®ã¿åäœããããšãã€ãŸãã newtype
ã¯ãã®åã«å€±ãããªããã°ãªããªãããšãæç¢ºã«ããŠããŸãã å¥ã®GHC wikiããŒãžã§ã¯ ãäžéšã®åã¯åžžã«è¡šç€ºãããäžéšã¯åãã§ãã«ãŒå°çšã§ãïŒåŸè
ã¯ãçæã³ãŒãã®ããŸããŸãªã¬ãã«ã§tcãã¬ãã£ãã¯ã¹ãæã£ãŠããããã§ãïŒã newtype
åã§äœãèµ·ãããã確èªããããã«ã次ã®äŸã䜿çšããŠãã³ã³ãã€ã«ãããã³ãŒãã®ãã¹ãŠã®äžé段éã調ã¹ãããšã«ããŸããã
newtype MyNewtypeStruct = MyNewtypeConstr { unNewtypeStruct :: Int } data MyDataStruct = MyDataConstr { unDataStruct :: Int } ntToD :: MyNewtypeStruct -> MyDataStruct ntToD x = case x of MyNewtypeConstr y -> MyDataConstr y dToNt :: MyDataStruct -> MyNewtypeStruct dToNt x = case x of MyDataConstr y -> MyNewtypeConstr y
çµæã¯ãæåã®æ®µéã§ããã«çŸããŸããã
stack exec ghc-core -- --no-asm Main.hs -fforce-recomp -O0 -fno-enable-rewrite-rules
åãååã®hackageããã±ãŒãžã§å©çšå¯èœãªghc-core
ããã°ã©ã ã¯ãå°ãã¯ãªãŒã³ã¢ãããããGHCã³ã¢ã衚瀺ããŸãã ãã§ã«ãã®æ®µéã§ã MyNewtypeConstr
ãã¹ãŠã®åºçŸã¯cast
æäœã«çœ®ãæãcast
ãŸããã MyDataConstr
æ£çŽã«ãã®ãŸãŸæ®ããŸãã
unNewtypeStruct1_rG2 :: MyNewtypeStruct -> MyNewtypeStruct unNewtypeStruct1_rG2 = \ (ds_dGl :: MyNewtypeStruct) -> ds_dGl unNewtypeStruct :: MyNewtypeStruct -> Int unNewtypeStruct = unNewtypeStruct1_rG2 `cast` (<MyNewtypeStruct>_R -> N:MyNewtypeStruct[0] :: ((MyNewtypeStruct -> MyNewtypeStruct) :: *) ~R# ((MyNewtypeStruct -> Int) :: *)) unDataStruct :: MyDataStruct -> Int unDataStruct = \ (ds_dGj :: MyDataStruct) -> case ds_dGj of _ [Occ=Dead] { MyDataConstr ds1_dGk -> ds1_dGk } ntToD :: MyNewtypeStruct -> MyDataStruct ntToD = MyDataConstr `cast` (Sym N:MyNewtypeStruct[0] -> <MyDataStruct>_R :: ((Int -> MyDataStruct) :: *) ~R# ((MyNewtypeStruct -> MyDataStruct) :: *)) dToNt :: MyDataStruct -> MyNewtypeStruct dToNt = \ (x_awb :: MyDataStruct) -> case x_awb of _ [Occ=Dead] { MyDataConstr y_awc -> y_awc `cast` (Sym N:MyNewtypeStruct[0] :: (Int :: *) ~R# (MyNewtypeStruct :: *))
次ã®ã¹ããŒãžã¯STGã§ãããæ¬¡ã®ã³ãã³ãã§è¡šç€ºã§ããŸãã
stack exec ghc -- Main.hs -fforce-recomp -O0 -fno-enable-rewrite-rules -ddump-stg > Main.stg
è峿·±ã詳现ãé€ããŠãCoreãšããã»ã©å€§ããªéãã¯ãããŸããMain.MyDataConstr
ã¯çæãããã³ãŒãã§æç€ºçã«å®çŸ©ããã Main.MyNewtypeConstr
ã§ãã
Main.MyDataConstr :: GHC.Types.Int -> Main.MyDataStruct [GblId[DataCon], Arity=1, Caf=NoCafRefs, Str=DmdType <L,U>m, Unf=OtherCon []] = \r srt:SRT:[] [eta_B1] Main.MyDataConstr [eta_B1];
ã¬ãã«Main.$tc'MyNewtypeConstr
以éã§ã¯ã Main.$tc'MyNewtypeConstr
ãMain.$tc'MyDataConstr
æ§é ãèŠã€ãããŸããã Main.MyDataConstr
ã¯newtype
ãã¢ãèŠã€ããŸããã ã©ãããã $tc
ïŒã¿ã€ããã§ãã«ãŒãšããèšèããïŒã¯ãã¿ã€ããã§ãã¯ã®ã¬ãã«ã§ã®ã¿äœ¿çšãããã¿ã€ãã®å¥ã®ãã³ãã§ãã
ã芧ã®ãšããããã§ã«GHCã³ã¢å€æã®æ®µéã§ã newtype
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããªããã£ãå倿ã«çœ®ãæããããŠããŸãã Main.unNewtypeStruct_entry()
ã¬ãã«ã§ã¯ãäœã¬ãã«ã®åœä»€ã³ãŒãMain.unNewtypeStruct_entry()
ãšMain.unDataStruct_entry()
ãunNewtypeStruct
ããŠã unNewtypeStruct
ã¯ç°ãªãã unNewtypeStruct
ãäºå®äžäœãããªãããšã確èªunDataStruct
ãŸãã
ãã¹ãŠã®åºåã¬ãã«ã¯ãããã€ãã®ã³ãã³ãã§è¡šç€ºã§ããŸãã
stack exec ghc -- ${filename}.hs -fforce-recomp -O0 -fno-enable-rewrite-rules -fllvm -keep-llvm-files stack exec ghc-core -- --no-asm --no-syntax ${filename}.hs -fforce-recomp -O0 -fno-enable-rewrite-rules > ${filename}.hcr stack exec ghc -- ${filename}.hs -fforce-recomp -O0 -fno-enable-rewrite-rules -ddump-stg > ${filename}.stg stack exec ghc -- ${filename}.hs -fforce-recomp -O0 -fno-enable-rewrite-rules -ddump-opt-cmm > ${filename}.cmm
ç§ããã©ãŒãããããåºåã¯ç«ã®äžã«ãããŸãã å€ããå°ãªããè峿·±ãéšåã ããæ®ããŸããïŒããã¹ããå€ãããŸãïŒã
GHCãã§ãŒãºã¢ãŠã
Main_zdtczqMyNewtypeConstr_closure_struct <{I64 ptrtointïŒI64ã«I8 * @ghczmprim_GHCziTypes_TyCon_static_infoïŒã¯ã远å I64ïŒïŒI64 ptrtointïŒïŒ
ã®Main_zdtrModule_closure_struct * @ Main_zdtrModule_closure $ DEF I64ã«ãI64
Main_zdtcMyNewtypeStruct_closure_struct <{I64 ptrtointïŒI64ã«I8 * @ghczmprim_GHCziTypes_TyCon_static_infoïŒã¯ã远å I64ïŒïŒI64 ptrtointïŒïŒ
ã®Main_zdtrModule_closure_struct * @ Main_zdtrModule_closure $ DEF I64ã«ãI64
Main_zdtczqMyDataConstr_closure_struct <{I64 ptrtointïŒI64ã«I8 * @ghczmprim_GHCziTypes_TyCon_static_infoïŒã¯ã远å I64ïŒïŒI64 ptrtointïŒïŒ
ã®Main_zdtrModule_closure_struct * @ Main_zdtrModule_closure $ DEF I64ã«ãI64
Main_zdtcMyDataStruct_closure_struct <{I64 ptrtointïŒI64ã«I8 * @ghczmprim_GHCziTypes_TyCon_static_infoïŒã¯ã远å I64ïŒïŒI64 ptrtointïŒïŒ
ã®Main_zdtrModule_closure_struct * @ Main_zdtrModule_closure $ DEF I64ã«ãI64
PSïŒãã¡ãããã¿ã€ãnewtype N
èªäœã¯ã³ã³ãã€ã«æã«ã©ãã«ãæ¶ããããšã¯ãããŸãããã³ã³ãã€ã«ãããã¢ãžã¥ãŒã«ã¯ãä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšããããã«æåããšã¯ã¹ããŒãããå¿
èŠããããŸãã ããã«ããã®åã«ãã£ãŠå®è£
ãããã¯ã©ã¹ã®é¢æ°ãžã®ãã€ã³ã¿ãã©ããã«ä¿åããå¿
èŠããããŸãã newtype
ã®æ¬åœã®å©ç¹ã¯ãäœã¬ãã«ã§ã¯ãå¿
èŠãªå€ã«å°éããããã«ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã§ãŒã³ãééããå¿
èŠããªãããšã§ãã
ãªããããå¿
èŠãªã®ã§ããïŒ
åã®æ®µèœã§ãå¯èœãªå Žåã¯ããŒã¿ã®ä»£ããã«newtypeã䜿çšããæ¹ãããçç±ãæé»çã«æ±ºå®ããŸããïŒnewtypeã¯ããé«éã§ã³ã³ãã¯ãã§ãïŒã ããŠãæªè§£æ±ºã®è³ªåïŒãªãnewtypeã䜿çšããã®ã-1ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšãã£ãŒã«ããæã€å-ãã€å
ã®åãŸãã¯åã·ããã ã䜿çšã§ããã®ãïŒ ããã«ã¯å€ãã®çç±ããããŸãã
åæšè«ãçè§£ãããããã
åã®å矩èªã¯åã®æšè«äžã«éåç
§ãããnewtypeã¯åžžã«å¥ã®åã§ãã æ¬¡ã®äŸãèããŠã¿ãŸãããã
newtype Height = Height Double newtype Weight = Weight Double newtype Percent = Percent Double newtype Age = Age Int diseaseRate :: Height -> Weight -> Age -> Percent diseaseRate (Height h) (Weight w) = _ diseaseRate' :: Double -> Double -> Int -> Double diseaseRate' hw = _
ã³ã³ãã€ã©ãŒã®åºåïŒ
Example.hs:19:36: error: ⢠Found hole: _ :: Age -> Percent ⢠... Example.hs:23:20: error: ⢠Found hole: _ :: Int -> Double ⢠...
Int -> Double
ãããInt -> Double
Age -> Percent
å¿
èŠãªæ©èœã®çš®é¡ãçè§£ããæ¹ãã¯ããã«ç°¡åã§ãã æåãªã¬ã³ãºã©ã€ãã©ãªã¯åŒ·åãªããŒã«ã§ãããæªå€¢ã®äžã§ã³ã³ãããŒã¿ã®ã¿ã€ããåæããããšã倢èŠãŸãã
ããã¥ã¡ã³ãã®ãã«ã
éåžžã«åçŽãªçç±ã§ãããäœããã®çç±ã§ãæç§æžããã¥ãŒããªã¢ã«ã§ã¯ã»ãšãã©èšåãããŠããŸããã åã®äŸã§ã¯ã diseaseRate'
颿°ã®åŒæ°ãšããŠèº«é·ãšäœéãæ··åšãããããšã¯éåžžã«ç°¡åã§ãããã³ã³ãã€ã©ã¯ã diseaseRate
颿°ã§ãããè¡ãããšãèš±å¯ããŸããã ãã¡ãããããã¯ããã¥ã¡ã³ãããã£ã³ã»ã«ããŸããããããã«éåžžã«è¯ã远å ã§ãã
颿°ããšã«å€æ°ã®æ°ããåãçæããããªãå Žåã䟿å©ãªãã¯ããã¯ããããŸã-ã¿ã°ä»ãã䜿çšããŸãïŒ
newtype Tagged tag a = Tagged { unTagged :: a }
åæåã§ã¿ã°ä»ããããã GHC.TypeLits
䜿çšGHC.TypeLits
ãŸãã
ãã®ããªãã¯ãåããŠèŠãã®ã¯ãµã€ã¢ã³ãã€ã€ãŒã®è¬çŸ©ã§ããã
å®è£
ã®è©³çްãé ã
é¢å¿ã衚瀺ããããŒã¿åãšããŠFloat
ãŸãã¯Double
ã䜿çšããŠããŸããïŒ ã©ã€ãã©ãªãŠãŒã¶ãŒã¯ãããç¥ããªãããšããããŸãïŒãã©ãããã©ãŒã ã«ãã£ãŠã¿ã€ããç°ãªãå ŽåããããŸãããŸãã¯ãã©ã€ãã©ãªã®æ°ããããŒãžã§ã³ã§å€æŽããå ŽåããããŸãïŒã
æ¢åã®ã¿ã€ãã«æ°ããåäœãå®è£
ãã
æãäžè¬çãªçç±ã æ°ããåãäœæããããšã«ãããããã€ãã®ã¯ã©ã¹ãåå®è£
ã§ããŸãã ããšãã°ãæ°å€ã®åŸã«ãïŒ
ãèšå·ãä»ããŠè¡ã«ããŒã»ã³ããŒãžãåºåãããïŒ
instance Show Percent where show (Percent t) = show t ++ "%"
ããããå®éã«ã¯ãé¢å¿ã远å ããå¢ãããããšæããŸãã ãã¹ãŠã®Num
ã¡ãœãããªã©ããªãŒããŒã©ã€ãããªãã§ãã ããã ãã®ããã®GHCã«ã¯ãæ¡åŒµGeneralizedNewtypeDeriving
ããããŸããããã«ããã newtype
åã®å¹
åºãã¯ã©ã¹ã®å®è£
ãèªç¶ã«æŽŸçãããããšãã§ããŸãã
{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Example where newtype Percent = Percent Double deriving (Eq, Ord, Num, Fractional, Floating, Real, RealFrac, RealFloat) instance Show Percent where show (Percent t) = show t ++ "%" x :: Percent x = 2 + Percent 4
äŸ
ããŸããŸãªçç±ã§newtype
ã䜿çšããäŸã¯ãããããããŸãã ãã¶ãã data
ãããé »ç¹ã«äœ¿çšããdata
ã æåã®äž»ãªäŸã¯ããã¡ããIO
ã§ãã æ¬¡ã®ã³ãã³ããå
¥åããŠ:info IO
ïŒ ghci
ã³ã³ãœãŒã«ã§:info IO
ïŒ
ghci> :info IO newtype IO a = GHC.Types.IO (GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #))
, IO
newtype
+. , ST
newtype ST sa = ST (STRep sa)
.
transformers
newtype RWST rwsma = RWST { runRWST :: r -> s -> m (a, s, w) }
.
: Data.Semigroup Data.Monoid newtype
- . , ( newtype Max a = Max { getMax :: a }
) Ord
, Ord
Bounded
. !