X



関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0780デフォルトの名無しさん
垢版 |
2018/10/11(木) 22:20:09.94ID:BadrZ8Hx
結局は書く人本人が気持ちよくなる為の言語だね
パフォーマンスに優れるとかもないし
0782デフォルトの名無しさん
垢版 |
2018/10/12(金) 07:44:29.57ID:KfUOHFbE
遅延ストリームを扱うならHaskellは速い方だろう
fizzbuzzの規模じゃそれを採用する利点はわからないけど
0783デフォルトの名無しさん
垢版 |
2018/10/12(金) 08:45:23.98ID:gMRT6HYK
むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」
0784デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:09:14.98ID:dVwqKDFL
「Haskellは参照透明性を保証するために、最適化を犠牲にした。
そのため、高い冗長性によってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で鈍速である」
0787デフォルトの名無しさん
垢版 |
2018/10/13(土) 06:54:47.20ID:KKBwY8Qn
コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか
0788デフォルトの名無しさん
垢版 |
2018/10/13(土) 07:37:36.01ID:dpKKSw3w
>>787
ベテランになれば実用上問題ない程度には予測できるようになるんじゃね?

俺はまだまだ修行不足だけど
0789デフォルトの名無しさん
垢版 |
2018/10/13(土) 10:35:05.77ID:dM3fjinv
遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが
0790デフォルトの名無しさん
垢版 |
2018/10/13(土) 18:49:50.11ID:hDWVpOOe
Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。
0791デフォルトの名無しさん
垢版 |
2018/10/13(土) 20:07:33.53ID:H67rAYXW
メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし
0792デフォルトの名無しさん
垢版 |
2018/10/13(土) 20:11:57.62ID:KKBwY8Qn
評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね
0793デフォルトの名無しさん
垢版 |
2018/10/13(土) 20:39:20.93ID:H67rAYXW
データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか
0794デフォルトの名無しさん
垢版 |
2018/10/15(月) 21:26:01.71ID:e5ZigS6A
Nixってなに?
0795デフォルトの名無しさん
垢版 |
2018/10/15(月) 22:33:00.01ID:eL3fUBCp
くだらない質問で悪いけど質問させてほしい

Haskellでの優先順位について

・演算子の優先順位の記述はある
・関数適用の優先順位の記述はある

でも、関数の優先順位の記述が見当たらないんだけど(どっかに、左結合ってのはみた)
関数の優先順位はどうなるの?
要するに、かっこ付けの順番なんだけど

1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス
0796795
垢版 |
2018/10/16(火) 00:16:52.78ID:J1KdR+sZ
795だけど、質問がうまくまとまってない希ガス

演算子と関数というのがあるけど、演算子も関数と見なしていいんだよね
ていうことは、

まず、第一の疑問は
1.関数適用の優先順位が高いとして、沢山ある関数(演算子も含む)の中でどの順番で行うのか?

第二の疑問として
3.関数 の優先順位は何?

例えば、compfunc = funcA . funcB (3 + 4)があった場合、最初の関数適用にfuncAと後ろの(.)が
が選ばれない理由でもいいかも
0797デフォルトの名無しさん
垢版 |
2018/10/16(火) 00:29:51.00ID:Y+LwBtWJ
a b c d e fの並びは(((((a b) c) d) e) f)
このa,b,c,d,e,fが関数だとか値のバインドだとか関係ない

そういう話ではない?
0798デフォルトの名無しさん
垢版 |
2018/10/16(火) 00:34:17.39ID:Y+LwBtWJ
演算子を関数としてみなすなら
compfunc = funcA . funcB (3 + 4)
は関数として展開して
compfunc = (.) funcA (funcB ((+) 3 4))

compfunc = (((.) funcA) (funcB (((+) 3) 4)))
だよね
0799デフォルトの名無しさん
垢版 |
2018/10/16(火) 00:43:59.67ID:J1KdR+sZ
>>797
それを真としすると
自分の理解では、a : funcA b:(.) c: funcB d:(3+4)となるけど、
実際の計算は(((((a b) c) d) e) f)とあってないと思う。

