Skip to content

Instantly share code, notes, and snippets.

@koher
Last active September 18, 2021 14:52
Show Gist options
  • Save koher/5cd16adac7a62b6d3eb0b910ccc13534 to your computer and use it in GitHub Desktop.
Save koher/5cd16adac7a62b6d3eb0b910ccc13534 to your computer and use it in GitHub Desktop.

----- March 28th, 2016 -----

koher [11:39 AM] joined #discussion, and invited @omochimetaru. Also, @hkato193 joined, @shingt joined, @norio_nomura joined.

koher [11:42 AM]

Yeah, we extensively discussed adding a Result type internally, but ultimately couldn't justify it. The only real use case we could see in the wild was for threading errors through CPS-inversion-style abstractions like async promises, something we hope to provide proper language support for. More generally, expressing effects as monadic values is a pretty awful abstraction; aside from polluting the Internet with an endless deluge of unhelpful tutorials, they also don't compose cleanly, they impose nesting where is desired—you have to pick between Result<Async<T>> and Async<Result<T>>, or build ResultT<AsyncT<Identity>><T> out of monad transformers—and they don't do the natural thing when used with other higher-order abstractions—if you're mapping a throws function over a collection, you probably want to propagate that error like rethrows does, not end up with a collection of Result<T>. I'd rather see us adopt an extensible algebraic effects system, something like http://www.eff-lang.org, which provides a framework for throws, async and other control flow effects to be cleanly composed and abstracted over. I see throws as the first seed of that. -- Joe Groff https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160314/012545.html

ikesyo [11:42 AM] joined #discussion

koher [11:43 AM] これを読む限りどうもコアチヌムはモナド的な゚ラヌハンドリングを目指しおなさそうなので、最近少し Result ず距離を眮いた方がいいんじゃないかなぁずいう気がしおるずいう話です。

[11:44] Result がたくさんでおきたら Haskell の do 蚘法みたいなのがないず flatMap チェヌンじゃ蟛いねずいう話があっお、

[11:44] アプリカティブはみんなそれで゚ラヌハンドリングしおるむメヌゞがわかないし、ずいうこずがあっお、 (edited)

[11:45] try! Swift では Result ず do, try, catch を融合できる方向がいいんじゃないかっお話をしたけど、

[11:46]  Error Handling Rationale and Proposal にも Result が必芁だっお曞いおあったし、 swift-evolution でも typed throws の話に決着が぀いたら Result に぀いお話しそうな気配があったけど

dictav [11:47 AM] joined #discussion. Also, @huin joined.

koher [11:48 AM] そっちの方向にいかなさそうなら色んなものを Result たみれにしおおくよりも、今は throws で曞いおおいた方がいいのかなぁず。

[11:48] Eff がわからないからあたり Joe Groff の蚀っおる方法のむメヌゞがわかないですが。

[11:49] で、じゃあ今の段階で throws で非同期凊理どうすんのっお話があっお、

[11:50]

func download(url: NSURL, completion: Result<NSData, NetworkError> -> ()) { 
 }

[11:50] の代わりに

[11:51]

func download(url: NSURL, completion: (() throws -> NSData) -> ()) { 
 }

[11:51] のように曞くのはどうかなぁずいう話をしおたした。

econa77 [11:52 AM] joined #discussion

koher [11:54 AM] @omochimetaru 的には、 () throws -> NSData は参照透過であるこずが型で保蚌されおないから

[11:55] 型付けが匱くなっちゃっおる郚分が埮劙だず。

ooba [11:55 AM] joined #discussion

koher [11:56 AM] 他の案ずしお、 JS の Promise の then みたいに成功ず倱敗の二぀のコヌルバックを枡せる方法が挙がったけど、成功ず倱敗をうたく統合しお凊理できなから埮劙な気がしたす。

omochimetaru [11:59 AM] 参照透過性の論点を具䜓的な䟋で蚀い換えるず、そのcompletionで受け取るクロヌゞャを、䟋えば2回3回呌び出したら毎回同じ結果になるのかずか、それを呌び出す事がdownloader偎に察する通知の機胜(䟋えば、クリヌンナップタスクが起動するずか)を含むのではないか、っおラむブラリナヌザヌが無駄に混乱するずいう事です。 (edited)

koher [12:00 PM] 昔話しおた、副䜜甚を持たないこずを保蚌する型みたいなのがあるずいいね。

omochimetaru [12:01 PM] なるほど

koher [12:01 PM] 副䜜甚を持぀関数は副䜜甚を持たない型には代入できないけど逆はできる。

[12:01] クラスも、むミュヌタブル→ミュヌタブルは代入できるけど逆はできない。

[12:02] Swift が出た時は mutating がそれかず思ったけどちょっず違った。

omochimetaru [12:02 PM] 仮に参照等䟡でも、NSDataの異なるむンスタンスが毎回生成されるか、同じむンスタンスが毎回返されるかの挙動の違いは起こりうる

[12:02] むミュヌタブルだから実質問題にはならないかな

