00:01:08 @lo48576@mastodon.cardina1.red
icon

スパムアカウント(物理)

12:59:54 @lo48576@mastodon.cardina1.red
icon

PayPal、死去したユーザーに死去は規約違反だと通告 | スラド IT
it.srad.jp/story/18/07/13/2345

Web site image
PayPal、死去したユーザーに死去は規約違反だと通告 | スラド IT
13:00:20 @lo48576@mastodon.cardina1.red
icon

脱法死去

14:18:34 @lo48576@mastodon.cardina1.red
icon

文脈を把握してないけど、 pulseaudio と ALSA 的なノリの何事かが container でも必要とされているっぽい??(わかってない)

14:20:09 @lo48576@mastodon.cardina1.red
icon

みんなこんな朝早くから起きててすごいなぁ

14:20:49 @lo48576@mastodon.cardina1.red
16:03:50 @lo48576@mastodon.cardina1.red
2018-07-14 15:58:17 Kuropen 【10/12停止予定】の投稿 kuropen@talknet.akabe.co
icon

このアカウントは、notestockで公開設定になっていません。

16:05:42 @lo48576@mastodon.cardina1.red
icon

それを言ったら、個人サイトだろうが商業同人問わず出版だろうが演説だろうが、いかなる言論の場においても、完全な匿名でない限りは別の場所から横槍が入るわけで、そんなものは今に始まったものでもないし、この問題について ActivityPub が特筆すべき何かを提供しているわけではないのも、それはそう

16:06:20 @lo48576@mastodon.cardina1.red
2018-07-14 16:04:46 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

ていうか、なのでインターネットで「見せない」って対策は基本的に無駄かも>< 大きいものに守ってもらう(例えばツイッターの鍵アカとか)のではなければ><

16:07:46 @lo48576@mastodon.cardina1.red
icon

公開されたくない話、気持ちはわかるがそりゃ無理よとしか思わないし、「どうしても秘匿したくば自分でそれ用のサービスを持て」としか

16:08:28 @lo48576@mastodon.cardina1.red
icon

少なくとも ActivityPub は Pub するものだし、そうでない使い方ができるにしろ、基本的に秘匿する何事かに使うものではない

16:10:03 @lo48576@mastodon.cardina1.red
icon

目的にあった道具を使ってほしい(し、インターネットや web がどういう道具なのか少しはわかってないと頓珍漢なアイデアしか思い付けないので、多少はそっちにも目を向けてほしい)

16:10:38 @lo48576@mastodon.cardina1.red
2018-07-14 15:59:53 おさの投稿 osapon@mstdn.nere9.help
icon

同人のクラスタで見かける「同士に届いて欲しいけど、無関係な人から突っ込みを受けたくないのでひっそりしたい」の扱いが難しい。

16:11:22 @lo48576@mastodon.cardina1.red
icon

結局、それは道具や原理よりも「同志判定」「敵判定」あたりの人間的判断基準の話だから……

16:12:33 @lo48576@mastodon.cardina1.red
icon

極論言えば、「自分の同志かを完全に正確に判定する方法」みたいなのが用意できるなら、部分的に開いている閉じた場だって技術的には可能

16:13:14 @lo48576@mastodon.cardina1.red
icon

問題なのは公開非公開の仕組みの部分ではなく、「この人には公開したい/したくない」の判定の部分

16:14:08 @lo48576@mastodon.cardina1.red
icon

これを人間に完全に委託したのが登録型の閉じたグループ管理であって、そっちの方が向いているならそれを使えばいい

16:15:46 @lo48576@mastodon.cardina1.red
icon

なぜ人は、原理的に禁止できないことを禁止しようとするのか

16:16:01 @lo48576@mastodon.cardina1.red
icon

ちゃんと前提と環境を見直して

17:18:11 @lo48576@mastodon.cardina1.red
icon

418は HTTP じゃねえよ

17:18:28 @lo48576@mastodon.cardina1.red
icon

HTTP サーバに 418 I'm teapot を実装するのはアカンやで

17:19:26 @lo48576@mastodon.cardina1.red
icon