compfunc = funcA . funcB . funcC (3 + 4)の方が分かりやすかったかもしれないけど
関数合成は (funcA . (funcB . funcC)) (3+4)だから (つまり関数合成は右結合)
(((((a b) c) d) e) f)になってないと思う。 (関数というか、カリー化は左結合)
0800デフォルトの名無しさん
垢版 |
2018/10/16(火) 00:47:21.87ID:J1KdR+sZ
>>798

>>799は無視してください。こっちの方が本質だから

うん、その場合なぜ、

funcAより、(.)を関数適用の優先順位を上げたのかが
自分の疑問といってもいいと思う

関数適用の優先順位が高いのはいいとして、
じゃあ、どの関数から関数適用をするの?というのが、私の疑問
0801デフォルトの名無しさん
垢版 |
2018/10/16(火) 01:38:23.70ID:iR5P4NYU
>>796
演算子と関数とは似ているように思うかもしれないがちゃんと区別したほうがいい
まず関数適用とは雑に言えば項の間の半角スペースのこと
関数とか定数とか(ただし演算子は除く)をスペースでくっつけるのが関数適用
その関数適用の結合はカッコを除いて最優先なので、特に全ての演算子に優先する
(結合の仕方は>>797の通り)
そして
(.) :: (b -> c) -> (a -> b) -> a -> c
は慣れないうちは紛らわしいが、単に関数を引数に取る2項演算子なので
(演算子として使う限りは)関数適用より優先順位が低い

うーんいまいちちゃんと説明しきれてないし用語の使い方もアヤシイので
誰か詳しい人頼む
0803デフォルトの名無しさん
垢版 |
2018/10/16(火) 03:22:14.15ID:q8KCyqRj
質問です。
正確には覚えてないんですが、Haskell の型宣言を省略した場合、コンパイラ、インタプリタがよきにはからってくれてなるべく適用範囲が広い型をつけてくれます。
でもそれは Top-Level ではダメって制約があったと思うんですが、この制約なんか名前ついてたとおもうんですがなんでしたっけ?
これなんの為にあるんでしょう?
これ外すための GHC のオプションがあった記憶もあるんですがわかります?
数年ぶりに Haskell つかったら昔とったハズの杵柄がボロボロに orz。
0806デフォルトの名無しさん
垢版 |
2018/10/16(火) 16:03:37.14ID:Y+LwBtWJ
>>799
compfunc = funcA 1 2 . funcB 4 5 . funcC 5 6 $ funcD 7 8
とあったとき、まず演算子を越えずに関数適用
compfunc = ((funcA 1) 2) . ((funcB 3) 4) . ((funcC 5 ) 6) $ ((funcD 7) 8)
このあとで演算子の優先順位で計算

>自分の理解では、a : funcA b:(.) c: funcB d:( 3+4)となるけど、

a:(.) b:funcA c:(funcB (3 + 4)) だよ
そして a:funcB b: (3 + 4)
そして a:(+) b:3 c :4
演算順序を決める丸括弧は展開出来ないよ
0808795
垢版 |
2018/10/17(水) 09:26:31.84ID:NmM3N1fc
なんとなくわかったというか 暫定でわかった
要するに”関数適用の優先順位は高い”なんだろうね

関数の優先順位の記述が無いのは、そのようなルールが不要だと思えばいいわけで。
かっこ付けのやるべき順序として

1.関数適用 部分適用が出来るなら強欲に
2.演算子の優先順位と結合性でかっこ付け

これで、かっこ付けが終わったので、シグネチャとの整合性を取ってみる。
あっていなければ、コンパイラーエラー

ということで、コンパイラーも理解出来そうなルールになっていそうだし、
>>806とも整合性が取れそうかな
0811デフォルトの名無しさん
垢版 |
2018/10/17(水) 12:47:09.36ID:NmM3N1fc
>>810
それが、関数適用とどう関係があるのか、俺には理解できない