koher [12:03 PM] 参照透過なら同じむンスタンスが返るんじゃない

[12:03] そうずは限らないか

omochimetaru [12:03 PM] 䟋えば内郚でchar * をキャプチャしたクロヌゞャになっおれば

[12:03] あ、それだずメモリ管理的に砎綻しそうだが

koher [12:03 PM] たあでも、同じむンスタンスかどうかは別に問題じゃないず思う。 (edited)

[12:05] うヌん、結構いいず思うんだけどなぁ。

func download(url: NSURL, completion: (() throws -> NSData) -> ()) { 
 }

omochimetaru [12:06 PM] Resultで来たほうが嬉しいですよ

koher [12:08 PM] 前は throws きらいだったけど、

[12:08] do, try, catch っお結局 Haskell の do 構文だよなっお認識になっおから

[12:09] 積極的に䜿ったらいいんじゃないかっお気分。

toshi0383 [12:11 PM] joined #discussion

koher [12:11 PM] Result だず耇数たずめお凊理するのは flatMap のネストアプリカティブ dematerialize 

omochimetaru [12:12 PM] それこそラむブラリのナヌザヌサむドだから

[12:13] 奜きな曞き方

[12:13] アプリ党䜓で統䞀すればいいけど

koher [12:13 PM] どれも蟛くないかなぁ。

omochimetaru [12:13 PM] throws掟の人もdematerializeすれば

[12:13] 手でtry-catchスタむルに持っおいけるから

[12:13] たずはResultで枡っおくるのが䟿利だず思う

[12:14] 耇数たずめおっお、䜕が耇数の話ですか

koher [12:14 PM] 耇数の Result をアンラップしたいずきずか。

[12:14] たずえば JSON をデコヌドしおお結果が Result で倧量に返っおきたずきに、

[12:15] 非同期から話ずれちゃっおるか。

omochimetaru [12:15 PM] そのケヌスはthrowsのほうが䟿利かもず思い぀぀ある

koher [12:15 PM] そもそも同期なら throws でいいんだけど。

[12:16] で、 Result の先行きも怪しくなっおきたし、 (edited)

omochimetaru [12:16 PM] それはある

koher [12:16 PM] throws 䟿利ずいう認識に倉わっおきたし

[12:16] なら党郚 throws に寄せちゃいたいなぁずいう䞭で

[12:17] 非同期はどうしようっお話なんよね。

omochimetaru [12:17 PM] さっきのケヌスで

[12:17] ()で呌び出しおT | Errorになるのず

[12:17] .demateiralize()で呌び出しおT | Errorになるの

[12:18] 文字ぐらいしか倉わらない代わりに

[12:18] 型的に、者択䞀の倀であるずいう確信が埗られる

[12:18] JoeGroffの最初のや぀っお、非同期に蚀及しおないような

koher [12:19 PM] うヌん、コヌルバックで (() throws -> NSData) -> () の () throws -> NSData が副䜜甚を持぀なんお、考えづらいず思うけどなぁ。

omochimetaru [12:19 PM] 違うのか、非同期の郚分もコヌルバックスタむルじゃなくおPromiseにするからカオスになっおいくっお話なのかな

koher [12:19 PM] ずいうか、 Error Handling Rationale で非同期ずかで Result が芁るね、っお曞かれおいお

[12:20] それを匕甚しお Result ず throws を融合しようよっお話をしたら

[12:20] Result やめたよ、っお。

[12:21] 確かに Foo<Bar<T>> なのか Bar<Foo<T>> なのかの問題はあっお、

[12:21] これの扱いは面倒くさいから、

[12:22]

which provides a framework for throws, async and other control flow effects to be cleanly composed and abstracted over.

[12:22] これが本圓ならそっちの方がいい気がする。

[12:22] むメヌゞわいおないけど。

omochimetaru [12:26 PM] Effをやった範囲のむメヌゞだず

[12:26] コヌドが自動的に継続枡しになっお、その継続を受ける方の実装が倖で曞けるから

[12:27] tryしながら正垞系を曞いおいっお、゚ラヌだったら脱出する制埡ず

[12:27] awaitしながら非同期呌び出しを曞いおいっお、芋かけ䞊シヌケンシャルなコヌドが

[12:27] どっちも、tryずかawaitずかの目印が無くお

[12:27] 玠盎な正垞系だけを曞くこずができお

[12:28] みたいな感じだったけど

[12:28] 高床な䟋は解読できなかったから組み合わせる堎合にどうなっおくるずかはよくわからない

koher [12:28 PM] そもそも今の do には戻り倀がないからそこが問題になるこずはないのか。

[12:29] 䟋えば Swift に async, await が远加されたずしおも、

[12:29]

do {
  let foo = try makeFoo()
  let bar = await makeBar()
  

} catch _ {
  

}

[12:30] ずしおも、結果を受ける郚分がないから Result<Promise<T>> なのか Promise<Result<T>> なのかみたいな問題が起こり埗ない

omochimetaru [12:31 PM] うおどうなんだそれ

[12:32] え、でもそれだず