パイソョンなぁ

17:19:47 @lo48576@mastodon.cardina1.red
icon

人間なんだから変数くらい型を付けようね (ハイ炎上)

17:24:49 @lo48576@mastodon.cardina1.red
2018-07-14 17:24:09 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

そういえば、関数型言語文化圏の人々って「型を!」「型ありきの発想!!」って言うわりに、「自明なら書かなくてもいいよね」って型推論多用しまくる人が多い気がするのすごく謎かも><

17:24:52 @lo48576@mastodon.cardina1.red
icon

あれなぁ

17:25:21 @lo48576@mastodon.cardina1.red
icon

や、高階関数とか多用すると型変数ばかりになって大して嬉しくないようなことはあるんでしょうけどね

17:25:53 @lo48576@mastodon.cardina1.red
icon

Rust は関数のパラメータと戻り値について型を指定しなければならない (変数や式では省略できる) ので、その辺り結構バランスが良いと思っている

17:28:14 @lo48576@mastodon.cardina1.red
icon

どちらかというと私は x とか xs とか x'' みたいなめちゃくちゃ短い変数名が苦手ですね

17:31:22 @lo48576@mastodon.cardina1.red
icon

や、高度に抽象化したとき名前に意義を持たせられなくなるというのもわかるんですが、それはまあわかるとして、私の脳がそういうのを解釈して記憶しておけるほど性能良くないから……

17:31:52 @lo48576@mastodon.cardina1.red
2018-07-14 17:30:28 TGMのサントラ販売中の投稿 Common_Lisper@mstdn.maud.io
icon

このアカウントは、notestockで公開設定になっていません。

17:32:48 @lo48576@mastodon.cardina1.red
2018-07-14 17:32:27 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

例えば(架空の言語として)
//これは整数になります
let hoge = 1;
みたいな記述でも、なんか「・・・><;」ってなる><;(極端に言うとサフィックス必須とかにしてほしい><;)

17:33:04 @lo48576@mastodon.cardina1.red
icon

や、型をサフィックスにするのはなぁ

17:34:35 @lo48576@mastodon.cardina1.red
icon

たとえば

let url = "example.com/"; // ここで文字列
let url = Url::parse(url).expect("Invalid URL"); // ここで Url 型

みたいなシャドーイングしたい場合があって、これもまあ賛否分かれるかもしれないけど、あくまで変数の意味を扱ってロジックを書きたいならこれもアリだと思いますね

404 - Not Found
17:35:21 @lo48576@mastodon.cardina1.red
icon

あと、シャドーイングをすると、たとえばこの例だと「2回目の束縛以降で、不正でありうる文字列型の URL データにアクセスできなくなる」という利点がある (URL でなく文字列として取り出したければ、明示的にそういう操作を行うべき)

17:36:30 @lo48576@mastodon.cardina1.red
icon

たとえば

let age = read_line();
let age = age.parse::<u32>().expect("Invalid age");

みたいにすれば、あるべき型の age にしかアクセスできなくなるので、 age_str と age_int が共存するよりも望ましいと考えることができる

17:40:40 @lo48576@mastodon.cardina1.red
icon

まあブロックが式を返せることを使って

let age = {
let age_str = read_line();
age_str.parse::<u32>().expect("Invalid age")
};

のようにすることもできるけど(私はこっちの方が好みかな)

17:43:29 @lo48576@mastodon.cardina1.red
icon

ただ、この方式だと lifetime あたりの問題があって、たとえば

let name = read_line(); // 所有権ありの文字列
let name = name.trim(); // 旧 name の一部を borrow しているスライス

みたいなことができない (旧 name の生存期間が新 name の生存期間以上でなければならない) ので、万能ではない

17:44:47 @lo48576@mastodon.cardina1.red
2018-07-14 17:40:58 やんてねの投稿 yantene@fla.red
icon

このアカウントは、notestockで公開設定になっていません。

17:45:07 @lo48576@mastodon.cardina1.red
icon

これはすごくわかるし、同時に、設計思想の合わない言語は(書けるんだけど)とてもとても書きたくないという気持ちがある