とうとう俺もBNFを勉強するときが来たようだw
数年に1度、思い出したようにBNFがネックになるんだけどね
今まで避けてきたw
0813デフォルトの名無しさん
垢版 |
2018/10/17(水) 14:46:13.41ID:97sxRiiz
>>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。

それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、

・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
 分けていないコード大っ嫌い。

・高凝集度で低結合度なコードは好き。
 逆は嫌い。

・1つの小さな仕事をさせている関数は好き。
 いくつもの仕事をさせて肥えている関数は大嫌い。

・1つの役割だけをしっかり果たしているモジュールは好き。
 ごった煮モジュールは大嫌い。

この基準でいくと、あなたのコードはまったくイケてない。
0817デフォルトの名無しさん
垢版 |
2018/10/19(金) 22:13:22.28ID:8Ox5P+xa
テストどうすんべとか、保守どうしようとか、合成できるようにしたいとか
考えるとええんやで(こなみ)
0821デフォルトの名無しさん
垢版 |
2018/10/30(火) 14:24:11.19ID:pQwXzgRa
stack の lts-12.x にはなぜ Yampa パッケージがないんだろ?
11.x の頃はあったのに。
0824デフォルトの名無しさん
垢版 |
2018/11/03(土) 07:37:57.15ID:KyIBYeD2
>>823
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。
0825デフォルトの名無しさん
垢版 |
2018/11/07(水) 13:48:52.85ID:VCaKs67w
以前の GHC.Stats モジュールには GCStats 型がありましたが、
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。

そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。
0826デフォルトの名無しさん
垢版 |
2018/11/09(金) 08:25:29.12ID:rrSKeTdW
f :: a -> b -> c
このコロン以降の部分って、英語圏の人は何て発音してるの?

"a to b to c" で良いの? 不自然かな?
0827デフォルトの名無しさん
垢版 |
2018/11/09(金) 11:20:46.63ID:DHGOZxva
英語圏のコミュニティで日本人なんだけど。。。って質問した方が早いのでは。。。
0829デフォルトの名無しさん
垢版 |
2018/11/09(金) 11:47:53.76ID:p9aTnaT/
a arrow b arrow c
call a, b, and c
0833デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:22:07.58ID:rrSKeTdW
みんなありがと。

よう分からんから、自分を信じて "a to b to c" って言っておくわ。

>>828
べつに日本語で読まなくてもいいと思うが。
英語でいいんじゃね?
0834デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:43:11.08ID:Rc4d95qg
それって、そもそも発音する場面なんてあるか?
って意味じゃ・・・

つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ
0839デフォルトの名無しさん
垢版 |
2018/11/10(土) 02:48:27.14ID:A3qdJv3l
c9のhuttonとmeijerのlectureでは、huttonが a to b、meijerが
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい

(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間
0840デフォルトの名無しさん
垢版 |
2018/11/15(木) 22:01:12.82ID:ExoyI5Rr
2つの型クラスの間に包含関係を付けるのに
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな
0841デフォルトの名無しさん
垢版 |
2018/11/15(木) 22:08:48.54ID:349+82Of
変数に再代入できる言語に
慣れきっている者の質問なのですが

[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。

ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]

fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)

-- reverse $ fn 0 ints1 []
0843デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:19:14.92ID:5uoUpH2U
842です
foldで書いてみました

fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]

-- fn [1..8]
0844デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:51:13.43ID:349+82Of
>>841 >>842
どうもありがとうございます。

驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。
0845デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:58:57.35ID:349+82Of
>>843
どうもありがとうございます。

驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。
0846デフォルトの名無しさん
垢版 |
2018/11/16(金) 00:12:59.47ID:mACu1uNV
842です
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと

