X



Closures vs Objects
0001デフォルトの名無しさん
垢版 |
2024/02/19(月) 20:39:15.91ID:VT95BnI9
It is well-known that closures and objects are equivalent. So are actors. Which one is the most fundamental?

よく知られたように、クロージャとオブジェクトは等価です。アクターも同様です。どの概念が最も基本的なのでしょうか?
0107デフォルトの名無しさん
垢版 |
2024/03/15(金) 09:10:45.64ID:5Fl9dqIV
>>104
物理学科の自称秀才がやたらと素粒子論専攻したがるのもこれだよなぁ……
実際に勉強して内容に興味を持てたかどうかではなくて、ラベルで判断してる
20過ぎた大人が将来の進路に関わる選択でそういうことするのは、病的としか言いようがない
0108デフォルトの名無しさん
垢版 |
2024/03/15(金) 12:38:47.19ID:ohT/C40H
>>99
ってことは>>31の方法でも菱形継承問題ふつうに発生するやん

Iterable < Callable
__call__ = __next__

Associative < Callable
__call__ = __getattr__

Array < Iterable, Associative
__next__ = piyopiyo
__getattr__ = hogehoge

arr = Array(blahblahblah)
arr() はどっちになるべき?
0109デフォルトの名無しさん
垢版 |
2024/03/15(金) 14:11:38.88ID:DTF+UIWv
a) 実装継承
b) 多重継承
c) 多段階継承

ができる時点で菱形継承問題は避けられない
Rubyは、クラスは(b)を、モジュールは(c)を諦めることでこの問題を回避している
0110デフォルトの名無しさん
垢版 |
2024/03/15(金) 14:37:43.94ID:zsH6n39D
>>108
pythonはそうだよ
0111デフォルトの名無しさん
垢版 |
2024/03/15(金) 16:37:06.04ID:HEyD2qcN
Rubyのrefinementsみたいに、このスコープでは型定義を変えるみたいなのがあればまだマシになんのかな
たとえば、あるブロック内でだけ(Int, Int)をPoint2Dとみなすとか
0112デフォルトの名無しさん
垢版 |
2024/03/15(金) 17:16:49.88ID:Ratd2baE
>>108
・具象型とインタフェースを分ける
 具象型→Int, Str, List<T>など
 インタフェース→Comparable, Iterableなど
・多重継承したインタフェースで仮想でないメソッドに名前の重複があったらエラーにする

とするしかないのでは
0113デフォルトの名無しさん
垢版 |
2024/03/15(金) 17:20:27.60ID:Ratd2baE
型とインタフェースは分けないと、たとえば

equal(x: Eq, y: Eq) -> bool

とか無意味になる
xとyには具体的な型が同じものが入ってほしいのに、Eqインタフェースを持っている型すべてを許容してしまう
ほんとうにやりたいのは

equal(x: T, y: T) -> bool where T: Eq

ということ
0114デフォルトの名無しさん
垢版 |
2024/03/15(金) 17:33:55.76ID:UiCkupYq
型システムと並行性はむずかしいな
でも、言語がプログラマに好まれるかどうかってそんなとこにないと思うよ
一時期、高機能なタスクランナーやら単体テストフレームワークやらがたくさん出てきたけど、結局はnpm-scriptsとか言語標準のunittestライブラリに収束した
0115デフォルトの名無しさん
垢版 |
2024/03/15(金) 17:40:58.53ID:UiCkupYq
powershellはプログラミング言語としてはbashよりもはるかに高機能だが、誰もあれで書きたいとは思わない
0116デフォルトの名無しさん
垢版 |
2024/03/15(金) 18:11:48.66ID:RqiZ+uh9
>>108
inheritanceを型に対して行うのが間違いな気がする
Int x Intを、Point2DとRationalのサブクラスとしたとする
Point2DとRationalの両方に + を実装(前者にはベクトルとして、後者には有理数として)したとして、

(1, 2) + (3, 4)