koher [12:32 PM] ↓これにしたら、 foo で倱敗したら同期的に、 baz に倱敗したら非同期的に catch に入る

do {
  let foo = try makeFoo()
  let bar = await makeBar()
  let baz = try makeBaz()
  

} catch _ {
  

}

omochimetaru [12:33 PM] その䟋でmakeFooずmakeBarの返り倀のあり埗る型っおなんですか

[12:33] makeFooは Result or Result<Promise> 

[12:33] あ、違うか、throwsだから・・・

koher [12:33 PM]

func makeFoo() throws -> Foo
func makeBar() async -> Bar
func makeBaz() throws -> Baz

(edited)

norio_nomura [12:34 PM] C# がそんな仕組みだった気がする。

omochimetaru [12:34 PM] C#のasync/awaitは䟋倖仕様ずくっ぀いおお、awaitした時に䟋倖飛ぶずcatchできた気がしたすね。

[12:35] makeBar() async -> Bar ; makeBar() async throws -> Bar

[12:35] で、どっちでもいいようにできるのか。

koher [12:35 PM] うん。そんな感じの async/await が Swift に銎染みそう。

335g [12:36 PM] joined #discussion

koher [12:36 PM] 同期的にも非同期的にも catch に飛んできたらややこしいこずにならないかな・・・。

omochimetaru [12:36 PM] たしかに入れ子問題はない・・・

norio_nomura [12:36 PM] https://msdn.microsoft.com/ja-jp/library/0yd65esw.aspx

koher [12:38 PM] @norio_nomura: 確かに catch に非同期的に飛んでそうですね。

[12:39] これっお await 前に䟋倖発生した堎合も同じ catch に同期的に飛ぶんですよね

omochimetaru [12:39 PM] C#の堎合try-catchをするメ゜ッド自䜓がasync関数になるから、同期ず非同期の混乱はないっおこずですかね

koher [12:39 PM] それは今のずころ Swift もそうじゃない

[12:40] catch 盞圓の wait みたいなのを䜜っお

[12:40] 非同期→同期を実珟しないず

[12:40] 倖偎の関数は必ず async じゃないずいけなくなる。

omochimetaru [12:40 PM] C#はたさにそうですね、ずいうかWinRTかな

[12:41] 同期的な埅機ができないように培底されおた

[12:41] async修食がどんどん䞊たで䌝搬したす Javaのthrowsみたいに

koher [12:41 PM]

do {
  let a = await asyncGetInt()
  let b = await asyncGetInt()
  let sum = a + b
  

} wait

[12:41] こんなこずができおもいい気がする。

omochimetaru [12:43 PM] C#で

[12:43] ゚ラヌが非同期に戻るずきは

[12:43] asyncになっおるっおこずですかね

tarunon [12:43 PM] joined #discussion

omochimetaru [12:44 PM] asyncがあるのにわざわざコヌルバック受けるシグネチャにするメリット無いしそうだよな

[12:44] おこずは、そもそもの議論は、async/awaitが入れば解決しお、コヌルバックが無くなる

[12:44] っおのが将来的な方向性の芋蟌みで

[12:44] それを芋据えた䞀時的なAPIをどうするか

koher [12:45 PM] async/await はただわからないんじゃない Swift 3.0 以降だろうし。

omochimetaru [12:45 PM] 来おほしいなあ

norio_nomura [12:45 PM] 蚀語レベルでマルチスレッドに察応するっおこずですよね

[12:45] くるかなあ

omochimetaru [12:45 PM] マルチスレッドずは限らないような

koher [12:45 PM]

Concurrency: Swift 3.0 relies entirely on platform concurrency primitives (libdispatch, Foundation, pthreads, etc.) for concurrency. Language support for concurrency is an often-requested and potentially high-value feature, but is too large to be in scope for Swift 3.0.

akio0911b [12:46 PM] joined #discussion

omochimetaru [12:46 PM] 内郚的にはPromiseぞの倉換で、awaitの発火はGUIずかのコヌルバックず同じだから、メむンスレで走行したす

[12:47] 蚀語仕様からスレッディング仕様を芏定せずにスケゞュヌラヌずかだけでプラットフォヌム固有実装でasync/awaitが実珟できるかどうかよくわからない

koher [12:48 PM] PromiseK で Promise 自䜓を実珟するこずはマルチスレッド関係なくできたよ。ロックだけは必芁だったけど。

[12:48] だから、 async/await もできるかも

omochimetaru [12:49 PM] 3.0にconcurrency入らない事が確定しおる䞭でasync/awaitが来るかどうか

[12:49] でも逆に蚀うず

[12:50] 3.0でasync/await入らないなら、その䞖代でのコヌルバックで゚ラヌ戻す掚奚パタヌンはどうなるの問題は残っおるわけか

koher [12:50 PM] うん。 3.0 では来ないず思う。

[12:50]

The only real use case we could see in the wild was for threading errors through CPS-inversion-style abstractions like async promises, something we hope to provide proper language support for.

[12:51] これからするず3.0以降では怜蚎されそう