先輩諸兄のレスを待ってください
0847デフォルトの名無しさん
垢版 |
2018/11/16(金) 01:31:49.81ID:1zT7OHrw
何使ってもいいならData.Listのinitsを使って

map sum $ inits [1..8]

が楽チン。
0848デフォルトの名無しさん
垢版 |
2018/11/16(金) 18:07:13.25ID:0oMzWKAu
>>840
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ

>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)

scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs
0849デフォルトの名無しさん
垢版 |
2018/11/16(金) 18:12:37.84ID:3YKNNj99
正直全然読みやすくないのだが、本当に読みやすくないのか俺が手続き脳なだけなのか判断がつかない
0850デフォルトの名無しさん
垢版 |
2018/11/16(金) 18:56:19.39ID:0oMzWKAu
>>849
qのところが(f q x)に替わって再帰してるだけだよ

scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10]
0851デフォルトの名無しさん
垢版 |
2018/11/18(日) 07:38:58.15ID:2lh9j78G
if then elseを最近知った位の超初心者です。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。

kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても

kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq

*Main> kld2 [1/2,1/2] [1/4,3/4]

<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?

モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。
0853デフォルトの名無しさん
垢版 |
2018/11/18(日) 09:57:38.99ID:XromDw/4
>>852
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。

kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3]
0855デフォルトの名無しさん
垢版 |
2018/11/20(火) 08:29:50.51ID:kos1zZ3I
関数型プログラミングでログ出力ってどうやってるんですか?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね?
0856デフォルトの名無しさん
垢版 |
2018/11/20(火) 10:01:49.03ID:jmuJusIM
flush
0857デフォルトの名無しさん
垢版 |
2018/11/20(火) 10:53:51.88ID:QMY+cuul
Writerでは例外のようなものを投げることができないからもっと万能なモナドを使う
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ
0860デフォルトの名無しさん
垢版 |
2018/11/20(火) 18:07:48.61ID:QMY+cuul
Haskellにも副作用はある
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ
0861デフォルトの名無しさん
垢版 |
2018/11/20(火) 18:35:37.40ID:kZ/DcFbd
>>855
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。
0864デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:06:50.85ID:4kdGLnPd
直交
0865863
垢版 |
2018/11/24(土) 13:10:25.20ID:dO0ZWwxC
例えば、こんな書き勝たされてるんだけど

P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.

”⊥ otherwise”って何だろう?
0867デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:24:01.18ID:dO0ZWwxC
ええええ 本当に直交って意味なの?

数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味?
0868デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:28:15.64ID:4kdGLnPd
独立
0870デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:43:43.78ID:dO0ZWwxC
>>869
Thx ようやくまともな答えが

Haskellやってて面白いのが、新しい概念が増えていくのがうれしい 遅延評価とか
0871デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:59:53.00ID:1C+vWWG1
>>863
使わない値(_)や、未定義の値や型として使われてるね。
文脈から意味を汲み取るしか無い。
0873デフォルトの名無しさん
垢版 |
2018/11/24(土) 14:15:54.52ID:1C+vWWG1
take undefined [] = undefined ― 入力待ち(Carl + Cで強制終了必須)
take 0 undefined = []

⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。
0874デフォルトの名無しさん
垢版 |
2018/11/25(日) 11:21:25.73ID:gET8Juo7
undef :: b -> a
undef ined = undef ined

これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる
0875デフォルトの名無しさん
垢版 |
2018/12/03(月) 16:13:07.05
Haskell では明示的に instance 宣言しなければ、ある class の要件を充たしていることをコンパイラが認識してくれません
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳)
0877デフォルトの名無しさん
垢版 |
2018/12/11(火) 10:40:31.76ID:w4wbcBCq
bsort [] = []
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)

バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。
0878デフォルトの名無しさん
垢版 |
2018/12/11(火) 10:48:30.82ID:w4wbcBCq
動作はこんな感じ。
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]

最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?)
■ このスレッドは過去ログ倉庫に格納されています

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