17:47:12 @lo48576@mastodon.cardina1.red
icon

授業のチーム開発で Python でサーバ書いてるチームが苦しんでるのを傍目に見ながら Rust でサーバ書いてるマンです

18:03:00 @lo48576@mastodon.cardina1.red
2018-07-14 18:02:04 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

同一スコープ内での同名変数の再宣言とシャドウイング|Rustでは再宣言が可能 qiita.com/aimof/items/01911a18

"別の言語ではどうなるか? その2:再宣言できる言語"

"Haskellでは、再宣言可能です。ちなみにHaskellの変数(と呼ぶのが適切かはわかりませんが)はimmutable(不変)です。"
めっちゃくちゃ変化してるじゃん?><;

Web site image
同一スコープ内での同名変数の再宣言とシャドウイング|Rustでは再宣言が可能 - Qiita
18:03:16 @lo48576@mastodon.cardina1.red
icon

monad の do 記法を以て再宣言可能とするのは大嘘では????

18:03:47 @lo48576@mastodon.cardina1.red
icon

ちょっとこの記事は……

18:04:16 @lo48576@mastodon.cardina1.red
icon

あと Rust の shadowing は redeclaration ではないと思います

18:05:45 @lo48576@mastodon.cardina1.red
icon

let foo = 1;
let foo = "foo";
bar(foo);

というのは、実際には

{
let foo = 1;
{
let foo = "foo";
{
bar(foo);
}
}
}

のようなことをやっているわけで、 shadow された変数が消えるわけでもないし破棄されるわけでもないし上書きされるわけでもない、あくまで shadow されて「名前で」参照できなくなるだけ

18:07:00 @lo48576@mastodon.cardina1.red
icon

C でもブロックを明示すれば同じことはできるので、よーするに Rust ではブロックを暗黙に作ってくれるというだけのようなもの (あと Rust ではブロックも式であり値に評価されるので、この解釈とは相性が良い)

18:07:27 @lo48576@mastodon.cardina1.red
2018-07-14 18:07:23 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

ある意味スタックっぽい挙動?><;

18:08:00 @lo48576@mastodon.cardina1.red
icon

ある意味というか(最適化後の実装はさておき、表面的な振舞いは)完全にそうです。変数の破棄も、基本的に宣言の逆順で行われます

18:21:51 @lo48576@mastodon.cardina1.red
2018-07-14 18:21:03 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

さっきのURLの処理みたいなの、オレンジの好みの架空言語ならば・・・><;
ReadOnly StringUTF8 url_string = "example .com";
Url url = new Url( url_string );

url.Check();
//不正な文字列なら例外

bool urlDanepposa = url.IsInvalidURL;
//不正かどうかのプロパティ

bool urlDaijoubupposa = url.IsValidated;
//ポジティブとネガティブもどっちも要るよね!><;

18:21:55 @lo48576@mastodon.cardina1.red
icon

うーん

18:23:08 @lo48576@mastodon.cardina1.red
icon

Url 型のオブジェクトが出現したその瞬間から死ぬまで、ずっと Url は URL として valid な値しか持てないでほしい (型を妥当な値の集合として考えれば) ので、 new からの url.Check() で例外を飛ばすのは、ちょっと型の意味が弱すぎるかなぁという気持ちがしますね

18:24:18 @lo48576@mastodon.cardina1.red
icon

理想的には型チェックが通った時点で、表明されていたあらゆる制約が満たされていることを確認したいわけで、「URL として妥当であるか」というのは「Url 型のオブジェクトとして存在できるか」と一致してほしい

18:26:49 @lo48576@mastodon.cardina1.red
icon

C++ も (iostream 辺りは歴史的事情か例外のパフォーマンスの事情かアレな感じだけど)、基本的に「不正な状態のオブジェクトを作らず、 ctor で例外を投げろ」という感じになっているし、「正しいものしか存在できない」という感じの世界を作りたさが感じられる

18:27:30 @lo48576@mastodon.cardina1.red
2018-07-14 18:27:20 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