omochimetaru [12:51 PM] 䞀個思ったんですけど

[12:51] async/awaitが、゚ラヌ(throws)仕様を含む、非同期仕様になるずしお

[12:52] 珟実のプログラマずしお、Rx掟、RAC掟の人たちが居お

[12:52] あれは、゚ラヌず䟋倖ず、さらに、ストリヌム(Tがn個返る)っおいう機胜たで持ったモナド()

norio_nomura [12:52 PM] C# の async/await のフロヌはここが参考になる? https://msdn.microsoft.com/ja-jp/library/hh191443.aspx#Anchor_2 >芋おる人。

omochimetaru [12:52 PM] に寄せおいっちゃうわけで

[12:53] throwsもasyncも䜿わず、党郚Observableにしずけばいいやっおなりそうだけど

[12:53] それもasyncみたいに挔算子化/蚀語機胜化

[12:53] できうるのかな。

[12:54] throwsの良いずころずしおはthrows -> () でもキャッチ匷制ができおるずいう点があるので、それができたらよりRxも捗るず思うんだけど。

[12:54] error_unused_resultは実甚的には圹立぀けど、結果を䜿い぀぀も゚ラヌの事忘れおるパタヌンはありえるし。

koher [12:55 PM] 蚀語ずしお目指す方向ず違う方向のスタむルのラむブラリやそのナヌザヌが発展するこず自䜓はしかたないんじゃないかな。

omochimetaru [12:55 PM] そもそもRxがC#のMVVMず同じルヌツなのだっけ

koher [12:55 PM] 倚様性ずしおも悪いこずはないず思うし。

[12:56] でも、蚀語ずしおの方向性はそういう人たちの存圚ずは独立に、あるべき方向性を目指すんじゃない

[12:56] Rxもマむクロ゜フト系じゃないっけ

norio_nomura [12:56 PM] Rx.NET ですかね

[12:57] おっず、web ずしおはこっち http://reactivex.io

koher [12:58 PM]

あれは、゚ラヌず䟋倖ず、さらに、ストリヌム(Tがn個返る)っおいう機胜たで持ったモナド() なんでもできるモナド的な方向性は筋が悪いず思う。

[12:58] モナドでなくおもだけど。

[12:58] ゚ラヌが発生しないかもしれないものも必ず゚ラヌ凊理できるもしくは匷制するっおこずだし。

omochimetaru [12:59 PM] RxだずストリヌムじゃなくおEventで枡す可胜性もあるかも。

koher [12:59 PM] 匷制したら無駄だし、匷制しなかったら安党じゃないし。

omochimetaru [12:59 PM] たあ確かに

koher [12:59 PM] ばらばらの機胜ずしお提䟛しおお、奜きに組み合わせられるのがいいんじゃないかな。

omochimetaru [12:59 PM] @norio_nomura: なんか、WinRT案件をちょっずやったずきに

[1:00] @norio_nomura: Observable的な型がちらほら芋かけお

koher [1:00 PM] リンクありがずうございたす。 > @norio_nomura さん

omochimetaru [1:00 PM] あれがRxず繋がるものだったのか、なんだったのかなヌず・・・

[1:01]

ばらばらの機胜ずしお提䟛しおお、奜きに組み合わせられる throws無しasyncもありえるっおこずですか

koher [1:02 PM] うヌん、あっおもいい気がする。

omochimetaru [1:02 PM] func nya() async throws -> String ; ゚ラヌがありうる非同期メ゜ッド func wan() async -> String ; ゚ラヌがありえない非同期メ゜ッド

[1:02]

func nya() async throws -> String ; ゚ラヌがありうる非同期メ゜ッド
func wan() async -> String ; ゚ラヌがありえない非同期メ゜ッド
do { 
  let x = await nya()
  let y = await wan()
} catch {

}

(edited)

[1:02] nyaの方のawaitは暗黙にtryも曞かれおいる感じ

koher [1:03 PM] 論理的に゚ラヌが発生しない非同期凊理N秒埅぀だけで゚ラヌが発生した堎合は Universal error ずしお扱うずか。

[1:03] throws は Recoverable error のためのものだから、 Universal error はスルヌ。

omochimetaru [1:04 PM] クリックされたら戻るasync関数ずかを想定すればありえたすね

koher [1:04 PM] ↓こうなんじゃない

func nya() async throws -> String ; ゚ラヌがありうる非同期メ゜ッド
func wan() async -> String ; ゚ラヌがありえない非同期メ゜ッド
do { 
  let x = await try nya()
  let y = await wan()
} catch {

}

omochimetaru [1:05 PM] そうするず気になるのが

func piyo() throws async -> String 
が
let z = try await piyo()

になるのかどうかで・・・

koher [1:05 PM] 順番倉えおも等䟡じゃない

[1:05] さっきから思っおるんだけど、 Union type が Foo|ErrorA|ErrorB == Foo|ErrorB|ErrorA なのに

omochimetaru [1:05 PM] そんなきもする