はどうなるか?
それは結局、今(1, 2), (3, 4)をどの型だとみなしているかによるのであって、型Int x Intの与り知らぬところだ
0117デフォルトの名無しさん
垢版 |
2024/03/15(金) 18:25:53.61ID:C8O2+ggF
>>109
Mixinで多重継承問題回避できる理屈がよくわからんかったけど、今ようやっと理解できたわ
0120デフォルトの名無しさん
垢版 |
2024/03/15(金) 21:35:17.15ID:XzxHtHqU
ダイヤモンド継承は、コンパイラが検出するのが正しい気がする
構文で回避するには、>>109みたく機能を制限するしかない
RustとHaskellはしてくれる
0121デフォルトの名無しさん
垢版 |
2024/03/15(金) 21:53:50.95ID:WMhMrtUW
まあ、でもプログラミング言語が人気になるかどうかは
>>114の言うように、処理系の完璧さではなく、実用のニーズに耐え得ることなんだろうな
0122デフォルトの名無しさん
垢版 |
2024/03/15(金) 22:34:31.87ID:3o/QlmnN
クロージャとオブジェクトが同等なのはわかったが、それよりもさらに強力な言語機能はないのか?
0123デフォルトの名無しさん
垢版 |
2024/03/15(金) 23:30:35.88ID:rbMui8Ez
継続

プログラマが直接触らないものとしては、ガベージコレクションとかレキシカルクロージャとかもそうかもね
0124デフォルトの名無しさん
垢版 |
2024/03/16(土) 20:49:53.31ID:TBzj9DHS
Eiffel、Delphi、C#なんかは菱形継承してもそれぞれに別名を与えて捌ける機能を持ってるが
オブジェクト指向自体が下火なのもあって、最近のやつはそこまで作り込まれてない感
0125デフォルトの名無しさん
垢版 |
2024/03/16(土) 21:44:17.40ID:gqfrZq4+
多重継承は名前がぶつかろうがそれ自体に問題は一切ない
抽象型から具象型への継承で実装継承でないならば区別できる限り問題は生じない

本質的な問題は実装継承であること
特にに具象型から具象型への継承が問題
これは多重かどうかに関係なく問題となる
0126デフォルトの名無しさん
垢版 |
2024/03/16(土) 22:15:39.23ID:ajdJdfuW
そもそもOOPにおける継承ってのは、数学的に破綻してるんだよ
>>116で述べているとおり
型定義にサブタイピングの実装方法が入るわけがない
0127デフォルトの名無しさん
垢版 |
2024/03/16(土) 22:18:29.76ID:ajdJdfuW
自然数 is a モノイド

と自然にみなす方法は2通りある
その方法は自然数の定義とは関係ない
0129デフォルトの名無しさん
垢版 |
2024/03/16(土) 22:30:52.34ID:ajdJdfuW
行列式=1の2次正方行列が、
自分の型はM(2)なのか、GL(2)なのか、SL(2)なのかなんて知らんがな
0130デフォルトの名無しさん
垢版 |
2024/03/16(土) 22:35:57.52ID:TBzj9DHS
>>127の問題は型クラスやtraitでも発生するしなあ
C++で没になったconcept_mapのようなものを複数切り替えられる機能が求められる
0131デフォルトの名無しさん
垢版 |
2024/03/19(火) 03:55:14.66ID:5WuD+qyw
x: T where T: K where K: L where ...

のように高階の型や

fn(x: T) -> Type

のようにパラメータに依存する型などがいくらでも作れたらどんなことができるのだろうか
0132デフォルトの名無しさん
垢版 |
2024/03/19(火) 22:24:36.99ID:TBPz9mXO
>>131
具象型Tに対して抽象型Kの制約を課すところまでは普通として
抽象型Kに対して高階抽象型Lの制約を課すメリットが見つからなかった