なんでこんな謎方式にしたいかと言うと、宣言時に例外が出ると後始末がぐちゃってするのが嫌で、それを回避できるならチェックするのは分けたいし、毎回チェックする手間が増えてもって感覚がある><;

18:28:02 @lo48576@mastodon.cardina1.red
icon

そこで、例外でなく Result (Haskell なら Either) などを使うことで、正常値と異常値を値として扱えるようにすることで、コードを整理できるわけです

18:28:34 @lo48576@mastodon.cardina1.red
icon

同時に、戻り値型が Result であることで、「必ずしも構築できるとは限らない」という表明にもなっている

18:29:31 @lo48576@mastodon.cardina1.red
18:29:57 @lo48576@mastodon.cardina1.red
icon

Rust に exception は(基本的に)ないです

18:30:37 @lo48576@mastodon.cardina1.red
icon

panic が実質そんな感じの挙動だけど、まあ panic は panic するために使うものであって、復帰はできるけどそういう仕組みは常用されるものではない

18:30:45 @lo48576@mastodon.cardina1.red
2018-07-14 18:30:09 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

ある意味null安全に近い話なのかも?><;(オレンジは、内容が不正であることのフラグとして(手抜きで)null許容型を使うこともたまにある><;)

18:31:03 @lo48576@mastodon.cardina1.red
icon

不正な値でありうるか否かというのも、 Result とか Option とかによって型で表現されてほしい

18:31:44 @lo48576@mastodon.cardina1.red
icon

std::sync::Mutex - Rust
doc.rust-lang.org/stable/std/s

たとえば Mutex::lock() なんかちょっと面白いんですが

18:32:24 @lo48576@mastodon.cardina1.red
18:34:32 @lo48576@mastodon.cardina1.red
icon

std::sync::PoisonError - Rust
doc.rust-lang.org/stable/std/s

mutex を持ったスレッドが解放しないまま死んだ場合、 mutex で管理されている値が不正状態になっている場合があるので、それを表現するために PoisonError<T> でラップされている

18:37:21 @lo48576@mastodon.cardina1.red
icon

「壊れているかもしれない値を生で返すな」というお気持ちですね

18:38:30 @lo48576@mastodon.cardina1.red
icon

PoisonError の中はある種の聖域のようなもので(潜在的に)壊れた値の存在が認められているけど、ここから(壊れているかもしれない)値を取り出して正常な値の世界に持ってくるのはプログラマの責任

18:38:57 @lo48576@mastodon.cardina1.red
2018-07-14 18:38:15 やんてねの投稿 yantene@fla.red
icon

このアカウントは、notestockで公開設定になっていません。

18:40:51 @lo48576@mastodon.cardina1.red
2018-07-14 18:34:18 unaristの投稿 unarist@mstdn.maud.io
icon

このアカウントは、notestockで公開設定になっていません。

18:41:56 @lo48576@mastodon.cardina1.red
2018-07-14 18:39:40 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

オレンジの物事の発想が「世の中は全て、機能と状態の集合で出来ている!><」って発想で、その延長で、ある型のものの状態にも「正常である状態」と「正常ではない状態」があるかも><って発想で、物事を考えてるかも・・・><

18:42:42 @lo48576@mastodon.cardina1.red
icon

「正常でない」にも複数種類あるわけで、いわゆる異常系と正常系みたいな話になるけど……

18:44:25 @lo48576@mastodon.cardina1.red
icon

たとえば「文字列を URL にしたい」が失敗したとき出てくるのは「URL にしたかったけどできなかった『文字列』」であるわけで、であればこれは Url 型で表現できなくても文字列型として表現できるわけで、「正しい状態しか表現できない」というのはそういう程度の話です

18:45:26 @lo48576@mastodon.cardina1.red
2018-07-14 18:44:20 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

返す時に例外だしてもよくない?><(もちろんエラーはなるべく早く出したいので、チェックは明示的に(><;)早くやるべきだけど、忘れてたら返す時に最後の砦として的な><)

18:45:45 @lo48576@mastodon.cardina1.red
icon