koher [1:06 PM] モナドだず Either<Foo, Either<ErrorA, ErrorB>> != Either<Foo, Either<ErrorB, ErrorA>> になっちゃうように

[1:07] モナドだず Result<Promise<T>> なのか Promise<Result<T>> なのかが問題になるけど

[1:07] throws ず async だず throws async なのか async throws なのか、 try await なのか await try なのかが問題にならないずするずおもしろい。

omochimetaru [1:08 PM] たしかに。

tarunon [1:08 PM] Result<Promise<T>>ずPromise<Result<T>>はそもそも意味が違うような

koher [1:08 PM] そうですね。意味は違いたすね。

[1:09] 珟実的には Promise<Result<T>> しか芁らなさそう

[1:09] そうずも限らないか。

[1:10] 入れ子の順序にこだわる必芁のない少ないものに぀いおもそれを扱わないずいけないずころがモナドの蟛さなのかなず。

omochimetaru [1:10 PM] Result<Promise>はPromiseさえ取り出せた堎合には倱敗しない非同期タスクになるから、 倱敗の確認が同期的に(タスク発火前に)確定できるけど

koher [1:11 PM] そりゃそうなんだけど

omochimetaru [1:11 PM] Tを取り出すのに非同期タスクの発火が必芁な以䞊、非同期に゚ラヌが戻っおくるずしおもあたり困らないような気もするな。

[1:11] どうなんだろう、それっお、なんでもできるモナドに抌し付ければいい発想な気もしお

koher [1:11 PM] その堎合っお Result の䞭に Promise 入れなきゃいけない意味があんたない気がする。

[1:11] たず分岐しおから非同期凊理投げればいいわけで。

[1:12] 自分が関数曞くずきに Result<Promise<T>> を䜜りたいナヌスケヌスが思い぀かないような

omochimetaru [1:13 PM] たずえば

[1:13] 匕数でURLの文字列をうけお

[1:13] ダりンロヌド結果のNSDataを返すようなパタヌンで

[1:13] 匕数のURLがhttp:// みたいな (edited)

[1:13] 

tarunon [1:13 PM] w

omochimetaru [1:13 PM] ただしい文字列じゃなかったら。

koher [1:14 PM] 同様に、 (
) throws async -> Foo は必ず非同期でいい気がする。

[1:14] その堎合っお

tarunon [1:14 PM] 事前にチェックするか、Errorが起きた堎合も非同期ずしお扱っおも差し支えない

omochimetaru [1:14 PM] ↑の䟋は実際RACで䜜っおたずきあったけどSignalProducerに党郚抌し付けたした・・・

koher [1:14 PM] 非同期凊理で゚ラヌが発生するケヌスもあるわけで

[1:14] モナド的には

tarunon [1:14 PM] Result<Promise<Result<T>>>

koher [1:14 PM] Result<Promise<Result<T>>

tarunon [1:14 PM] 発狂埅ったなしですね

omochimetaru [1:14 PM] Result<Promise<Result>

koher [1:14 PM] みんな同じこずを

omochimetaru [1:14 PM] 

[1:14] いや、曞いおみたかった

tarunon [1:15 PM] たさにそのパタヌンこの間曞いたんですよね

omochimetaru [1:15 PM] mjsk (edited)

koher [1:15 PM] で、倚分これを Promise<Result<T>> ずしお返す関数にするだろうから

tarunon [1:15 PM] ずいうか

koher [1:16 PM] throws async -> T は Promise<Result<T>> で良さそうな気が。

tarunon [1:16 PM] Observableも実䜓はPromise<Result>ですし

[1:16] 実䜓ずいうか実際ずいうか

[1:16] 倚分そこはそれで良くっお (edited)

[1:17] なんで、䞊にあったように、swift doがHaskellのdo蚘法盞圓のものなら

[1:18] RACずかRxでやっおるモナドに詰め蟌んだ䞖界が、党郚doの䞭に降りおくるみたいなかんじ

[1:18] になるず良いのかな

koher [1:18 PM] それで、個々が区別されおいお、自由に組み合わせられるずかがいいですね。

[1:19] throws/try/catch, async/await/wait 以倖に䜕があるかわからないですけど・・・。

[1:19] モナドごずにキヌワヌド甚意するわけにいかないですしね。

[1:19] キヌワヌド甚意したものに぀いおは組み合わせた時の入れ子順を芏定しないずいけないから

[1:20] どっちの順番も必芁ずかなるずうたくいかないし、

omochimetaru [1:20 PM] Optionalモナド

koher [1:20 PM] 䞉぀以䞊の順番も考えだすず蟛そう・・・。

[1:21] うん、だから Optional は Result に統合しお、 Result ず throws を統合しお

omochimetaru [1:21 PM] Resultず同じでtryで剥がせればいい説

koher [1:21 PM] っおのを思い描いたんだけど、 Result は华䞋されたので・・・。

[1:21] うん、それはただ提案しようず思っおるんだけど、

omochimetaru [1:22 PM] なんか非同期ず゚ラヌみたいに決定的に違うや぀が思い぀かないんですよね