代替の方法として高階とせずに
抽象型Kに対して同じレベルの抽象型Lの制約を常に課す宣言ができれば十分にみえる
0135デフォルトの名無しさん
垢版 |
2024/04/07(日) 01:46:27.75ID:HXZiHVf3
全称量化子は関数で
存在量化子はパターンマッチングで
表せるので、一階述語論理もラムダ式で書けそう
0136デフォルトの名無しさん
垢版 |
2024/04/07(日) 05:29:44.44ID:FOjhJ4gr
書けるの意味がわからんな
書いてどうする?
カリー・ハワード対応とかチューリング完全と関係ある話か?
0137デフォルトの名無しさん
垢版 |
2024/04/07(日) 06:21:18.75ID:ZeXbAXZK
存在命題とか背理法とか、仮定を仮引数にしたラムダ式を使えば、具体的に証明や値を構成しなくても所望のものを取ってこられるんだな
0139デフォルトの名無しさん
垢版 |
2024/04/07(日) 09:52:53.31ID:/E0pQilp
res = hoge()みたいにただ結果返すのと、
hoge((res) => doSomething())みたいに引数に結果入ってくるのと、何が違うんや
0140デフォルトの名無しさん
垢版 |
2024/04/07(日) 10:45:31.26ID:thR/d4RZ
まず、hogeが同期的でない場合は

res = hoge()

とは書けない
async/awaitのような機構が必要になる

またたとえば、エラーの場合は処理を分岐させたいような場合、

hoge(
(res) => doSomething(),
(err) => handleError())

のように拡張できる
ただし、内部でさらに同じようなことをやっているとコールバック地獄になる
0143デフォルトの名無しさん
垢版 |
2024/04/07(日) 19:27:40.79ID:m+fa22Uj
純関数型言語でなくても
モダンなプログラミング言語
Go、Rust、Zig、Nim、Julia、Elixirなどは
クラスおよびその継承を言語仕様から排除しておりクラスは存在しない

それら各々の言語は全く異なる方針を採っている言語だがクラス排除だけは全てが同じ方針である
クラスとその継承は悪手であるとプログラミング言語界では結論が出ている
0147デフォルトの名無しさん
垢版 |
2024/04/08(月) 14:29:36.32ID:LhsijIe9
P∧Qの導入則は、P -> Q -> P∧Q
これは(P, Q)ならばP∧Qとも読めるし
Pを仮定したとき、QならばP∧Qとも読める
0148デフォルトの名無しさん
垢版 |
2024/04/09(火) 18:44:27.40ID:kKsSVHOb
限定継続(reset/shift)の動きが意味わかんない
resetで範囲絞ってる分call/ccより実用的には扱いやすいというのは分かるが、ローカルで見たらcall/ccのほうが直感的に思える
0149デフォルトの名無しさん
垢版 |
2024/04/09(火) 23:18:54.13ID:Aro4tJCD
実装の都合では?
フル機能の継続はそこまでのスタック全部を生かし続けないといけないし分岐できないといけないしで
スタック自体をOSの用意してくれるものとは別に自前で構成しないといけないしそうするとABIからなにからつらい
0150デフォルトの名無しさん
垢版 |
2024/04/10(水) 01:07:10.63ID:uPucvtCR
内部で継続渡しに変換してるなら、フルの継続のほうが実装しやすいと思うけど
Schemeの場合、dynamic-windとかも実装しなきゃいかんからより複雑だろうけど
0151デフォルトの名無しさん
垢版 |
2024/04/10(水) 03:30:06.71ID:qIIVcoEj
継続渡しはスタック消費をクロージャで置き換えてるわけで、スタックを自前で用意してるのと同じようなもんでは
0154デフォルトの名無しさん
垢版 |
2024/04/10(水) 11:55:16.47ID:dXGnSmQj
処理が

A → B → C → ...

とあって

A → ... → shift(fn k -> hoge) → B → ... → C → reset

とすると

k に処理 _ → B → ... → Cが束縛される
hogeを実行するとresetまでジャンプする
resetの値はhogeの値になる

なので、たとえばバックトラックがしたいなら、
戻ってきたい場所にshiftを設置して、
fn () -> k next_valueをスタックに積んで、
クロージャの内部でk current_valueを実行すればいい
0155デフォルトの名無しさん
垢版 |
2024/04/10(水) 11:57:37.66ID:dXGnSmQj
で、スタックから継続をpopして実行する関数を別に作って
選択肢がなくなったときはそれを呼べばいい
レスを投稿する


ニューススポーツなんでも実況