Upgrade to Pro — share decks privately, control downloads, hide ads and more …

swift-either-type

to4iki
March 31, 2015

 swift-either-type

to4iki

March 31, 2015
Tweet

More Decks by to4iki

Other Decks in Programming

Transcript

  1. ୭ʁ • ஛ᖒढ़ق • 2012/4ೖࣾ • ෢ث: Ruby, Scala, Swift

    • ઌ೔30cm΄Ͳ൅Λ੾ͬͯผਓʹ • ઌ೔๺཮৽װઢʹ৐ͬͨ
  2. try ~ catch ~ finally Javaͱಉ͡ try  {    

     f()  //  throw  new  Exception()   }  catch  {      case  e:  Exception1  =>  ...      case  e:  Exception2  =>  ...   }  finally  {      ...   }  
  3. Option nullճආ • ஋͕ͳ͍͜ͱΛܕͰදݱɻശͱߟ͑Δ • Some(A) or None • nullࢀর

    Λഉআͯ͠Optional Λಋೖ͢Δ͜ͱͰɺ ϓϩάϥϚʹΤϥʔॲཧΛڧ੍͠ɺͦͷΑ͏ͳό άΛະવʹ๷͙͜ͱ͕Ͱ͖Δɻ • Promise΋ಉ͡(কདྷతʹத਎(஋)͕ಘΒΕΔശ)
  4. def  head[A](xs:  List[A])  =        if(xs.isEmpty)  None  else

     Some(xs.head)       head(List())     //  None   head(List(1,2,3))     //  Some(1)   head(List(1,2,3)).map  {  x  =>  x  +  12  }     //  Some(13)   head(List(1,2,3)).getOrElse(0)   //  1   head(List()).getOrElse(0)   //  0  
  5. def  parseInt(s:  String):  Either[Exception,  Int]  =      try  Right(s.toInt)

     catch  {  case  e:Exception  =>  Left(e)  }   parseInt(“256")   //  Right(256)   parseInt(“abc")   //  Left(java.lang.NumberFormatException:  For  input  string:   “abc")   parseInt("256").right  map  {  _.toFloat  }   //  Right(256.0)   parseInt("abc").right  map  {  _.toFloat  }   //  ݁Ռ͕Left(Exception)ͷ৔߹͸ɺtoFloat͸࣮ߦ͞Εͣʹɺ ExceptionΛ఻೻͢Δ
  6. • ௚ੵ • ͲͪΒ͔Β΋ɺ஋ΛऔΕΔ → tuple • ௚࿨ • ͲͪΒ͔͔Βɺ஋ΛऔΔ

    → enum • ΤϥʔॲཧΛͯ͠ཉ͍͠ͱ͍͏ҙਤΛܕͱͯ͠໌ࣔͰ͖Δ • OptionͷNullνΣοΫΛͯ͠ཉ͍͠ࣄΛܕͰදݱग़དྷΔͷͱಉ͡ • tupleͱҧ͍ਖ਼ৗܥͱΤϥʔܥͷ෼ذΛࣗવʹॻ͚Δ
  7. //  example   let  result:  Either<Error,  Int>  =  parseInt(“2”)  

        //  fold  -­‐  ਖ਼ৗܥͱΤϥʔܥͷ෼ذΛࣗવʹ   result.fold(          {  (e:  Error)  -­‐>  String  in  "left"  },          {  (s:  Int)  -­‐>  String    in  "right"}   )  //  right       //  getOrElse(&&)   result.right.getOrElse  {  0  }  //  2   result.right  ??  0  //  2       //  map   result.left.map  {  $0.reason  +  "left"  }  //  .Left()   result.right.map  {  $0  +  2  }  //  .Right(4)   //  flatMap   result.left.flatMap  {  _  in  Either<Error,  Int>(right:  12)  }   //  .Left()   result.right.flatMap  {  _  in  Either<Error,  Int>(right:  12)  }   //  .Right(12)
  8. //  example   let  result:  Either<Error,  Int>  =  parseInt(“2”)  

    //  chain   //  Like  null  Coalescing  Operator   result.chain  {  (i:  Int)  -­‐>  Either<Error,  Int>  in          Either(right:  i  *  i)     }  //  .Right(4)   parseInt("a").chain  {  (i:  Int)  -­‐>  Either<Error,  Int>  in            Either(right:  i  *  i)   }  //.Left("parse  error")       //  recover  /  recoverWith   //  like  null  Coalescing  Operator   result.recoverWith  {  Either(right:  0)  }  //  .Right(2)   parseInt("a").recoverWith  {  Either(right:  0)  }  //  .Right(0)   parseInt("a").recoverWith({          parseInt("b")   }).recoverWith({          parseInt("3")   })  //  .Right(3)       parseInt("a").recover  {  1  }  //  .Right(1)