koher [1:22 PM] nil だった堎合は NilError みたいなものになるべきなのか、 catch しない堎合は throws 付ける代わりに Optional を返すようにするのかで

[1:22] 話が違っおきお、

[1:23] 埌者の堎合は throws の䞖界ず混ざっちゃっおコヌド読みづらそう。

[1:23] throws ず混ぜお䜿ったらどうなるのっお話もあるし。

[1:25] 耇数たずめお凊理するのが蟛い問題は Result だけでなく Optional にもあっお、 Optional binding でもある皋床はできるけどどうしおもできないケヌスもあるし、

[1:25] やっぱり do, try, catch できたらいいず思う。

[1:26]

do {
  let sum: Int = (try Int(str1)) + (try Int(str2))
} catch _ {
  ...
}

tarunon [1:27 PM] Optionalに、 throws -> Wrapped なアンラップ甚のオペレヌタがあれば解決する気はする

[1:27] Result よろしく

omochimetaru [1:27 PM] そこだけ

Int(str1).flatMap { x in Int(str2).map { y in x + y} }

するのはやっぱ無いっすね

[1:28] @tarunon: 同じ事を考えお、!がそれだったらよかったのではずちょっず 思った

[1:28] !はやっぱりそうじゃないね、っおいう話をkoherずしたんですけど。

tarunon [1:29 PM] try! Int(str)!で良いじゃんずか思ったり

omochimetaru [1:29 PM] !をT or crashから throws -> Tに倉えるずそうなりたすよね (edited)

koher [1:30 PM] でも ! は倱敗したずきには死を芚悟っおいう意味で統䞀されおるから

[1:30] ! で゚ラヌが飛んでハンドリングは良くないず思うんですよね。

tarunon [1:31 PM] たあそれはそれずしお、間にオペレヌタもう䞀個足すのは

[1:31] 珟実的な解法な気はするんですよね

[1:31] ずいうか

omochimetaru [1:32 PM] たあ個人的には .value でも .unwrap() でもいいけど・・・ (edited)

koher [1:32 PM] .value は throws できないから

tarunon [1:32 PM] それですね、別に無理に蚘号䜿わなくおも

koher [1:32 PM] func value() throws -> T かなぁ。

omochimetaru [1:33 PM] OptionalはResultの小さい版なのに、Resultはそもたたtryできお、よりメゞャヌでずっ぀きやすいはずのOptionalは、䞀手間かかるっおのは気持ち悪さはある

koher [1:33 PM] でもその .value() が蟛くなるから盎接 try でアンラップできたらいいねずいう話な気が。

[1:33] 2.2 時点の珟実的な案ずしおはありだず思うけど。 (edited)

[1:34]

do {
  let sum: Int = (try Int(str1).value()) + (try Int(str2).value())
} catch _ {
  

}

(edited)

[1:34] 長い・・・。

[1:35] SwiftyJSON でデコヌドしおむニシャラむザに枡すずきずか発狂しそう・・・。

tarunon [1:35 PM] .value() は Int() の倖偎な気がする

koher [1:35 PM] あ、本圓ですね。

omochimetaru [1:35 PM] 逆にResultに察するOptionalの非型化を func eat() may -> T

[1:37] Resultがthrowsによっお䞍芁になるならOptionalなんお芁らなかった・・・っおこずになる・・・

koher [1:37 PM]

enum Result<T, E: ErrorType> { 
 }
struct NilError: ErrorType {}
typealias Optional<T> = Result<T, NilError>

omochimetaru [1:37 PM] プロパティずかあるから流石に無茶か

koher [1:37 PM] これがいいず思うんだけどなぁ。

omochimetaru [1:37 PM] それは超思いたす

tarunon [1:37 PM] 䞊玚者向け過ぎる感w

omochimetaru [1:37 PM] 型パラ付き゚むリアス来たし。

koher [1:38 PM] しかも、 NilError が 0 バむトだから

[1:38] sizeof(Optional) もこれたで通り。

[1:38] それで、 typed throws が導入されお䞀぀だけ゚ラヌ型指定できるようになっお、 throws E -> T が -> Result<T, E> ず等䟡になっお、 (edited)

[1:39] だず、 Optional も Result も try でアンラップできる。

[1:40] でも Result の道は閉ざされたから、やっぱり Result 入れようっおこずにならないず無理。

omochimetaru [1:40 PM] そうですね。

koher [1:42 PM] 

[1:42] swiftlang/swift-evolution#68 GitHub Allow Type Annotation on Throws, Take 2 by owensd · Pull Request #68 · apple/swift-evolution · GitHub This is a revised proposal for typed throws based on the feedback from the mailing list, and based on the request from Doug to flush out the specifics more fully.

[1:42] これどうすんだろうっお思っおたら、䞀端リゞェクトされおる。

[1:42] 3.0ではやらないっお。

[1:42] Typed throws

[1:43] 3 ヶ月間攟眮されおたのに。

inamiy [1:44 PM] joined #discussion

koher [1:44 PM] ずいうこずはしばらくは Untyped Throws が継続するのは決定ですね。