これって、「潜在的に壊れているかもしれないけどわからない値」を持ち回っているわけで、何が嬉しいのかという話です

18:47:33 @lo48576@mastodon.cardina1.red
icon

「Url 型を持ち回って、いざ大事な場面で URL を得ようとするとエラーになりうる」というのと、
「String 型を持ち回って、いざ大事な場面で Url に変換しようとするとエラーになりうる」というのと、
大差ないはずだし、であれば「Url 型が必ず正しい URL を持っている」ということを表明できる後者の方が型による制約が強くかかっていて望ましいように思われます

18:48:24 @lo48576@mastodon.cardina1.red
icon

あるいは、 Invalid でありうる (get 時にエラーを投げうる)値を事前にチェックして正当性を確認したとして、その正当性が型に現れないのって、型の制約表明が弱くないですか?という

18:50:43 @lo48576@mastodon.cardina1.red
icon

Rust における panic の扱いは、「プログラムが(エラーハンドリングまで含めて)実行されてよい条件が満たされなくなった」という意図の表明であって、ゆえに異常終了するわけですが、「実行されなくてよい条件」はユーザがコードによって明示します
(たとえば、 Option::unwrap() などを使うと、「 None が返ってきたらもはやプログラムが扱う状況の範囲外なので、前提条件が満足されなくなった」ということで panic して落ちる)

18:50:51 @lo48576@mastodon.cardina1.red
2018-07-14 18:49:18 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

オレンジ的にはURLはURLであって(さっきの例に限って言うのであれば)文字列ではなくて、不正な文字列から作られたurlは、urlを作りたかったけど失敗してぶっ壊れたもので、文字列は明示的にrawな文字列として取り出す場合以外では、例えば文字列型にキャスト出来るのであれば、その時にも例外を出してほしいかも><;

18:51:19 @lo48576@mastodon.cardina1.red
icon

?ちょっと解釈に失敗した

18:52:36 @lo48576@mastodon.cardina1.red
icon

1. String → Url
2. Url に対してなんらかの操作 (たとえば path を得るなど)

のどちらでエラーが出るかという話はわかるんですが、 URL として壊れた文字列の扱いについての言及がよくわからない

18:55:49 @lo48576@mastodon.cardina1.red
icon

変換で所有権が移動されない場合は元の値が破棄されないのでいいとして、所有権が移動される場合は、たとえば

String::from_utf8()
doc.rust-lang.org/stable/std/s

がバイト列から UTF-8 文字列への変換に失敗したとき

FromUtf8Error
doc.rust-lang.org/stable/std/s

型の値を返すのですが、これが FromUtf8Error::into_bytes() を持っていて、ここから変換に使おうとしていた元の値を得られます

18:58:45 @lo48576@mastodon.cardina1.red
icon

この場合、

「成功すれば String が得られる、失敗すれば(それ専用の)エラー型の値が得られる」
「エラー型の値はエラーの状況を保持しており、そこから元の Vec<u8> を得られる」

ということになっているわけで、「文字列にしようとしたけど UTF-8 として壊れている文字列」はあくまで文字列ではないし、かつバイト列へは失敗の可能性なく戻すことができるという状況なので、これに特に不都合や駄目さを感じたことはないです

18:59:53 @lo48576@mastodon.cardina1.red
2018-07-14 18:59:15 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

基本的にはURLとして不正な文字列を内部に持つUrlは存在しない方がいいかも>< なので不正ではないかのように扱おうとした瞬間に例外をはいてほしいんけど、
ただし!><;宣言や、コンストラクタを呼ぶ場面だけは例外出されて後始末の流れがぐちゃぐちゃになるのがいやなので、そんな変な事に><;

19:00:43 @lo48576@mastodon.cardina1.red
icon

私は「Url 型の値として存在させる」こと自体が「URL として不正でないものとして扱っている」と見做しているので、その辺りか

19:01:19 @lo48576@mastodon.cardina1.red
icon

あとは「URL として正しいことが既に確約されている」という、特徴というか情報を型に持たせているという意識がある

