ããã¯ãããã°ã©ãã·ãªãŒãºã®ã«ããŽãªçè«ã®6çªç®ã®èšäºã§ãã 以åã®èšäºã¯ãã§ã«Habréã§å
¬éãããŠããŸãã0.ããã°ã©ããŒã®ã«ããŽãªãŒçè«ïŒåºæ1.ã«ããŽãªïŒæ§æã®æ¬è³ª2.ã¿ã€ããšæ©èœ3.倧å°ã®ã«ããŽãª4.ã¯ã¬ã€ãºãªãŒã®ã«ããŽãªãŒ5.äœåãšå¯ç£ç©åã®èšäºã§ã¯ãåã®åºæ¬æäœã§ãã補åãšé£ç£åãèæ
®ãããŸããã ããã§ããããã®ã¡ã«ããºã ã®çµã¿åããã«ãããæ¥åžžã®ããŒã¿æ§é ã®å€ããæ§ç¯ã§ããããšã瀺ããŸãã ãã®ãããªæ§é ã¯ãéèŠãªå¿çšäŸ¡å€ããããŸãã ããšãã°ãåºæ¬ããŒã¿åã®åçæ§ããã§ãã¯ã§ãã補åãšé£ç£åã®åçæ§ãã³ã³ããŒãã³ãã®åçæ§ã«æžããæ¹æ³ãç¥ã£ãŠããå Žåãè€ååã®åçæ§æŒç®åã¯èªåçã«å°åºã§ããŸãã Haskellã§ã¯ãè€ååã®åºç¯ãªãµãã»ãããç䟡æŒç®åãšæ¯èŒæŒç®åãæååãšã®å€æãããã³ä»ã®å€ãã®æäœãèªåçã«è¡šç€ºãããŸãã
ããã°ã©ãã³ã°ã«ããã補åãšåå¯ç£ç©ã®å Žæãããè©³çŽ°ã«æ€èšããŠã¿ãŸãããã
補åã®çš®é¡
ããã°ã©ãã³ã°èšèªã§ã®åã®ç©ã®æšæºçãªå®è£
ã¯ããã€ããããŸãã Haskellã§ã¯ãã«ããã«ã¯ããªããã£ãåã®ã³ã³ã¹ãã©ã¯ã¿ã§ãããC ++ã§ã¯ãæšæºã©ã€ãã©ãªã®æ¯èŒçè€éãªãã³ãã¬ãŒãã§ãã