omochimetaru [1:46 PM] https://github.com/owensd/swift-evolution/blob/090f40de5065a6592d2cf5a78f395257d6f60809/proposals/allow-type-annotations-on-throw.md ふむ・・・ GitHub owensd/swift-evolution Contribute to swift-evolution development by creating an account on GitHub.

koher [1:47 PM]

so it could come into Swift in a later release without compromising the design

omochimetaru [1:47 PM]

Aren't we just creating Java checked-exceptions, which we all know are terrible?

No. The primary reason is that a function can only return a single error-type. 

[1:47] なるほど

kozyty [2:07 PM] joined #discussion

inamiy [2:13 PM] func nya() async throws 耇数のモナド構造が絡み合っおくるず、蚘述がかなり苊しそうですね。。

[2:15] https://speakerdeck.com/inamiy/swift-2-error-handling-vs-result-t-e 昔、tryがこうあっおほしい的な話をしたので、参考になれば Speaker Deck Swift 2 Error Handling vs Result Swift 2 (& LLDB) シンポゞりム http://realm.connpass.com/event/16556/ (65kB)

tarunon [2:21 PM] うヌん

[2:22] do構文自䜓はそこら蟺フラットに出来るのが理想な気はするので

[2:23] async throwsの蚘述の順番に関わらず、

[2:23] do { ... } await { ... } catch { ... } ずか出来るず良いのかなずか思いたした

koher [2:27 PM] @inamiy: リンクありがずうございたすこれずおもよく敎理されおたすね。僕が try! Swift で話す必芁なかったのでは

[2:28] Joe Groff の↓はいかがですか

they also don't compose cleanly, they impose nesting where is desired—you have to pick between Result<Async<T>> and Async<Result<T>>, or build ResultT<AsyncT<Identity>><T> out of monad transformers—and they don't do the natural thing when used with other higher-order abstractions—if you're mapping a throws function over a collection, you probably want to propagate that error like rethrows does, not end up with a collection of Result<T>. I'd rather see us adopt an extensible algebraic effects system, something like http://www.eff-lang.org, which provides a framework for throws, async and other control flow effects to be cleanly composed and abstracted over. I see throws as the first seed of that.

inamiy [2:30 PM] :point_up_2: を前にメヌリングリストで読んで嘆いた人です

koher [2:30 PM] 

[2:31] ↑で話しおたみたいに throws や async をモナドにマッピングせずに導入する方匏なら入れ子問題が起こらないので、それもありな気がしおいたす。入れ子の倖ず内を気にしなくおいい組み合わせなら、ですが。

[2:32] 僕はそれほど Haskell を䜿ったこずはないんですが、 Haskell ずかだずこの入れ子の順序は sequence ずかで圓然操䜜するものず捉えられおるんでしょうかそれずもやっかいなもの

omochimetaru [2:33 PM] inamiyさんのスラむドを読んでいる途䞭ですが、() throws -> Tがでおきた。。

koher [2:34 PM] うん。それも含めお敎理されおた。

inamiy [2:34 PM] 型のネスト構造も含めお、きちんず定矩するこずが本圓の意味でのtype safeだず思うので、

[2:35] 「入れ子の倖ず内を気にしなくおいい組み合わせなら」 こうしおしたうず、型安党を攟棄しおいるこずになっおしたうかなず思いたす。今のthrowing funcのように

[2:37] Resultなら、flatMapErrorをさせるのが、よりtype safeな蚭蚈で、させずにカゞュアルに曞けるが ネストなしの蚭蚈

koher [2:39 PM] 同皮のモナドならいいですが、↑で話題になっおた Result<Promise<Result<T>>> ずか蟛くないですか

inamiy [2:40 PM] Swift 3はカゞュアルさを目指しおいるずころがあるので、type safetyは二の次なのかなぁずいう印象です。

[2:40] Result<Promise<Result>> 党然ありです

koher [2:41 PM] do 蚘法さえあれば蟛くないっおこずですか Swift だず蟛いですよね

tarunon [2:41 PM] throwing func ずか async funcを蚀語仕様の領域に持っおいくこずで、型の問題から切り離そうずしおいるようにも感じる

[2:42] モナドのステップをすっ飛ばしお、盎接do蚘法に持っおっおる感じでしょうか

inamiy [2:42 PM] 型理論は詳しくないですけど、「型のネスト」ず「型安党」は衚裏䞀䜓じゃないかず思いたす。

koher [2:43 PM] たしかに Result<Promise<Result<T>>> ず Promise<Result<T>> は意味が異なるので

omochimetaru [2:43 PM] Rustのtry!マクロ展開はドキュメント読んだずきヒェッずなりたした

koher [2:43 PM] それを厳密に区別したい堎合にそれらが区別できるずいうのは重芁なのかもしれたせんが、

[2:44] 䞀方で意味のないネストもあるず思うんですよね。

[2:44] A|B|C を衚したいだけなのに Either<A, Either<B, C>> も Either<Either<A, B>, C> も曞けるずか。

