>>134
依存型のあるHaskellやLean4はとくにオブジェクト指向という感じはしない
探検
Closures vs Objects
141デフォルトの名無しさん
2024/04/07(日) 11:19:43.04ID:0gYyGnNT142デフォルトの名無しさん
2024/04/07(日) 13:08:22.06ID:IfUr/96a >>141
純粋関数型で、(クラスベースの)オブジェクト指向をやる意味は皆無だからな
純粋関数型で、(クラスベースの)オブジェクト指向をやる意味は皆無だからな
143デフォルトの名無しさん
2024/04/07(日) 19:27:40.79ID:m+fa22Uj 純関数型言語でなくても
モダンなプログラミング言語
Go、Rust、Zig、Nim、Julia、Elixirなどは
クラスおよびその継承を言語仕様から排除しておりクラスは存在しない
それら各々の言語は全く異なる方針を採っている言語だがクラス排除だけは全てが同じ方針である
クラスとその継承は悪手であるとプログラミング言語界では結論が出ている
モダンなプログラミング言語
Go、Rust、Zig、Nim、Julia、Elixirなどは
クラスおよびその継承を言語仕様から排除しておりクラスは存在しない
それら各々の言語は全く異なる方針を採っている言語だがクラス排除だけは全てが同じ方針である
クラスとその継承は悪手であるとプログラミング言語界では結論が出ている
144デフォルトの名無しさん
2024/04/07(日) 20:16:17.84ID:mSidkHeO だからってduck typingはクラスよりさらに悪いと思うんだ
145デフォルトの名無しさん
2024/04/07(日) 20:37:39.53ID:rmfTjPEc >>144
だからクラスとダックタイピングを採用しない言語が増えているね
だからクラスとダックタイピングを採用しない言語が増えているね
146デフォルトの名無しさん
2024/04/07(日) 21:18:11.49ID:E193nq4c ポエムはよそでやれ
147デフォルトの名無しさん
2024/04/08(月) 14:29:36.32ID:LhsijIe9 P∧Qの導入則は、P -> Q -> P∧Q
これは(P, Q)ならばP∧Qとも読めるし
Pを仮定したとき、QならばP∧Qとも読める
これは(P, Q)ならばP∧Qとも読めるし
Pを仮定したとき、QならばP∧Qとも読める
148デフォルトの名無しさん
2024/04/09(火) 18:44:27.40ID:kKsSVHOb 限定継続(reset/shift)の動きが意味わかんない
resetで範囲絞ってる分call/ccより実用的には扱いやすいというのは分かるが、ローカルで見たらcall/ccのほうが直感的に思える
resetで範囲絞ってる分call/ccより実用的には扱いやすいというのは分かるが、ローカルで見たらcall/ccのほうが直感的に思える
149デフォルトの名無しさん
2024/04/09(火) 23:18:54.13ID:Aro4tJCD 実装の都合では?
フル機能の継続はそこまでのスタック全部を生かし続けないといけないし分岐できないといけないしで
スタック自体をOSの用意してくれるものとは別に自前で構成しないといけないしそうするとABIからなにからつらい
フル機能の継続はそこまでのスタック全部を生かし続けないといけないし分岐できないといけないしで
スタック自体をOSの用意してくれるものとは別に自前で構成しないといけないしそうするとABIからなにからつらい
150デフォルトの名無しさん
2024/04/10(水) 01:07:10.63ID:uPucvtCR 内部で継続渡しに変換してるなら、フルの継続のほうが実装しやすいと思うけど
Schemeの場合、dynamic-windとかも実装しなきゃいかんからより複雑だろうけど
Schemeの場合、dynamic-windとかも実装しなきゃいかんからより複雑だろうけど
151デフォルトの名無しさん
2024/04/10(水) 03:30:06.71ID:qIIVcoEj 継続渡しはスタック消費をクロージャで置き換えてるわけで、スタックを自前で用意してるのと同じようなもんでは
152デフォルトの名無しさん
2024/04/10(水) 04:04:38.17ID:nlTt4/RM 会話が噛み合ってない
153デフォルトの名無しさん
2024/04/10(水) 09:16:26.52ID:fNUeJXq8 いや割と噛み合ってる
154デフォルトの名無しさん
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を実行すればいい
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を実行すればいい
155デフォルトの名無しさん
2024/04/10(水) 11:57:37.66ID:dXGnSmQj で、スタックから継続をpopして実行する関数を別に作って
選択肢がなくなったときはそれを呼べばいい
選択肢がなくなったときはそれを呼べばいい
156デフォルトの名無しさん
2024/04/10(水) 16:24:50.24ID:gx493tSk カプセル化を破壊するのが前提なので、ものすごく気を遣う
157デフォルトの名無しさん
2024/04/10(水) 17:47:04.13ID:uxnW16Zl call/ccやreset/shiftの型はどうなるの?
158デフォルトの名無しさん
2024/11/11(月) 12:09:40.22ID:eaS0ivay call/ccの型は
((T -> ⊥) -> T) -> T
これは、¬Tを仮定してTが導けるならTということ
つまり、直観主義論理に排中律を追加することに相当する
((T -> ⊥) -> T) -> T
これは、¬Tを仮定してTが導けるならTということ
つまり、直観主義論理に排中律を追加することに相当する
159デフォルトの名無しさん
2024/11/28(木) 14:50:39.31ID:D62ASfXP first-class typeがあると、どのような抽象化が可能になるのか
160デフォルトの名無しさん
2024/11/28(木) 21:23:23.02ID:tgeVSyIQ output_integer = input_string.filter(is_number).map(char_to_integer).sum()
161デフォルトの名無しさん
2024/11/28(木) 22:26:33.20ID:U97loGz8 何かしらんけどHaskell版
import Data.Char
outputInteger = getLine >>= return.sum.map digitToInt.filter isDigit
f = outputInteger >>= putStrLn.("sum = " ++).show -- IOな値は必ず >>= 経由で渡される。
>f
1a2b3
>sum = 6
do表記
f = do x <- outputInteger -- IOな値は必ず <- で束縛された変数経由で渡される。
putStrLn $ "sum = " ++ show x
import Data.Char
outputInteger = getLine >>= return.sum.map digitToInt.filter isDigit
f = outputInteger >>= putStrLn.("sum = " ++).show -- IOな値は必ず >>= 経由で渡される。
>f
1a2b3
>sum = 6
do表記
f = do x <- outputInteger -- IOな値は必ず <- で束縛された変数経由で渡される。
putStrLn $ "sum = " ++ show x
162デフォルトの名無しさん
2024/11/28(木) 22:37:38.47ID:iYyun2JN 代入をなくそう
n = 1ではなく
n: 1 (nは1である)
n: Nat (nは自然数である)
これを基礎とする
n = 1ではなく
n: 1 (nは1である)
n: Nat (nは自然数である)
これを基礎とする
163デフォルトの名無しさん
2024/11/28(木) 22:39:47.41ID:iYyun2JN こうすればパターンマッチなどに統一性がとれるだろう
164デフォルトの名無しさん
2024/11/28(木) 22:59:50.27ID:U97loGz8 map digitToInt だと"1 2 3" = [1, 2, 3] は良いとして、"123" = [1, 2, 3] と1桁ずつになるので改良した
outputInteger = getLine >>= return.sum.map (read.filter isDigit).words
> f
11 22 33 -- Input
sum = 66
> f
1a1 22b k33 -- Input
sum = 66
outputInteger = getLine >>= return.sum.map (read.filter isDigit).words
> f
11 22 33 -- Input
sum = 66
> f
1a1 22b k33 -- Input
sum = 66
165デフォルトの名無しさん
2024/11/29(金) 08:50:35.19ID:ZHbjuyaH よそでやれ
166デフォルトの名無しさん
2024/11/29(金) 18:22:51.77ID:FvJq/OMC167デフォルトの名無しさん
2024/11/29(金) 18:26:10.93ID:FXP1+9fo 具体的なデータ(1とか"Hello"とか)があれば、型が決まるわけでもない
たとえば、、1 + 1は加法モノイドとみれば2だけど、乗法モノイドとみれば1
ただ、前者とみなす慣習が圧倒的に多いに過ぎない
たとえば、、1 + 1は加法モノイドとみれば2だけど、乗法モノイドとみれば1
ただ、前者とみなす慣習が圧倒的に多いに過ぎない
168デフォルトの名無しさん
2024/11/29(金) 19:14:30.73ID:lZOQa9Jb 具体型をなくして抽象型だけにするのは?
169デフォルトの名無しさん
2024/12/12(木) 18:30:39.23ID:XExKLUf8 Leanでは、Exists(fun x: A => p x)は長いから∃x: A, p xと書くらしいので、ラムダ式のシンタックスはさらに短くなる
170デフォルトの名無しさん
2024/12/12(木) 20:50:14.10ID:YVpGcPfJ 命題は型
171デフォルトの名無しさん
2024/12/12(木) 22:51:28.02ID:dX7jmuEY >>144
duck typingもクラスも使わずにinterfaceを使うのが正解
duck typingもクラスも使わずにinterfaceを使うのが正解
172デフォルトの名無しさん
2024/12/13(金) 13:33:11.56ID:ObbUHrIh クラスのフィールドは全く不要な概念
173デフォルトの名無しさん
2024/12/13(金) 21:23:08.37ID:ePsQGGMZ クラス自体が不要
クラスを排除したモダンなプログラミング言語が多数あることが何よりの証拠
クラスを排除したモダンなプログラミング言語が多数あることが何よりの証拠
174デフォルトの名無しさん
2024/12/19(木) 16:09:31.78ID:RMYWDOZr クロージャ指向から述語指向へ
175デフォルトの名無しさん
2024/12/25(水) 16:41:01.48ID:jsf4a+Fl 継続指向プログラミング
176デフォルトの名無しさん
2024/12/28(土) 22:32:57.19ID:U3Qq1irw T :: ((α -> β) -> α -> (_ -> (_, β)), _ -> _)
T = (S, R)
f :: α -> β
S f :: α -> (_ -> (_, β))
S f a = fn x: (R x, f a)
f :: α -> β, g :: β -> γ
S f :: α -> (_ -> (_, β))
S g :: β -> (_ -> (_, γ))
S g >>= S f a = fn x:
let
(x', b) = S f a x
in
(R x', g b)
T = (S, R)
f :: α -> β
S f :: α -> (_ -> (_, β))
S f a = fn x: (R x, f a)
f :: α -> β, g :: β -> γ
S f :: α -> (_ -> (_, β))
S g :: β -> (_ -> (_, γ))
S g >>= S f a = fn x:
let
(x', b) = S f a x
in
(R x', g b)
177デフォルトの名無しさん
2024/12/29(日) 01:19:32.44ID:OIeguool Category theory for programmers読む
178デフォルトの名無しさん
2025/02/04(火) 01:03:51.46ID:63k9bOfa プログラムのすべての箇所で値が(val: a, cont: a -> r)みたいになってたら、
独立したコンテキスト間で状態を受け渡ししなきゃいけないような仕様変更があっても、
その状態を参照できる所の(state, cont1)をセーブポイントとして保存
で、その状態を共有したい所の(val, cont2)を保存してcont1を呼び出す
stateとvalから新しいvalを作ってcont2を呼び出す
とやればいいのか
独立したコンテキスト間で状態を受け渡ししなきゃいけないような仕様変更があっても、
その状態を参照できる所の(state, cont1)をセーブポイントとして保存
で、その状態を共有したい所の(val, cont2)を保存してcont1を呼び出す
stateとvalから新しいvalを作ってcont2を呼び出す
とやればいいのか
179デフォルトの名無しさん
2025/02/04(火) 01:47:21.80ID:Juhgqulp 絶対にやめろ
180デフォルトの名無しさん
2025/02/04(火) 22:33:26.11ID:W8jOB2Il >>178
それクロージャと言う
それクロージャと言う
181デフォルトの名無しさん
2025/02/05(水) 00:00:43.61ID:ZsEHWtVQ 違うが
182デフォルトの名無しさん
2025/02/05(水) 18:33:33.62ID:UzNcF0as 継続は米田埋込み
C^op → (Set)^C
型は層
C^op→(Set)
任意の圏は米田埋込みで前層の圏に埋め込める
C→(Set)^(C^op)
C^op → (Set)^C
型は層
C^op→(Set)
任意の圏は米田埋込みで前層の圏に埋め込める
C→(Set)^(C^op)
183デフォルトの名無しさん
2025/02/05(水) 18:46:54.22ID:UvjLK8GW 継続渡しへの変換は米田埋込み、な。
a: Aの代わりに、ka: (A -> R) -> Rを考える。
a: Aの代わりに、ka: (A -> R) -> Rを考える。
184デフォルトの名無しさん
2025/02/05(水) 18:51:06.97ID:2vUp1NTh 継続渡しやコールバックは
全て高位関数としてクロージャを渡すことで統一化されている
クロージャだけを考えればよくなっている
全て高位関数としてクロージャを渡すことで統一化されている
クロージャだけを考えればよくなっている
185デフォルトの名無しさん
2025/02/05(水) 19:16:41.69ID:Osi5eBbZ まあ、型Aのオブジェクトaを考える代わりに、A上の関数にaを適用する関数を考えるわけだから、そりゃたしかにそうだな
186デフォルトの名無しさん
2025/02/05(水) 22:52:10.46ID:95phW+lE ```
callcc: ((α -> β**) -> α**) -> α**
callcc f = fun (k: α*) => f (fun (x: α) => (fun (_: β) => k x)) k
```
callcc: ((α -> β**) -> α**) -> α**
callcc f = fun (k: α*) => f (fun (x: α) => (fun (_: β) => k x)) k
```
187デフォルトの名無しさん
2025/02/07(金) 22:18:25.29ID:c5jjIiZy 動的に生成される型として、たとえば型 `t`をパラメータにとって、あるコンテナ内 `t` 型のフィールドの一意性を保証する型 `Unique t ` とかを考えてみる
188デフォルトの名無しさん
2025/02/07(金) 22:49:12.48ID:OiS9SGfZ 依存型なら、それもできる
189デフォルトの名無しさん
2025/02/20(木) 01:49:56.71ID:fXOi/Bb7 [0 1]
|> iterate ([a b] -> [b (a + b)])
|> map first
|> head 20
|> iterate ([a b] -> [b (a + b)])
|> map first
|> head 20
190デフォルトの名無しさん
2025/02/20(木) 23:57:19.54ID:zXVkJcm2 >>187
その型を動的生成する必要性が全く感じられない
そして制約を受けるのはコンテナ側
例えば代入やプッシュが一意性を満たしているかどうかで成功と失敗に分かれるインターフェースとなる
つまりコンテナ側の制約導入拡張型となるのではないか
その型を動的生成する必要性が全く感じられない
そして制約を受けるのはコンテナ側
例えば代入やプッシュが一意性を満たしているかどうかで成功と失敗に分かれるインターフェースとなる
つまりコンテナ側の制約導入拡張型となるのではないか
191デフォルトの名無しさん
2025/02/21(金) 09:55:06.25ID:Ip3jb1gD >>190
> 必要性が全く感じられない
データベースのフィールドの一意性制約、ハッシュテーブルのキーの一意性など、いくらでもあると思うが
> 制約を受けるのはコンテナ側
意味的には当然、コンテナも値もともに制約を受けている
メソッドが名前空間に属しているのか、オブジェクトに属しているのかと変わらない
それをどう管理するのかは処理系の実装の問題
> 必要性が全く感じられない
データベースのフィールドの一意性制約、ハッシュテーブルのキーの一意性など、いくらでもあると思うが
> 制約を受けるのはコンテナ側
意味的には当然、コンテナも値もともに制約を受けている
メソッドが名前空間に属しているのか、オブジェクトに属しているのかと変わらない
それをどう管理するのかは処理系の実装の問題
192デフォルトの名無しさん
2025/02/21(金) 19:25:08.97ID:NlF3aFif 「クロージャを引数にとってクロージャを返すクロージャ」を引数にとって「クロージャを引数にとってクロージャを返すクロージャ」を返すクロージャ
193デフォルトの名無しさん
2025/02/21(金) 20:11:13.15ID:lKEY3ckS make-stream head thunk := [cont] -> cont head thunk
head stream := stream ([head _] -> head)
rest stream := stream ([_ thunk] -> thunk [])
nat-from n := make-stream n ([] -> nat-from (n+1))
take 0 stream := []
take _ [] := []
take n stream := cons (head stream) (take (n-1) (rest stream))
head stream := stream ([head _] -> head)
rest stream := stream ([_ thunk] -> thunk [])
nat-from n := make-stream n ([] -> nat-from (n+1))
take 0 stream := []
take _ [] := []
take n stream := cons (head stream) (take (n-1) (rest stream))
194デフォルトの名無しさん
2025/02/21(金) 23:53:10.97ID:zYI+C5dr >>191
必要性は当然わかってる
しかし動的生成する必要性が全く感じられない
一般的に型は静的に扱えるなら静的に扱える方が有利
もう一つ
コンテナも制約を受けるとわかっているならなぜそちらも型パラメータにしないのか?
フィールド 't' だけを型パラメータにしていることを問題視している
必要性は当然わかってる
しかし動的生成する必要性が全く感じられない
一般的に型は静的に扱えるなら静的に扱える方が有利
もう一つ
コンテナも制約を受けるとわかっているならなぜそちらも型パラメータにしないのか?
フィールド 't' だけを型パラメータにしていることを問題視している
195デフォルトの名無しさん
2025/02/22(土) 00:16:39.92ID:2igDN88l >>194
>一般的に型は静的に扱えるなら静的に扱える方が有利
コンパイル時に検査できるものはすればいい
>コンテナも制約を受けるとわかっているならなぜそちらも型パラメータにしないのか?
>フィールド 't' だけを型パラメータにしていることを問題視している
コンテナが制約を受けるのか値が制約を受けるのかは、単に構文と処理系の実装の問題。意味的にはどちらも制約を受ける
変数aの型によって動作が変わる関数を、a.foo()と書く仕様にしようがfoo(a)にしようがどちらでもいいのと同じ
というか「必要性がわからない」なら、首を突っ込まなきゃいいのでは
>一般的に型は静的に扱えるなら静的に扱える方が有利
コンパイル時に検査できるものはすればいい
>コンテナも制約を受けるとわかっているならなぜそちらも型パラメータにしないのか?
>フィールド 't' だけを型パラメータにしていることを問題視している
コンテナが制約を受けるのか値が制約を受けるのかは、単に構文と処理系の実装の問題。意味的にはどちらも制約を受ける
変数aの型によって動作が変わる関数を、a.foo()と書く仕様にしようがfoo(a)にしようがどちらでもいいのと同じ
というか「必要性がわからない」なら、首を突っ込まなきゃいいのでは
196デフォルトの名無しさん
2025/02/22(土) 00:26:40.81ID:2igDN88l >コンテナも制約を受けるとわかっているならなぜそちらも型パラメータにしないのか?
あなたがそうしたけりゃそうすりゃいいだけの話
「集合Gは群であるとする」といっている人に対して、
「群構造は二項演算*、単位元e、逆演算・^(-1)にも依存するのに、なぜ(G, *, e, ・^(-1))と書かないのか」とか言っているようなもん
そう書きたきゃそう書けばいい
俺はめんどくさいからそうしないだけ
あなたがそうしたけりゃそうすりゃいいだけの話
「集合Gは群であるとする」といっている人に対して、
「群構造は二項演算*、単位元e、逆演算・^(-1)にも依存するのに、なぜ(G, *, e, ・^(-1))と書かないのか」とか言っているようなもん
そう書きたきゃそう書けばいい
俺はめんどくさいからそうしないだけ
197デフォルトの名無しさん
2025/02/22(土) 00:28:08.00ID:BHZ6xlR+ バカだから不利となる動的生成しようとしてるのだろう
そのケースは静的で済む
そのケースは静的で済む
198デフォルトの名無しさん
2025/02/22(土) 00:31:03.33ID:2igDN88l199デフォルトの名無しさん
2025/02/22(土) 00:34:02.62ID:2igDN88l 型を動的に生成する、つまり実行時に決まる値に型が依存していても、コンパイル時に検査できる場合はある
ということが分かっていない?
ということが分かっていない?
200デフォルトの名無しさん
2025/02/22(土) 00:36:50.14ID:fju1Vmb5201デフォルトの名無しさん
2025/02/22(土) 00:37:58.92ID:2igDN88l たとえばList nで長さnのリストを表すとする
nが実行時に決まる値だったとしても、関数
concat: List n -> List m -> List (n + m)
の型はコンパイル時にチェックできる
nが実行時に決まる値だったとしても、関数
concat: List n -> List m -> List (n + m)
の型はコンパイル時にチェックできる
202デフォルトの名無しさん
2025/02/22(土) 00:39:25.47ID:2igDN88l203デフォルトの名無しさん
2025/02/22(土) 00:42:20.87ID:fju1Vmb5204デフォルトの名無しさん
2025/02/22(土) 00:45:02.92ID:2igDN88l 正直、あなたの意図がよくわからない
こちらの言っていることが理解できないのか、わざわざこんな辺鄙なスレでよく分からん難癖をつけるのが楽しいのか
こちらの言っていることが理解できないのか、わざわざこんな辺鄙なスレでよく分からん難癖をつけるのが楽しいのか
205デフォルトの名無しさん
2025/02/22(土) 13:49:24.39ID:3Aku5oEk 型を動的に作るなんて、RailsのActiveRecordとかごく一般的に行われていることだと思うが
206デフォルトの名無しさん
2025/02/22(土) 14:03:06.41ID:o5bbno7I207デフォルトの名無しさん
2025/02/22(土) 14:54:10.02ID:H7FLchaf208デフォルトの名無しさん
2025/02/22(土) 15:46:05.77ID:IIYOJqnw 言語のセマンティクスと実装は分けて考えるべき
209デフォルトの名無しさん
2025/02/22(土) 15:57:38.39ID:es3U9V0K >>207
あなたが混同してる
型検査をコンパイル時に行うかどうかは規格、セマンティクスの領分で
実行時の値とされているものを静的にチェックできる範囲でチェックして警告を出したりするのは実装の領分だろう
あなたが混同してる
型検査をコンパイル時に行うかどうかは規格、セマンティクスの領分で
実行時の値とされているものを静的にチェックできる範囲でチェックして警告を出したりするのは実装の領分だろう
210デフォルトの名無しさん
2025/02/22(土) 16:05:21.30ID:W3fSq5/I >>207
その両者は明確に分かれてる
動的型付け言語は実行の途中で初めて型が確定しうる
静的型付け言語は必ず実行前に全ての型が定まる
これらは言語仕様で定まる
静的型付け言語は型の安全性やパフォーマンスに優れている
C/C++, Fortran, Go, Haskell, Java, OCaml, Pascal, Rust, Scala, Swiftなど
スクリプト言語以外は静的型付け言語が多数派
その両者は明確に分かれてる
動的型付け言語は実行の途中で初めて型が確定しうる
静的型付け言語は必ず実行前に全ての型が定まる
これらは言語仕様で定まる
静的型付け言語は型の安全性やパフォーマンスに優れている
C/C++, Fortran, Go, Haskell, Java, OCaml, Pascal, Rust, Scala, Swiftなど
スクリプト言語以外は静的型付け言語が多数派
211デフォルトの名無しさん
2025/02/22(土) 16:35:21.85ID:N/T45y64212デフォルトの名無しさん
2025/02/22(土) 16:51:46.18ID:1JZL08Pv もうブログかなんかに書いててくれないか
213デフォルトの名無しさん
2025/02/22(土) 16:53:22.31ID:W3fSq5/I 静的型付け言語はその言語仕様により
常に全ての型を静的に(=実行前に)確定できる
これは言語仕様により定まることであり実装とは関係ない
常に全ての型を静的に(=実行前に)確定できる
これは言語仕様により定まることであり実装とは関係ない
214デフォルトの名無しさん
2025/02/22(土) 16:54:54.90ID:1JZL08Pv 妄想乙
215デフォルトの名無しさん
2025/02/22(土) 17:46:21.34ID:GOJ2wF4D 実行速度の速い言語がすべて静的型付けな点が答えだろうね
素人向けのスクリプト言語は動的型付けで遅い
素人向けのスクリプト言語は動的型付けで遅い
216デフォルトの名無しさん
2025/02/22(土) 18:03:51.25ID:NU7N7MY+ >>210
しれっとHaskell混ぜるなってのw
しれっとHaskell混ぜるなってのw
217デフォルトの名無しさん
2025/02/22(土) 19:31:02.81ID:wKCHVlKT 馬鹿が常駐して終わったスレ
さよなら
さよなら
218デフォルトの名無しさん
2025/02/22(土) 20:19:25.50ID:FTk8qZlg 無意味な動的型付けにこだわってるのは一人だけだから無視すればよいだけかと
型推論の進歩により静的型付けの唯一の弱点も消えた
型指定を省略できるクロージャなどその典型例
型推論の進歩により静的型付けの唯一の弱点も消えた
型指定を省略できるクロージャなどその典型例
219デフォルトの名無しさん
2025/02/22(土) 22:50:21.56ID:bh0ZAEWN220デフォルトの名無しさん
2025/02/22(土) 22:56:32.72ID:bh0ZAEWN >>187は動的型付けとは何ら関係がない
むしろ、直後に指摘されているようにほとんどのケースでコンパイル前に検査できる
むしろ、直後に指摘されているようにほとんどのケースでコンパイル前に検査できる
221デフォルトの名無しさん
2025/02/23(日) 02:25:36.50ID:tIjZB/Ol 型が第一級オブジェクトの言語は、論理学でいえば命題を量化できる二階述語論理に相当するわけだ
222デフォルトの名無しさん
2025/02/23(日) 03:10:06.06ID:ojjdIlYs f x = 10
g y = 20
h z = 30
h . g . f 10 -- 30
g y = 20
h z = 30
h . g . f 10 -- 30
223デフォルトの名無しさん
2025/02/23(日) 03:10:58.23ID:ojjdIlYs hの定義内で途中の計算結果10, 10, 20を参照するにはどうするか
224デフォルトの名無しさん
2025/02/23(日) 04:40:15.50ID:upqukZrZ トランポリン
225デフォルトの名無しさん
2025/02/23(日) 06:54:06.73ID:jtLYghc/ h z x y = 30にする
226デフォルトの名無しさん
2025/03/09(日) 23:01:10.03ID:eGDnXODc227デフォルトの名無しさん
2025/03/14(金) 17:25:51.81ID:TOg9uiCJ S式
(+ 1 (* 2 3))
RPN
1 2 3 * +
CPS
1 >> (x ->
2 >> (y ->
3 >> (z ->
(y * z) >> (m ->
(x + m))))))
Do記法
x <- 1
y <- 2
z <- 3
m <- y * z
x + m
(+ 1 (* 2 3))
RPN
1 2 3 * +
CPS
1 >> (x ->
2 >> (y ->
3 >> (z ->
(y * z) >> (m ->
(x + m))))))
Do記法
x <- 1
y <- 2
z <- 3
m <- y * z
x + m
228デフォルトの名無しさん
2025/06/17(火) 21:17:24.66ID:66zQf9l5 はぁ? クロージャって何すか?
クローゼットのことですか?
プログラマ「もういい」
クローゼットのことですか?
プログラマ「もういい」
レスを投稿する
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- 中共は台湾を自分の領土と思ってるから外国が「侵略するな」と警告しても意味ないんだよね
- 🏡
- スマホってスクリーントーンみにくくね?
- ( ´・ω・` )朝ですぞー