19:01:43 @lo48576@mastodon.cardina1.red
icon

あと例外のフローについては、それは単に例外の扱いが悪い言語に慣れているのではみたいな気持ちです

19:03:12 @lo48576@mastodon.cardina1.red
icon

Rust の話になってしまうけど、エラーも結局単なる型と値として扱われるので、特になにかフローが滅茶苦茶になったりすることはないです

19:05:20 @lo48576@mastodon.cardina1.red
icon

Recoverable Errors with Result - The Rust Programming Language
doc.rust-lang.org/book/second-

この辺り

Recoverable Errors with Result - The Rust Programming Language
19:06:48 @lo48576@mastodon.cardina1.red
icon

Rust ではエラーをその場で処理するにしろ呼び出し元に伝播させるにしろ、それは明示的だし、かつそれ用の簡潔な手段が用意されているので (Result::and_then とか Option::unwrap_or とか)

19:07:44 @lo48576@mastodon.cardina1.red
icon

暗黙であることはよろしくない、みたいな意識が割と強くある(たとえば処理フローであったり制約であったり mutability であったり)

19:08:46 @lo48576@mastodon.cardina1.red
icon

あと明示的であることは必ずしも煩雑であることを意味しないし、古い言語の都合は忘れてくださいという感じです

19:10:38 @lo48576@mastodon.cardina1.red
2018-07-14 19:09:11 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

URLだとあれだけど、URLの型の変数を作ろうとして準備してしまった何らかのリソースを失敗した結果好きな順番(環境上の都合に適した順番)で後始末したいって発想がある><;(小さなもの(?)なら例外の所から逆に破棄していけばなんとかなるけど、そうじゃない何らかのハードウェア上の都合とかがある場合に・・・><)

19:11:23 @lo48576@mastodon.cardina1.red
icon

デフォルトの(スコープ逆順の)破棄の順番でないやりかたで値を破棄したい場合、 drop() すればいいので

19:11:56 @lo48576@mastodon.cardina1.red
icon

あと、その drop 後に値が生き残りうるのであれば、それは Option<T> とかで表明されるべき

19:13:46 @lo48576@mastodon.cardina1.red
icon

「絶対に壊れていない」「壊れているかもしれない」もまた、ドキュメントではなく型の在り方によって明示されるべきという考えで、どうしても「壊れているかもしれない」という状態を持ち回りたいのであれば、

enum MaybeValid<S, T, E> {
Valid(T),
Invalid(E, S),
Unchecked(S),
}

みたいな型を作って、
MaybeValid<String, Url, UrlParseError>
みたいな型の値を持ち回るべきという感じです

19:14:53 @lo48576@mastodon.cardina1.red
2018-07-14 19:14:41 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

ていうかRustとか的発想(?)で言うならば、「なんとか型」と「なんとかが壊れてる型」を作って、後始末に必要なものはどちらにも持たせるってすれば、オレンジの発想に近い?><

19:14:56 @lo48576@mastodon.cardina1.red
icon

それです

19:16:31 @lo48576@mastodon.cardina1.red
icon

たとえば「なんでも goto を使うより while や for や iterator を」とか「なんでも再帰を使うより map や filter や fold を」みたいなのと同じで、高階のものとパラメータを組み合わせることで制約を人間にとってわかりやすく、かつ機械が理解可能な状態で表現するということが可能になります

19:17:50 @lo48576@mastodon.cardina1.red
icon

型でも同じようなことをやってほしくて、「なんでも単一の型を用意してドキュメントで補足するよりも、 Result とか Option とかその他『意味だけを表明する容れ物』を利用して意図する型を作る方がよい、という感じです

19:19:30 @lo48576@mastodon.cardina1.red
icon

そうなったとき、一番基本になる型は「必ず○○である」という制約を表明できる型であって、そういうものを作る。これを組み合わせて制約を弱くすることは簡単だし

19:19:45 @lo48576@mastodon.cardina1.red
icon

再利用性の観点でもこっちの方がいい

19:25:20 @lo48576@mastodon.cardina1.red
icon