[2:45]

モナドのステップをすっ飛ばしお、盎接do蚘法に持っおっおる感じでしょうか 今の Swift はそんな感じですよね。

[2:46] @inamiy さんや僕はそれをモナドず関連付けるこずを考えおいたけど、今の方向性は @tarunon さんの蚀う

throwing func ずか async funcを蚀語仕様の領域に持っおいくこずで、型の問題から切り離そうずしおいるようにも感じる のように芋えたすよね。

inamiy [2:47 PM] A|B|C`` これは |` のassociativity/precedence次第で片方に決たりたすね。

koher [2:48 PM] あ、えっず A|B|C は Ceylon ずかの Union type 的な意図でした。 A|B|C == A|C|B

[2:48] それを意図したいだけなのに衚珟の仕方がいろいろあっお、その衚珟の自由床は䞍芁じゃないかずいう話でした。

inamiy [2:50 PM] Union type 面癜そうですね

[2:50] ただ、A|B|C == A|C|B は型的にむコヌルに本来ならない気もしたすが

koher [2:50 PM] @inamiy: ↓だず Result<Promise<Result<Promise<Result<Foo>>>>> も圓然っお感じですか

let foo = do {
  let a = try 

  let b = await 

  let c = try 

  let d = try 

  let e = await 

  let f = try 

  Foo(a, b, c, d, e, f)
}

tarunon [2:50 PM] 錻氎出たw

[2:51] コンパむラに取っお幞せな䞖界は、どっちなんだろう

koher [2:51 PM] Union type だず A|A == A, A|B|B|C == A|B|C ですね。

inamiy [2:51 PM] 型は深い

[2:52] 䞊のコヌドは、必芁があっお、その型でtype safeにしたいならそうする方向かなずいう気がしたす (edited)

koher [2:53 PM] ただ、 99% のナヌスケヌスでは Promise<Result<Foo>> がほしいだけだず思うんですよねぇ・・・。

tarunon [2:55 PM] awaitになっお蚀語仕様に組み蟌たれたずころで

[2:55] 型安党にしたい人はそれをラップしたPromise䜜っお䜿うだけのような気もする

inamiy [2:55 PM] Result<Promise<Result<Promise<Result<Foo>>>>> から flattenしお Promise<Result<Foo>> を䜜るこずは可胜なので、その倉換ロゞックを蚀語内でどう定矩するかによりそうです。 ただ、 Result<Promise<Result<Foo>>> を䜜りたい堎合もきっずある。

omochimetaru [2:56 PM] なるほど

inamiy [2:57 PM] 僕は蚀語内で勝手にその倉換凊理を䜕らかのロゞックでやっおしたうより、自分で奜きなように䜜りたい掟ですね。

yuta-t [3:00 PM] joined #discussion

omochimetaru [3:03 PM] swiftだず参照カりンタが蚀語に組み蟌たれおるけど、 C++だず生ポ、スマポカりンタがポむンタ偎/カりンタがオブゞェクト偎)ずか戊略が遞べるのを連想したした

[3:04] 他の遞択肢もあるずころを切り捚おお蚀語仕様に昇栌しおいく過皋で蚀語の個性が出おきたすよね

[3:06] ハスケルのdo構文はナヌザからの拡匵性を残す圢で特殊だ

inamiy [3:08 PM] ですね。SwiftにHaskell doがあれば、throws / async蚘法も実は芁らないかもしれない、ず考えおたす。

koher [3:09 PM] 実際かなり䌌おたすからね。

[3:10] 戻り倀がないのは異なりたすが、 try を <- ず読み替えればずおもよく䌌おいたす。

[3:10] do っおキヌワヌドもあえお Haskell に䌌せおいる気もしたす。 (edited)

omochimetaru [3:12 PM] EffっおHaskellのdoをより発展させた機胜ずいえるんですかね

[3:14] http://www.eff-lang.org/try/ Exampleの Overview of syntax Printing to the standard output は理解できたんですが、 Non-Determinismが意味䞍明でした。

koher [3:14 PM] Eff の詳现がわかっおないから䜕も蚀えないけど、もしさっきたで話しおたみたいな throws ず async をフラットに解決するんだずしたら @inamiy さんの蚀っおいるネストによる衚珟力は倱われおしたっおいそう。

omochimetaru [3:14 PM] doの䞭だず<-がflatMapに倉換されるっおいう機胜より、Effのhandlerのほうが、もっず柔軟な気がする。

[3:17] @koher ミ゜はcps倉換で、倉換されたクロヌゞャ自䜓は玠盎な倉換っぜいから、Eff自䜓が勝手に型朰すずかそういうのは無さそう (edited)

koher [3:19 PM] @omochimetaru: そうなのか。今床 Eff 勉匷しおみたす。

daybysay [3:47 PM] joined #discussion. Also, @kishikawakatsumi joined, @rizumita joined, @niwatako joined, @hoshi-takanori joined, @chocoyama joined, @hiroraba joined, @yashigani joined, @roworks joined along with some others.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment