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

swift-either-type

3925ee6eaa41031bac799de0f4f528ec?s=47 to4iki
March 31, 2015

 swift-either-type

3925ee6eaa41031bac799de0f4f528ec?s=128

to4iki

March 31, 2015
Tweet

Transcript

  1. (Ծ)SwiftͰ௚࿨ܕΛॻ ͍ͯΈͨ 2015-03-28 Meetup toshiki takezawa @to4iki

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

    • ઌ೔30cm΄Ͳ൅Λ੾ͬͯผਓʹ • ઌ೔๺཮৽װઢʹ৐ͬͨ
  3. Կ΍ͬͯΜͷɺ΍ͬͯͨʁ • ιγϟήͷAPI࡞੒ • ిࢠϚϯΨͷϓϥοτϑΥʔϜΛ࡞͍ͬͯ· ͢ • ઌ೔iOSΞϓϦΛϦϦʔε͠·ͨ͠

  4. λΠτϧ͸Ғͦ͏͕ͩɺ୞ͷ ࣗ࡞ϥΠϒϥϦͷ঺հ

  5. ௚࿨ܕ

  6. ௚࿨ܕ ͱݺ͹ΕΔ΋ͷ͕͋ΔΒ͍͠ݴޠ • Scala • Haskell • TypeScript 1.4 Union

    Type
  7. ྫ. Α͋͘Δྫ֎ॲཧ (scalaͰ)

  8. try ~ catch ~ finally Javaͱಉ͡ try  {    

     f()  //  throw  new  Exception()   }  catch  {      case  e:  Exception1  =>  ...      case  e:  Exception2  =>  ...   }  finally  {      ...   }  
  9. ؔ਺ܕϓϩάϥϛϯάͰ͸ ྫ֎ͷ୅ΘΓʹ ࣦഊΛදݱ͢Δܕͱ ͦͷ஋Λ༻͍Δ

  10. Option nullճආ • ஋͕ͳ͍͜ͱΛܕͰදݱɻശͱߟ͑Δ • Some(A) or None • nullࢀর

    Λഉআͯ͠Optional Λಋೖ͢Δ͜ͱͰɺ ϓϩάϥϚʹΤϥʔॲཧΛڧ੍͠ɺͦͷΑ͏ͳό άΛະવʹ๷͙͜ͱ͕Ͱ͖Δɻ • Promise΋ಉ͡(কདྷతʹத਎(஋)͕ಘΒΕΔശ)
  11. 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  
  12. Either[A, B] ௚࿨ܕ • ;ͨͭͷܕͷ஋Λ΋ͭՄೳੑ͕͋Δ͜ͱΛࣔ ͢ܕ • ੒ޭͷ৘ใΛRightͰɺࣦഊͷ৘ใΛLeftͰද ݱ͢Δ

  13. 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Λ఻೻͢Δ
  14. ଞʹ΋ • Try[A] • ྫ֎Λ౤͛ΔՄೳੑͷ͋ΔॲཧΛந৅Խ • https://gist.github.com/j5ik2o/5471851 • scalaz.Validation[E, A]

    • Τϥʔͷू߹ or ݁Ռͷσʔλ
  15. SwiftͰ΋࢖͍͍ͨͳ…

  16. લఏ • try ~ catch: ແ͍ɻiOSͰ͸ྫ֎ൃੜͨ͠Βࡴ ͢จԽ • Option: nullͷ୅ΘΓʹΤϥʔ৘ใΛ࣋ͯͳ͍

    • Error஋ΛtupleͰฦ͢ͷ΋؆қతʹ͸ΞϦ
  17. ఆٛ

  18. • ௚ੵ • ͲͪΒ͔Β΋ɺ஋ΛऔΕΔ → tuple • ௚࿨ • ͲͪΒ͔͔Βɺ஋ΛऔΔ

    → enum • ΤϥʔॲཧΛͯ͠ཉ͍͠ͱ͍͏ҙਤΛܕͱͯ͠໌ࣔͰ͖Δ • OptionͷNullνΣοΫΛͯ͠ཉ͍͠ࣄΛܕͰදݱग़དྷΔͷͱಉ͡ • tupleͱҧ͍ਖ਼ৗܥͱΤϥʔܥͷ෼ذΛࣗવʹॻ͚Δ
  19. ScalaͷeitherΛॻ͍ͯΈͨ!

  20. https://github.com/to4iki/EitherSwift

  21. //  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)
  22. //  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)  
  23. Α͔ͬͨΒ˒͚ͭͯԼ͍͞!

  24. ͋Γ͕ͱ͏͍͟͝·ͨ͠