mastodon.cardina1.red/@lo48576
意味というか意図か? まあいいや

Web site image
らりお・ザ・何らかの🈗然㊌ソムリエ (@lo48576@mastodon.cardina1.red)
19:28:45 @lo48576@mastodon.cardina1.red
icon

継承は is-a 関係なので、あまり……

19:29:16 @lo48576@mastodon.cardina1.red
icon

"possiblly-broken-url is a url" は自明に偽だし……

19:30:00 @lo48576@mastodon.cardina1.red
icon

"url is a possibly-broken-url" はまあ真ですけど、「壊れてるかもしれない○○型」を継承して「○○型」を作るのってどうなのという感じしません?

19:31:17 @lo48576@mastodon.cardina1.red
icon

Option とか Result みたいなコンテナ的なジェネリックな型は「制約を弱める」方向に作用するので、それゆえ基本部品を強い制約で作ろうという感じになります

19:33:08 @lo48576@mastodon.cardina1.red
icon

継承は……どうなんでしょうね……

19:34:16 @lo48576@mastodon.cardina1.red
icon

あれも制約を強める方向にいきますけど、基底型が弱い制約で作られて、そこから派生していろいろ作る感じになるので、「まず最初に表明の弱い型を作ります」という感じになって、うーん

19:34:22 @lo48576@mastodon.cardina1.red
2018-07-14 19:34:00 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

壊れてない型を継承して、壊れてるインタフェースをくっつけた壊れてる型を作れば、「これって壊れてる型?(=壊れてるインタフェース持ってる?)」って型チェックもできるかも・・・><

19:34:57 @lo48576@mastodon.cardina1.red
icon

インターフェースは実装を増やすことにはなるけど状態を増やすことはできないと思うので、「壊れている型を表明するインターフェース」はあまり意味なさそう

19:35:32 @lo48576@mastodon.cardina1.red
icon

むしろ、 possibly broken な型について「これは必ず正しい値を持っていますインターフェース」を用意する方がインターフェースとして正しそう?

19:37:23 @lo48576@mastodon.cardina1.red
icon

std::iter::ExactSizeIterator - Rust
doc.rust-lang.org/stable/std/i

たとえば Rust ではイテレータが長さを見積って (usize, Option<usize>) による範囲で返すことになっている(つまり曖昧、潜在的に不正確)んだけど、「このイテレータ型は何が何でも絶対正しい長さを知っとるんやで!!!」ということを表明するために ExactSizeIterator という trait (実質 interface) を対象イテレータ型に対して実装する

19:39:20 @lo48576@mastodon.cardina1.red
icon

そもそも「もしかして壊れてる○○型」と「壊れてない○○型」を両方作るのって明らかに重複多くて無駄なので、
「○○型」と「もしかして壊れてる表明」だけ用意して、「もしかして壊れてる<○○>」を使うと、新たな型をいちいち名付けたり定義せず使える

19:40:17 @lo48576@mastodon.cardina1.red
icon

名付けず使えると、表明 (「もしかして壊れてる<○○>」の「もしかして壊れてる」部分)がそのまま露出するので素敵になる

19:41:39 @lo48576@mastodon.cardina1.red
icon

型パラメータで渡すのも木構造みたいなもんだし、このくらいのケースであれば継承を使わずとも綺麗に表現できますね

19:43:40 @lo48576@mastodon.cardina1.red
2018-07-14 19:43:09 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

それオレンジの最初の「壊れてるかも」モデルに壊れてるかもインタフェースを標準化して追加したらほぼそれのような・・・><(nullは「壊れてる」ではないけど、null流用で言うならnull許容型っぽさ・・・><)

19:44:52 @lo48576@mastodon.cardina1.red
2018-07-14 19:44:42 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

壊れてるかも許容型?><(null許容なるべくやめようって潮流のなかでは流行らなそう><;)

19:45:05 @lo48576@mastodon.cardina1.red
icon

デフォルト許容かデフォルト拒否かというのは、うーん……

19:47:05 @lo48576@mastodon.cardina1.red
icon