å³å¯ã«èšãã°ãåã®ç©ã¯å¯æã§ã¯ãããŸãããåãããŒã¿ãå«ãŸããŠããŠã
(Bool, Int)
代ããã«å
(Int, Bool)
ãã¢ã眮ãæããããšã¯ã§ããŸããã ãã ããç©ã¯ã
swap
颿°ã«ãã£ãŠå®çŸ©ãããååãŸã§å¯æã§ãããããèªäœãšéã§ãã
swap :: (a, b) -> (b, a) swap (x, y) = (y, x)
ãã®ãããªãã¢ã¯ãããã°ãšã³ãã£ã¢ã³ããªãã«ãšã³ãã£ã¢ã³ãªã©ãåãæ
å ±ãä¿åããããã®ç°ãªã圢åŒãšèããããšãã§ããŸãã
ãããã¢ãå¥ã®ãã¢ã«æè³ããããšã«ããã奜ããªã ãã¿ã€ããçµã¿åãããããšãã§ããŸãã ãã¹ãããããã¢ãã¿ãã«ãšåçã§ããããšã«æ°ä»ããšãåãããšãç°¡åã«åŸãããŸãã ããã¯ããã¢ã®ç°ãªãåã蟌ã¿é åºãäºãã«ååã§ãããšããäºå®ã®çµæã§ãã ïŒæå®ã®é åºã§ïŒ3ã€ã®ã¿ã€ã
a
ã
b
ã
c
ç©ã«çµåãã2ã€ã®å¯èœãªæ¹æ³ããããŸãã ããªãã¡
((a, b), c)
ãŸãã¯
(a, (b, c))
ãããã®åã¯ãæåã®åã®åŒæ°ãäºæãã颿°ã«2çªç®ã®åã®åŒæ°ãæž¡ãããšãã§ããªããšããæå³ã§ç°ãªããŸãããåã®å€ã¯1察1ã§å¯Ÿå¿ããŠããŸãã ãã®è¡šç€ºãäžæ¹åã«èšå®ãã颿°ã¯æ¬¡ã®ãšããã§ãã
alpha :: ((a, b), c) -> (a, (b, c)) alpha ((x, y), z) = (x, (y, z))
ãããŠãããã¯ãã®éã§ãïŒ
alpha_inv :: (a, (b, c)) -> ((a, b), c) alpha_inv (x, (y, z)) = ((x, y), z)
ãããã£ãŠãåååããããŸãã ãããã¯ãåãããŒã¿ãåããã±ãŒãžåããç°ãªãæ¹æ³ã§ãã
åã®ç©ãäºé
æŒç®ãšããŠèãããšãäžèšã®ååã¯ã¢ãã€ãã®é£æ³æ³åã«éåžžã«äŒŒãŠããããšãããããŸãã
(a * b) * c = a * (b * c)
å¯äžã®éãã¯ãã¢ãã€ãã§ã¯äž¡æ¹ã®ç©ãå®å
šã«åäžã§ãããåã«ã€ããŠã¯ååãŸã§çããããšã§ãã
ãã®éããéèŠã§ãªããšèãããšãã¢ãã€ããšã®é¡æšãããã«æ¡åŒµããsingleton
()
ãåã®ä¹ç®ã«é¢ããŠäžç«èŠçŽ ã§ããããšã瀺ãããšãã§ããŸãã1ãæ°å€ã®ä¹ç®ã«é¢ããŠäžç«ã§ããããã«ã å®éãã¿ã€ã
a
èŠçŽ ã«
()
ãä»å ããŠããæ
å ±ã¯è¿œå ãããŸããã çš®é¡
(a, ())
a
ãšååã§ãååã¯é¢æ°ã«ãã£ãŠäžããããŸã
rho :: (a, ()) -> a rho (x, ()) = x
rho_inv :: a -> (a, ()) rho_inv x = (x, ())
ç§ãã¡ã®èгå¯ã¯ãéå
Setã®ã«ããŽãªã
ã¢ãã€ãã§ãã ãã€ãŸããªããžã§ã¯ãã®ä¹ç®ïŒãã®å Žåã¯ãã«ã«ãç©ïŒã«é¢ããŠã¢ãã€ãã§ãããšããã¹ããŒãã¡ã³ããšããŠåœ¢åŒåã§ããŸãã å³å¯ãªå®çŸ©ã以äžã«ç€ºããŸãã
Haskellã«ã¯äœåãå®çŸ©ããããäžè¬çãªæ¹æ³ããããŸããç¹ã«äŸ¿å©ãªã®ã¯ãããããã¿ã€ãã®åèšãšçµã¿åãããããšããã«ãããããã§ãã ããã€ãã®åŒæ°ãæã€ååä»ãã³ã³ã¹ãã©ã¯ã¿ã䜿çšããŸãã ããšãã°ããã¢ã®ä»£æ¿å®çŸ©ã¯æ¬¡ã®ããã«ãªããŸãã
data Pair ab = P ab
ããã§ã
Pair ab
ã¯ä»ã®2ã€ã®å
a
ããã³
b
ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããåã³ã³ã¹ãã©ã¯ã¿ãŒã®ååã§ããã
P
ã¯ããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒã®ååã§ãã
Pair
åã³ã³ã¹ãã©ã¯ã¿ãŒã«2ã€ã®åãæž¡ãããšã§ç¹å®ã®åãå®çŸ©ãã察å¿ããåä»ãã®å€ã
P
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšã§ãã®åã®ãã¢ãäœæããŸãã ããšãã°ã
stmt
ã
String
ãš
Bool
ãã¢ãšããŠå®çŸ©ããŸãã
stmt :: Pair String Bool stmt = P "This statement is" False
æåã®è¡ã¯å宣èšã§ãã
a
ãš
b
代ããã«
String
ãš
Bool
æã€
Pair
åã³ã³ã¹ãã©ã¯ã¿ãŒã§æ§æãããŸãã 2è¡ç®ã¯ãããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒ
P
ãç¹å®ã®è¡ãšè«çå€ã«é©çšããããšã«ãã£ãŠååŸããã倿°ã®å€ãå®çŸ©ããŸãã ç¹°ãè¿ããŸãããåã³ã³ã¹ãã©ã¯ã¿ã¯åã®æ§ç¯ã«äœ¿çšãããããŒã¿ã³ã³ã¹ãã©ã¯ã¿ã¯å€ã®æ§ç¯ã«äœ¿çšãããŸãã
Haskellã®åãšããŒã¿ã®åå空éã¯éè€ããªããããå€ãã®å Žåãäž¡æ¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«åãååã䜿çšãããŸãã äŸãã°
data Pair ab = Pair ab
Leninist squintã®ãã¢ã®çµã¿èŸŒã¿åãèŠããšãå®éã«ã¯æåŸã®å®£èšã®ãããã¯ã®ããªãšãŒã·ã§ã³ã§ããããšãèªèããã
Pair
ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¿ãäºé
æŒç®å
(,)
眮ãæããããŸãã ãã¬ãã£ãã¯ã¹è¡šèšã§ã¯ãä»ã®ååä»ãã³ã³ã¹ãã©ã¯ã¿ãŒãšåæ§ã«
(,)
ã䜿çšã§ããŸãã
stmt = (,) "This statement is" False
åæ§ã«ã
(,,)
ããªãã«ãªã©ãæ§æããŸãã
ãžã§ããªãã¯ãã¢ãŸãã¯ã¿ãã«ã䜿çšãã代ããã«ãç¹å®ã®ã¿ã€ãã®è£œåã«åå¥ã®ååãå
¥åã§ããŸãã äŸãã°
data Stmt = Stmt String Bool
String
ãš
Bool
補åã§ãããç¬èªã®ååãšã³ã³ã¹ãã©ã¯ã¿ãŒããããŸãã ãã®å®çŸ©ã®å©ç¹ã¯ãåãã³ã³ãã³ãã§å€ãã®åãæã€ããšãã§ããŸãããã»ãã³ãã£ã¯ã¹ãšæ©èœãç°ãªããããåã·ã¹ãã ã§ã¯çžäºã«æ··åã§ããªãããšã§ãã
ã¿ãã«ãšè€æ°åŒæ°ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããã°ã©ãã³ã°ã¯ãæ··ä¹±ãšãšã©ãŒã«ã€ãªããããšããããããŸããããã¯ãã©ã®ã³ã³ããŒãã³ããäœã«å¯ŸããŠè²¬ä»»ãããã®ãââã远跡ããå¿
èŠãããããã§ãã ã³ã³ããŒãã³ãã«é©åãªååãä»ããããšãã§ããã°ããè¯ãã§ãããã ååä»ããã£ãŒã«ããæã€åã®ç©ã¯HaskellãšåŒã°ããCã§ã¯
struct
ã§ãã
æçš¿
ç°¡åãªäŸãèããŠã¿ãŸãããã ååŠèŠçŽ ã¯ã2ã€ã®è¡ïŒã©ãã³èªåãšèšå·ïŒãšåå質éã«å¯Ÿå¿ããæŽæ°ã§æ§æãããåäžã®æ§é ãšããŠèª¬æããŸãã ãããè¡ãã«ã¯ãã¿ãã«
(String, String, Int)
ã䜿çšããã©ã®ã³ã³ããŒãã³ããäœãæ
åœããããåžžã«å¿µé ã«çœ®ãããšãã§ããŸãã ã¿ãã«ããã³ã³ããŒãã³ããæœåºããã«ã¯ããã¿ãŒã³ãããã³ã°ã䜿çšããŸãã æ¬¡ã®é¢æ°ã¯ãååŠå
çŽ ã®èšå·ãã©ãã³åã®æ¥é èŸã§ãããã©ããããã§ãã¯ããŸãïŒããšãã°ã
Heã¯æ¥é èŸã®
ããªãŠã ã§ã ïŒïŒ
startsWithSymbol :: (String, String, Int) -> Bool startsWithSymbol (name, symbol, _) = isPrefixOf symbol name
ãã®ã³ãŒãã¯ééããç¯ãããããèªã¿åããä¿å®ãå°é£ã§ãã ã¿ãã«ã®ä»£ããã«ã¬ã³ãŒããå®çŸ©ããæ¹ãã¯ããã«è¯ãã§ãïŒ
data Element = Element { name :: String , symbol :: String , atomicNumber :: Int }
ãããã®è¡šçŸã¯ååã§ãããæ¬¡ã®çžäºé倿ã䜿çšããŠæ€èšŒã§ããŸãã
tupleToElem :: (String, String, Int) -> Element tupleToElem (n, s, a) = Element { name = n , symbol = s , atomicNumber = a }
elemToTuple :: Element -> (String, String, Int) elemToTuple e = (name e, symbol e, atomicNumber e)
ã¬ã³ãŒããã£ãŒã«ãåãã¢ã¯ã»ãµé¢æ°ã§ããããšã«æ³šæããŠãã ããã ããšãã°ã
atomicNumber e
ã¯ãã¬ã³ãŒã
e
atomicNumber
ãã£ãŒã«ããè¿ããŸãã ãããã£ãŠã
atomicNumber
颿°ã®ã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
atomicNumber :: Element -> Int
Element
åã®ãšã³ããªã䜿çšãããšã
startsWithSymbol
颿°ãããèªã¿ããããªããŸãã
startsWithSymbol :: Element -> Bool startsWithSymbol e = isPrefixOf (symbol e) (name e)
Haskellã§ã¯ã
isPrefixOf
颿°ãäžçœ®æŒç®åã«å€ããéã¢ãã¹ãããã£ã§ãã©ãã·ã¥ããããªãã¯ãå®è¡ã§ããŸãã ããã«ãããã³ãŒããèªã¿ããããªããŸãã
startsWithSymbol e = symbol e `isPrefixOf` name e
äžçœ®æŒç®åã®åªå
床ã¯é¢æ°åŒã³åºãã®åªå
床ãããäœããããæ¬åŒ§ãçç¥ã§ããŸããã
ã¿ã€ãã®åèš
ã»ããã®ã«ããŽãªå
ã®è£œåãã¿ã€ãã®è£œåãèªå°ããæ¹æ³ãšåæ§ã«ãcoproductã¯ã¿ã€ãã®åèšãçæããŸãã Haskellã®åã®åèšã®æšæºçãªå®è£
ã¯æ¬¡ã®ãšããã§ãã
data Either ab = Left a | Right b
ãã¢ãšåæ§ã«ã
Either
坿ïŒååãŸã§ïŒã§ãã¹ãã§ããåã蟌ã¿ã®é åºã¯éèŠã§ã¯ãããŸããïŒååãŸã§ïŒã ããšãã°ã3ã€ã®ã¿ã€ãã®åèšã¯æ¬¡ã®ããã«ãªããŸãã
data OneOfThree abc = Sinistral a | Medial b | Dextral c
Setã¯ãå°äœæŒç®æäœã«é¢ããŠïŒå¯Ÿç§°ïŒã¢ãã€ãã«ã«ããŽãªã圢æããããšãããããŸãã äºé
æŒç®ã®å Žæã¯äºãã«çŽ ãªåã§å ããããäžç«èŠçŽ ãåæãªããžã§ã¯ãã§ãã ã¿ã€ãã«é¢ããŠã
Either
ã¯ã¢ãã€ãã®æäœã§ãããç¡äººã¿ã€ã
Void
ã¯äžç«çãªèŠçŽ ã§ãã
Either
ãå ç®ã§ã
Void
ããŒãã§ãããšä»®å®ããŸãã å®éãåã®åèšã«
Void
ã远å ããŠããåã®å€ã®ã»ããã¯å€æŽãããŸããã äŸãã°
Either a Void
a
åå å®éã
Void
ã¿ã€ãã«ã¯å€ãèšå®ãããŠããªãããã
Right
å€ãäœæããæ¹æ³ã¯ãããŸããã ãããã£ãŠã
Either a Void
äœæ°ã¯
Left
å€ã®ã¿ã§ãããã¯å
a
å€ã®åãªãã©ãããŒã§ãã 象城çã«ãããã¯
a + 0 = a
ãšæžãããšãã§ããŸãã
Haskellã§ã¯ãåã®åèšã¯éåžžã«äžè¬çã§ãã C ++ã§ã¯ããããã®é¡äŒŒäœïŒã¢ãœã·ãšãŒã·ã§ã³ãŸãã¯ããªã¢ã³ãïŒã¯ãããã€ãã®çç±ã§äœ¿çšãããé »åºŠãã¯ããã«å°ãªããªããŸãã
ãŸããæãåçŽãªåã®åèšã¯
enum
ã䜿çšããŠC ++ã§å®è£
ããã
enum
ã§ãã åçã®
data Color = Red | Green | Blue
C ++ã§ã¯
enum { Red, Green, Blue };
åã®ããã«åçŽãªåèš
data Bool = True | False
C ++ã§ã¯ãããªããã£ãåã®
bool
ã§ãã
ããã«ãå€ã®æç¡ããšã³ã³ãŒãããåã®åèšã¯ãç©ºã®æååãè² ã®æ°ãnullãã€ã³ã¿ãŒãªã©ããäžå¯èœãªãå€ãæã€ããŸããŸãªããªãã¯ã䜿çšããŠC ++ã§å®è£
ãããŸããHaskellã§ã¯ã
Maybe
ïŒ
data Maybe a = Nothing | Just a
Maybe
ã¿ã€ãã¯ã2ã€ã®ã¿ã€ãã®åèšã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒã粟ç¥çã«å¥ã®åã«å€ããŸãã æåã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
data NothingType = Nothing
ãã®ãªã¹ãã«ã¯ã
Nothing
åäžã®å€ãå«ãŸããŠããŸãã ã€ãŸããããã¯type
()
ãšåçã®ã·ã³ã°ã«ãã³ã§ãã 第äºéš
data JustType a = Just a
ã¿ã€ãaã®ã©ãããŒã§ãã
Maybe
data Maybe a = Either () a
åã®ããè€éãªåèšã¯ããã€ã³ã¿ãŒã䜿çšããŠC ++ã§äœæãããŸãã ãã€ã³ã¿ãŒã¯ãnullãŸãã¯ç¹å®ã®åã®å€ãæãããšãã§ããŸãã ããšãã°ãHaskellã§ã¯ããªã¹ãã¯åã®ïŒååž°çãªïŒåèšãšããŠå®çŸ©ãããŸãã
List a = Nil | Cons a (List a)
C ++ã§ã¯ãåãã¿ã€ããæ¬¡ã®ããã«èšè¿°ãããŸãã
template<class A> class List { Node<A> * _head; public: List() : _head(nullptr) {}
ããã§ã®NULLãã€ã³ã¿ãŒã¯ç©ºã®ãªã¹ãããšã³ã³ãŒãããŸãã
Haskellã®
Nil
ããã³
Cons
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåæ§ã®åŒæ°ãæã€2ã€ã®ãªãŒããŒããŒãããã
List
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãªã£ãŠããããšã«æ³šæããŠãã ããïŒ
Nil
ã®å Žåã¯åŒæ°ãªãã
Cons
å€ãšãªã¹ãã
List
ã¯ã©ã¹ã«ã¯ãã¿ã€ãã®åèšã®ã³ã³ããŒãã³ããåºå¥ããã©ãã«ã¯å¿
èŠãããŸããã 代ããã«ã
_head
ã«ç¹å¥ãª
nullptr
å€ã䜿çšããŠ
Nil
ã衚ããŸãã
HaskellãšC ++ã®åã®éèŠãªéãã¯ãHaskellã§ã¯ããŒã¿æ§é ãäžå€ã§ããããšã§ãã ãªããžã§ã¯ããç¹å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠäœæãããå Žåãã©ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšã©ã®åŒæ°ã䜿çšãããããæ°žä¹
ã«èšæ¶ããŸãã ãããã£ãŠã
Just "energy"
ãšããŠäœæããã
Maybe
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ã
Nothing
ã©ããããããšã¯ãã
Nothing
ã åæ§ã«ã空ã®ãªã¹ãã¯åžžã«ç©ºã®ãŸãŸã§ããã3èŠçŽ ãªã¹ãã«ã¯åžžã«åã3èŠçŽ ãæ ŒçŽãããŸãã
ã€ãã¥ããã£ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒããªããŒã·ãã«ã«ããŸãããªããžã§ã¯ãã¯ãã€ã§ãã³ã³ããŒãã³ãéšåã«åè§£ã§ããŸãã ãã®ãããªåè§£ã¯ããã®ã³ã³ã¹ãã©ã¯ã¿ãŸãã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ã§ãããµã³ãã«ãšæ¯èŒããããšã«ããå®è¡ãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ã¯å€æ°åïŒãŸãã¯ä»ã®ãã¿ãŒã³ïŒã«çœ®ãæããããŸãã
List
åã«ã¯2ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããããä»»æã®
List
åè§£ã¯2ã€ã®äžèŽãããã¿ãŒã³ã§æ§æãããŸãã æåã®ãµã³ãã«ã¯ç©ºã®
Nil
ãªã¹ãã«äžèŽãã2çªç®ã®ãµã³ãã«ã¯
Cons
äœæããããªã¹ãã«äžèŽããŸãã ããšãã°ãåçŽãªé¢æ°ãå®çŸ©ããŸãã
maybeTail :: List a -> Maybe (List a) maybeTail Nil = Nothing maybeTail (Cons _ t) = Just t
maybeTail
å®çŸ©ã®æåã®éšåã¯ããããã³ã°ã®åç
§ãšããŠ
Nil
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšãã
Nothing
ãè¿ããŸãã 2çªç®ã®éšåã§ã¯ãäŸãšããŠ
Cons
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŸãã ãµã³ãã«ã®æåã®åŒæ°ã¯ããã·ã¥ã§è¡šãããŸããããã¯ããµã³ãã«ã«å«ãŸããæå³ã«é¢å¿ããªãããã§ãã 2çªç®ã®åŒæ°
Cons
ã¯å€æ°
t
é¢é£ä»ããããŠããŸãïŒä»¥éã倿°ã«ã€ããŠèª¬æããŸãããå³å¯ã«èšãã°ã倿°ã¯å€æŽãããŸããïŒå€ã«é¢é£ä»ãããã倿°ã倿Žãããªãå ŽåïŒã ãã®ãµã³ãã«ã®é¢æ°ã®å€ã¯
Just t
ã§ãã ãããã£ãŠãã¿ã€ã
List
å€ã®äœææ¹æ³ã«å¿ããŠããã¿ãŒã³ã®ããããã«äžèŽããŸãã
Cons
ã䜿çšããŠäœæãããå Žåã颿°ã¯ãã®å Žåã«äœ¿çšãããäž¡æ¹ã®åŒæ°ãåãåããŸãïŒæåã®åŒæ°ã¯ç¡èŠãããŸãïŒã
ããè€éãªåã®åèšã¯ãããªã¢ãŒãã£ãã¯ã¯ã©ã¹ã®éå±€ã«ãã£ãŠC ++ã§å®è£
ãããŸãã å
±éã®ç¥å
ãæã€ã¯ã©ã¹ãã¡ããªã¯ãä»®æ³é¢æ°ã®ããŒãã«ãã³ã³ããŒãã³ãã®æé»çãªã©ãã«ãšããŠæ©èœããã¿ã€ãã®åèšãšããŠè§£éã§ããŸãã Haskellããã¿ãŒã³ãããã³ã°ãšããŠæ©èœãããã®ã¯ããã£ã¹ããã颿°ãåŒã³åºãããšã§C ++ã§å®è£
ãããŸãã
ãªãŒããŒã¯ããã®éå°å¶éã®ããã«ãåã®åèšãšããŠ
union
ã䜿çšããC ++ã§ãã£ãã«èŠã€ãããŸããã ãã®ã¯ã©ã¹ã«ã¯ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãããããã
std::string
ã
union
å
¥ããããšããã§ããŸããã
å代æ°
ãããšã¯å¥ã«ãã¿ã€ãã®åäœãšåèšã«ãããå€ãã®æçšãªããŒã¿æ§é ãå®çŸ©ã§ããŸãããå®éã®åã¯ãããã®çµã¿åããã«ãããŸãã
以äžããŸãšããŸãã åã·ã¹ãã ã®åºç€ãšãªã2ã€ã®å¯æã¢ãã€ãæ§é ã調ã¹ãŸããã ããã¯ãäžç«èŠçŽ
Void
ãæã€åãšäžç«èŠçŽ ãæã€åã®ç©
()
ã®åèšã§ãã ããããå ç®ãšä¹ç®ãšããŠæ³åãããšäŸ¿å©ã§ãã ãã®å Žåã
Void
ãŒãã§ã
()
ã¯1ã§ãã
ãã®é¡æšãã©ããŸã§åºãã£ãŠãããèŠãŠã¿ãŸãããã ããšãã°ããŒããæãããšãŒãã«ãªãã®ã¯æ¬åœã§ããïŒ èšãæãããšã
Void
äžã®åã¯
Void
åãšååã§ããïŒ
ããšãã°ã
Int
ãš
Void
æ§æããããã¢ã¯ãããŸããïŒ ãã¢ãäœæããã«ã¯ãäž¡æ¹ã®å€ãå¿
èŠã§ãã
Int
åã®å€ã¯åé¡ã§ã¯ãããŸãããã
Void
ã«ã¯åé¡ããããŸãããã®åã«ã¯å€ãèšå®ãããŠããŸããïŒãã®åã®å€ã¯ãããŸããïŒã ãããã£ãŠããã¹ãŠã®ã¿ã€ã
a
ã¿ã€ã
(a, Void)
ãèšå®ãããªãããã
Void
ãšåçã§ãã ã€ãŸãã
a*0 = 0
ã§ãã
æ°å€ã®å ç®ãšä¹ç®ã¯ãååžæ³åã«ãã£ãŠé¢é£ä»ããããŠããŸãã
a * (b + c) = a * b + a * c
ã¿ã€ãã®åãšç©ã«å¯ŸããŠå®è¡ãããŸããïŒ ã¯ããååãŸã§ã IDã®å·ŠåŽã¯ã¿ã€ãã«å¯Ÿå¿ããŸã
(a, Either bc)
ãããŠæ£ãããã®
Either (a, b) (a, c)
åãçžäºã«å€æãã颿°ãæç€ºããŸãïŒ
prodToSum :: (a, Either bc) -> Either (a, b) (a, c) prodToSum (x, e) = case e of Left y -> Left (x, y) Right z -> Right (x, z)
sumToProd :: Either (a, b) (a, c) -> (a, Either bc) sumToProd e = case e of Left (x, y) -> (x, Left y) Right (x, z) -> (x, Right z)
ã³ã³ã¹ãã©ã¯ãã®
case of
ã颿°å
ã®ãã¿ãŒã³ãããã³ã°ã«äœ¿çšãããŸãã ç¢å°ã¯ããã¿ãŒã³ãšããã«å¯Ÿå¿ããåŒãåé¢ããŸãã ããšãã°ãåŒæ°ãæå®ããŠ
prodToSum
ãåŒã³åºãå Žå
prod1 :: (Int, Either String Float) prod1 = (2, Left "Hi!")
e
case e of
ã®
e
倿°ã¯
Left "Hi!"
ã
"Hi!"
眮ãæããŠã
Left y
ãã¿ãŒã³ãšäžèŽã
"Hi!"
y
代ããã«ã 倿°
x
以å
2
ã«é¢é£ä»ããããŠãããããæ§ç¯ã®
case of
çµæïŒããã³é¢æ°å
šäœïŒã¯ãäºæ³ã©ããã
Left (2, "Hi!")
ãŸãã
äžèšã®é¢æ°ãçžäºã«éã§ããããšã®èšŒæã¯ãæŒç¿ãšããŠèªè
ã«å§ããããŸãã ãããã©ãŒãããããå¥ã®ãã©ãŒãããã«åãããŒã¿ãåããã±ãŒãžããã ãã§ãã
ååžåã«ãã£ãŠæ¥ç¶ããã2ã€ã®ã¢ãã€ãã¯ãæ°åŠã§ã¯
åç°ãšåŒã°ããŸãã åã®æžç®ã決å®ã§ããªããããããã¯å®å
šãª
ãªã³ã°ã§ã¯ãããŸããã èªç¶æ°ã®åç°ã«åœãŠã¯ãŸãäžé£ã®ã¹ããŒãã¡ã³ãã¯ãåã«è»¢éã§ããŸãã 以äžã«äŸã瀺ããŸãã
æ°å
| çš®é¡
|
0
| Void
|
1
| ()
|
a + b
| Either ab = Left a | Right b
|
a * b
| (a, b) ãŸãã¯Pair ab = Pair ab
|
2 = 1 + 1
| data Bool = True | False
|
1 + a
| data Maybe = Nothing | Just a
|
ãªã¹ãã¿ã€ãã¯ãæ¹çšåŒã®è§£ãšããŠå®çŸ©ãããŠãããããç¹ã«è峿·±ããã®ã§ãã å®çŸ©ãããŠããã¿ã€ãã¯ãçåŒã®äž¡åŽã«ãããŸãã
List a = Nil | Cons a (List a)
éåžžã®çœ®æãå®è¡ãã
List a
ã
x
眮ãæããŠãååŸããŸã
x = 1 + a * x
åã¯æžç®ãŸãã¯é€ç®ã§ããªãããããã®æ¹çšåŒã¯åŸæ¥ã®ä»£æ°çææ³ã§ã¯è§£æ±ºã§ããŸããã å³åŽã®
x
代ããã«åŒ
(1 + a*x)
ååž°çã«ä»£å
¥ããŠãååžã«ãã£ãŠæ¬åŒ§ãéããŸãããã ã²ãã
x = 1 + a*x x = 1 + a*(1 + a*x) = 1 + a + a*a*x x = 1 + a + a*a*(1 + a*x) = 1 + a + a*a + a*a*a*x ... x = 1 + a + a*a + a*a*a + a*a*a*a...
æçµçã«ãç¡éã®éã®è£œåïŒã¿ãã«ïŒã«å°éããŸããããã¯æ¬¡ã®ããã«è§£éã§ããŸãããªã¹ãã¯ç©ºã
1
ããããã§ãã ããããã1ã€ã®èŠçŽ ã§æ§æãããŸã; ããããã®ãã¢ã
a*a
æ§æãããŸãã ãŸãã¯ããªãã«ã
a*a*a
ãªã©ããæ£åŒã«ååŸãããå®çŸ©ã¯ãæååã®ä»£ããã«ãªã¹ãã®çŽæçãªã¢ã€ãã¢ã«å®å
šã«å¯Ÿå¿ããŸããæåã®ä»£ããã«ã¿ã€ã
a
å€ããããŸãã
ãã¡ã³ã¯ã¿ãŒãšåºå®å°æ°ç¹ã調ã¹ãåŸããªã¹ããšãã®ä»ã®ååž°æ§é ã«ããã«æ»ããŸãã
ã·ã³ããªãã¯å€æ°ã§æ¹çšåŒãè§£ãããšã¯ä»£æ°ã§ãïŒ ãããã£ãŠããã®ãããªããŒã¿åã¯ä»£æ°ïŒADTïŒãšåŒã°ããŸãã
ãŸãšãããšãå代æ°ã®éåžžã«éèŠãªè§£éãäžããŸãã ã¿ã€ã
a
ãšã¿ã€ã
b
ç©ã«ã¯ãã¿ã€ã
b
å€ãšã¿ã€ã
b
å€ã®äž¡æ¹ãå«ãŸããŠããå¿
èŠããããããã¯äž¡æ¹ã®ã¿ã€ãã®æ¯éå£ãæå³ããããšã«æ³šæããŠãã ããã äžæ¹ãåã®åèšã«ã¯ãå
b
å€
ãŸãã¯å
b
å€ã®ãããããå«ãŸããŠãããããå°ãªããšã1ã€ãå
¥åãããŠããã°ååã§ãã è«ç
ç©ãš
è«çåã®è«çæŒç®ã¯ãåç°ãšä»¥äžã®å¯Ÿå¿é¢ä¿ã«ããåç°ã«ãã£ãŠåœ¢æãããŸãã
ããžãã¯
| çš®é¡
|
åœ
| Void
|
æ¬åœ
| ()
|
|| b
| Either ab = Left a | Right b
|
a && b
| (a, b)
|
ãã®é¡äŒŒæ§ã¯æ·±ããããšãã§ããè«çãšåçè«ã®éã®ã«ãªãŒ-ãã¯ãŒãååã®åºç€ã«ãªããŸãã æ©èœã¿ã€ããæ€èšããå Žåããã®åé¡ã«æ»ããŸãã
æŒç¿
Maybe a
ãšEither () a
ååã§ããããšã瀺ãã
- Haskellã®æ¬¡ã®ã¿ã€ãã®åèšãèããŸãã
data Shape = Circle Float | Rect Float Float
Shape
ã¿ã€ãã§area
颿°ãå®çŸ©ããã«ã¯ããã¿ãŒã³ãããã³ã°ã䜿çšããŸãã
area :: Shape -> Float area (Circle r) = pi * r * r area (Rect dh) = d * h
ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠC ++ãŸãã¯Javaã§Shape
ãå®è£
ãã Circle
ãšRect
2ã€ã®ã¯ã©ã¹ãäœæããŸãã æ¬¡ã«ã area
ãä»®æ³é¢æ°ãšããŠæžã蟌ã¿ãŸãã
- ïŒç¶ãïŒ
Shape
åšå²ãèšç®ããæ°ããcirc
颿°ãç°¡åã«è¿œå ã§ããŸãã Haskellã§ã¯ã Shape
ã¿ã€ãã®å®çŸ©ã¯å€æŽãããŸããã æ¬¡ã®ã³ãŒãã¯ãããã°ã©ã ã®ã©ãã«ã§ã远å ã§ããŸãã
circ :: Shape -> Float circ (Circle r) = 2.0 * pi * r circ (Rect dh) = 2.0 * (d + h)
C ++ãŸãã¯Javaããã°ã©ã ã«circ
ã远å ããŸãã å
ã®ããã°ã©ã ã®ã©ã®éšåãä¿®æ£ããå¿
èŠããããŸãããïŒ
- ïŒç¶ãïŒæ°ãã
Square
ã·ã§ã€ããShape
ã¿ã€ãã«è¿œå ããæ®ãã®ã³ãŒããé©åã«æŽæ°ããŸãã Haskellã§äœã倿Žããå¿
èŠããããŸãããïŒ C ++ãŸãã¯Javaã¯ã©ãã§ããïŒ ïŒHaskellãç¥ããªããŠãã倿Žã¯ããªãæçœãªã¯ãã§ããïŒ
- æ£åŒãªã¢ã€ãã³ãã£ãã£
a + a = 2 * a
ãåã«å¯ŸããŠæãç«ã€ããšã瀺ããŸãïŒååãŸã§ïŒã åèšèªã®2
ã¯Bool
察å¿ããããšãæãåºããŠãã ããïŒäžèšã®è¡šãåç
§ïŒã
è¬èŸ
èè
ã¯ãæçš¿ãšæçšãªã³ã¡ã³ããã¬ãã¥ãŒããŠãããGershom Bazermanã«æè¬ããŠããŸãã