デフォルト許容だと「制約を追加して値域を小さくしていく」という方式になるんでしょうけど、その制約も実装方法も、元の(たとえば文字列であったり整数であったり)型の中身によるわけで、あまり統一的には実現できなそう

19:48:37 @lo48576@mastodon.cardina1.red
icon

で、デフォルト拒否で「拒否する値を追加していく」という方式だと、追加される値自体は enum の variant であったり既存の型で表明可能なわけで、しかも多相型を使えば「値を(元の型の値の集合に)追加する」というのは元の型の表現や内容に全く依存せず実現可能である

19:49:20 @lo48576@mastodon.cardina1.red
icon

典型的には「Option<Option<T>>」をデフォルト null 許容でどう表明するのか、というような話がありまう

19:50:32 @lo48576@mastodon.cardina1.red
icon

あります

19:53:00 @lo48576@mastodon.cardina1.red
icon

まあ Option<Option<T>> はべつに Unspecified / ExplicitNull / ExplicitValue のような variant で enum 作ってもいいんですが……

19:55:57 @lo48576@mastodon.cardina1.red
icon

たとえば
enum ConfigEntry<T> { Unspecified, ExplicitNull, ExplicitValue(T) }
から Unspecified を取り除くには、 ConfigEntry の定義についての特別な知識が要求されるわけで、「デフォルトが null 許容型で、特殊な仕組みや記述で null を取り除く」というのは、本質的にはそういった不自然な処理をやっているのではと思うわけです(すべての型が潜在的に Option<T> のような構造を持っているという特殊な状況だから不自然に見えないだけで)

19:56:34 @lo48576@mastodon.cardina1.red
icon

で、たとえば Java の boxing あたりの話だとこの「すべての型が潜在的に Option<T> という構造を持っている」の仮定が破れるので、ハイ滅茶苦茶、と

19:56:57 @lo48576@mastodon.cardina1.red
icon

なにかを作るときコンポーネントは小さく単純であってほしいですね

20:20:05 @lo48576@mastodon.cardina1.red
2018-07-14 20:17:52 orangeの投稿 orange_in_space@mstdn.nere9.help
icon

そういえば、なんでmathって名前がついてるような数学な標準ライブラリ、どの言語のでもほとんど(?)、maxとminはあっても、最大値と最小値を両方指定してその範囲にカットする(?)って無いっぽいんだろう?><
特にGUIでは使う場面が結構あると思うんだけど・・・><

20:20:08 @lo48576@mastodon.cardina1.red
icon

clamp ですか

20:20:42 @lo48576@mastodon.cardina1.red
icon

clamp - OpenGL 4 Reference Pages
khronos.org/registry/OpenGL-Re

GLSL にはある(一般の言語ではないけどw)

20:21:25 @lo48576@mastodon.cardina1.red
icon

まあ min(upper, max(lower, v)) ってちょっと考えないと逆に書いてしまうので、欲しいといえば欲しいような

20:24:05 @lo48576@mastodon.cardina1.red
icon

どうなんだろう、 min / max よりも条件演算子とかで書けという天の意思だったりするのだろうか (GLSL とかだと条件分岐は致命的なので clamp があるのはわかる)

21:16:42 @lo48576@mastodon.cardina1.red
2018-07-14 11:23:03 Izumi Tsutsuiの投稿 tsutsuii@social.mikutter.hachune.net
icon

このアカウントは、notestockで公開設定になっていません。

21:16:43 @lo48576@mastodon.cardina1.red
2018-07-14 20:45:20 やっさんの投稿 toshi_a@social.mikutter.hachune.net
icon

このアカウントは、notestockで公開設定になっていません。

21:25:09 @lo48576@mastodon.cardina1.red
2018-07-14 21:23:51 TGMのサントラ販売中の投稿 Common_Lisper@mstdn.maud.io
icon

このアカウントは、notestockで公開設定になっていません。

21:28:41 @lo48576@mastodon.cardina1.red
2018-07-14 21:21:21 shONe🍌🎨🔞の投稿 shONe_Banana@pawoo.net
icon

このアカウントは、notestockで公開設定になっていません。