[過去ログ] 関数型プログラミング言語Haskell Part32 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
11
(3): ◆QZaw55cn4c [sage] 2019/02/03(日) 15:04:51.94 ID:t4xt++Qj(1/20) AAS
>>9
9(11): デフォルトの名無しさん [sage] 2019/02/03(日) 12:58:27.43 ID:5bolWXfM(1/36) AAS
haskell紹介してるブログとか色々あるけどどこも肝心要のところがすっぽり抜けててイライラするな・・

例えば
fact 0 = 1
fact n = n * fact(n - 1)

これ無限ループになっちゃって終わらないでしょ終端条件も書いてないし。
fact 3を展開すると
3 * ( 2 * ( 1 * ( 1 * ………

0を入力すれば1になるってことはこの先ずーっと1が繰り返されるだけだし。
同じ値が2度続いたら処理を止めるとか変な仕組みでも入ってるのかねー
>無限ループになっちゃって終わらないでしょ終端条件も書いてないし。
いえいえ、終端条件が
>fact 0 = 1
です、n ∈ N たる n からはじまって 0 で終わる、と読みます
fact 3 = 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
で止まります.
19
(2): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:19:41.63 ID:t4xt++Qj(2/20) AAS
>>13
13(3): デフォルトの名無しさん [sage] 2019/02/03(日) 20:51:10.38 ID:5bolWXfM(2/36) AAS
>>12
それじゃ納得できないんだけども
終わるから大丈夫仕様ですってもやっとするから

>>9で書いたように1が無限に続いちゃうと思うんだけどな
0が入力されたら1を返すってことだから
1 - 1でまた繰り返しちゃうよね

そもそもどの値が来たら終わるか全く記述がないよね
そういうところも納得できないっていうかおかしい
では逆に質問しましょうか、そこから両者が部分的にでも合意できるポイントを探ることにしましょう
>>9
>fact 0 = 1
>fact n = n * fact(n - 1)
これをあなたはどのように解釈したかを、もう少し詳しめに記述していただくことは可能でしょうか、私の記述は今は >>13 が精一杯ですが、あなたの返答をみて改善できる点はないか検討したいと思います
22
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:22:54.49 ID:t4xt++Qj(3/20) AAS
>>18
18(1): デフォルトの名無しさん [sage] 2019/02/03(日) 21:19:06.57 ID:5bolWXfM(4/36) AAS
>>16
それじゃ終わらない
終了条件が書いていないから

なんどもいうように * 1がずーっと続くようにしか見えない
だからこの例題見たときにイライラしてたんだよね
前提となってる仕様があるけど説明省いたとかそれ系かなと
終了条件は
>fact 0 = 1
です。関数 fact の引数が 0 なら、1 を関数の値として返し、fact の求値作業は終了します。
fact への入力が 1 でないならば
>fact n = n * fact(n - 1)
の定義をつかって、最初の入力 n よりも小さい値 n - 1 (< n) を使った関数定義がつかえるように変換します
30: ◆QZaw55cn4c [sage] 2019/02/03(日) 21:31:19.47 ID:t4xt++Qj(4/20) AAS
>>23
23(4): デフォルトの名無しさん [sage] 2019/02/03(日) 21:25:18.35 ID:5bolWXfM(5/36) AAS
>>19
理解したのは>>9の通りで
仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる

>>20
だからfact(1)で無限に続いちゃうよね
1 - 1で fact 0をevalしてまたfact(1)になる
そこで終了条件が必要だけど何にも書いてないから記述通りならずーっと続く

としか見えないんだよね
>1 - 1で fact 0をevalしてまたfact(1)になる

>fact 0 = 1
というのは、関数 fact のうち fact(0) (引数が 0) のときの値は 1 である、と確定的な記述をしています。ここで答えが決まったので、さらに答えを求めるための関数適用作業には入りません、それはそういう意味です
どうして eval したあと fact(1) になる、と判断したのでしょうか?
fact(0) = 1 の 1 というのは fact() の値であって、fact の引数ではなく、また fact の引数になりうる記述は 「fact 0 = 1」という記述の中には見つからないのですが

>fact n = n * fact (n - 1)
この記述のなかには、たとえば 引数が 7 だとすると「 fact 8 を fact 7 の値をつかって表現する」ということですから、fact 8 を eval する「途中で」 fact 7 を eval しようとする、ということは書かれています
32: ◆QZaw55cn4c [sage] 2019/02/03(日) 21:32:49.97 ID:t4xt++Qj(5/20) AAS
>>25
25(3): デフォルトの名無しさん [sage] 2019/02/03(日) 21:27:00.44 ID:5bolWXfM(6/36) AAS
>>22
ということはやっぱり1を返したら必ず再帰は止まる仕様であってるのかな?
だったらすっきりするんだけども
「1 を返したら」とまるのではなく
fact 0 = 1
と fact の求値が、この行で確定しているから、止まるのです。
fact 0 = 100
という定義であっても、とまりますよ
36
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:35:45.64 ID:t4xt++Qj(6/20) AAS
>>33
33(4): デフォルトの名無しさん [sage] 2019/02/03(日) 21:33:05.02 ID:5bolWXfM(7/36) AAS
>>28
いやいやfact(1)の評価は0なんだし
fact 0の定義があるからまた1
どう考えても続くんだよね

そもそも再起から脱出するためのコードがどこにもないから怪しいとも踏んでる
何か前提となってる仕様がありそうだ
>いやいやfact(1)の評価は0なんだし
ここが違っています。
fact(1) の評価は 1 * fact(0) であって、 0 じゃないです
fact(0) の値が具体的になにかは、fact(0) を意識しはじめた時点では分からないのですよ
46
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:43:22.74 ID:t4xt++Qj(7/20) AAS
>>42
42(4): デフォルトの名無しさん [sage] 2019/02/03(日) 21:39:35.29 ID:5bolWXfM(9/36) AAS
>>35
教えてもらったからもう大丈夫だよ
1で再起が止まる仕様なら納得だし

>>36
fact(1)を入力したら 1-1を評価するから fact 0
特に問題ないよ

1で止まる仕様らしいからそれを前提にコード考えないといかんのか・・
ややこしいことになるねこれ
>1で再起が止まる仕様なら納得だし
理解が不十分じゃないかと危惧します、その台詞「1 で再起がとまる」という言葉ですが、「何が」 1 で再起が止まる、と考えているのですか?
あなたの発言は、いちいち「何が」「どうだ」の「何が」が欠けているので不安です
47: ◆QZaw55cn4c [sage] 2019/02/03(日) 21:43:58.19 ID:t4xt++Qj(8/20) AAS
>>44
44(2): デフォルトの名無しさん [sage] 2019/02/03(日) 21:41:42.22 ID:5bolWXfM(10/36) AAS
>>39
どーゆーこと
もうそれで覚えちゃったんだけども・・
覚える、という言葉はこういうときに使うものではないと思いますよ
51
(2): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:47:09.11 ID:t4xt++Qj(9/20) AAS
>>42
>fact(1)を入力したら 1-1を評価する
どうしてそう考えたのですか?そのような記述がどこに書かれていたのか説明いただけませんか?
56
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:52:52.90 ID:t4xt++Qj(10/20) AAS
>>50
50(2): デフォルトの名無しさん [sage] 2019/02/03(日) 21:46:48.03 ID:5bolWXfM(11/36) AAS
>>45
それだと>>9の通りで揺らがない

>>46
この記述だと無限に *1が続くわけだから
なにか終了条件が必要なわけで
1を返したら再帰が止まる仕様ならなるほど納得
>この記述だと無限に *1が続くわけだから
あなたの理解になにが足りないのかがわかるような気がしてきました。

「fact の引数が 1 である」と「fact の求値が 1 である」とを区別していないようですね
この二つは厳然として異なります

fact 0 = 1

は、fact(0) の「求値が」1 である、といっているのです

fact n = n * fact (n - 1)

は、たとえば

fact 8 = 8 * fact 7
fact 7 = 7 * fact 6
fact 6 = 6 * fact 5
fact 5 = 5 * fact 4
fact 4 = 4 * fact 3
fact 3 = 3 * fact 2
fact 2 = 2 * fact 1

という記述を纏めて表現しているのであり、これは fact n の「求値」は fact (n - 1) という、もともとの引数 n とは違う n - 1 という引数を使った fact の求値で定義しているのです
58: ◆QZaw55cn4c [sage] 2019/02/03(日) 21:53:48.18 ID:t4xt++Qj(11/20) AAS
>>53
53(1): デフォルトの名無しさん [sage] 2019/02/03(日) 21:49:54.21 ID:5bolWXfM(12/36) AAS
>>48
大混乱してきた
1で再帰は必ず止まるんでないならさらにわからなくなるんだけども
>1で再帰は必ず止まるんでない
「何が」 1 で再帰が止まる、と考えているのですか?
「何が」の部分を答えてください
59
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 21:56:12.46 ID:t4xt++Qj(12/20) AAS
>>54
54(1): デフォルトの名無しさん [sage] 2019/02/03(日) 21:49:57.06 ID:DVkCUlxV(6/11) AAS
>>51
わかるじゃん fact 0で1が出てきたら、また、勝手に再帰させて
fact 1に戻っちゃう 勝手に脳内変換させちゃってる
>fact 0で1が出てきたら、
何が 1 となるのか、そこをはっきり書いてください、「出てきたら」っていいますが、「何が」 1 と出てきたら、なんでしょうか?

>また、勝手に再帰させて
何が 1 となるのか、0 となるのか、そこをはっきりさせないことには、それ以降の思考は不可能ですよ、あなたには「また勝手に再帰させて」とかいうことを考える段階ではありません
62: ◆QZaw55cn4c [sage] 2019/02/03(日) 21:59:44.40 ID:t4xt++Qj(13/20) AAS
>>61
61(1): デフォルトの名無しさん [sage] 2019/02/03(日) 21:58:56.17 ID:DVkCUlxV(7/11) AAS
>>59
いや 俺は本人じゃないから

あくまでも、彼の脳内を勝手に想像しただけ 1がつづくケースを考えただけ
そのものでは無いかもしれないけど、どちらにしようが似たようなケースでしょ
これは失礼…
105
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 22:51:43.03 ID:t4xt++Qj(14/20) AAS
>>64
64(2): デフォルトの名無しさん [sage] 2019/02/03(日) 22:02:19.10 ID:5bolWXfM(15/36) AAS
>>63
いやいや終了条件が何も書かれてないから結局は続くよ
どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ
間違ってないはずなんだけど何か使ってる人には常識的なお約束事とかあるのかな
>またfact(1-1)
どうしてそのように推測したのですか?その 1 - 1 ってどこから誘導したのですか?
107
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 22:53:55.48 ID:t4xt++Qj(15/20) AAS
>>79
79(2): デフォルトの名無しさん [sage] 2019/02/03(日) 22:24:44.77 ID:5bolWXfM(21/36) AAS
>>76
いやだから・・
fact 0は1なんだからその次はfact(1)になるでしょ
何も間違ってないと思うんだけど。
>fact 0は1なんだからその次はfact(1)になるでしょ
ちがいますよ。なんども言っていますが「fact 0 は 1 」、っていう言葉が不正確ですね、fact 0 の「何が」 1 なんでしょうか?
109: ◆QZaw55cn4c [sage] 2019/02/03(日) 22:54:49.82 ID:t4xt++Qj(16/20) AAS
>>86
86(2): デフォルトの名無しさん [sage] 2019/02/03(日) 22:30:37.00 ID:5bolWXfM(23/36) AAS
>>83
だから・・
fact 0は1なんだから続くじゃない?
延々と再帰するようにしか見えない
>fact 0は1なんだから続くじゃない?
fact 0 の「何が」 1 なんですか?そこが他の者と違っている点かと思います
110
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 22:55:58.80 ID:t4xt++Qj(17/20) AAS
>>92
92(5): デフォルトの名無しさん [sage] 2019/02/03(日) 22:37:00.44 ID:5bolWXfM(25/36) AAS
>>90
だから
=3 * 2 * 1 * 1 * fact(1-1)
=3 * 2 * 1 * 1 * 1*fact(1-1)
=3 * 2 * 1 * 1 * 1*1*fact(1-1)

という具合にいつまでもfactは続くよ
だから色々納得いかないことあるんだけど
3 * 2 * 1 * 1 * fact(1-1)

その 1 - 1 はどういう理由で 1 - 1 と書いたのですか?
115: ◆QZaw55cn4c [sage] 2019/02/03(日) 22:58:55.27 ID:t4xt++Qj(18/20) AAS
>>111
111(1): デフォルトの名無しさん [sage] 2019/02/03(日) 22:56:02.92 ID:5bolWXfM(32/36) AAS
>>107
不正確と言われても他に言いようがないし
あなたは 「fact 0 が 1 」といっていますが、我々は「fact 0 の値が 1」と「fact の引数が 1」とを別のものとして区別しているのです
あなたは区別していますか?あるいは「fact 0 が 1」というけれども fact 0 の何が 1 なんですか?
117: ◆QZaw55cn4c [sage] 2019/02/03(日) 22:59:45.17 ID:t4xt++Qj(19/20) AAS
>>114
114(2): デフォルトの名無しさん [sage] 2019/02/03(日) 22:58:05.17 ID:5bolWXfM(33/36) AAS
>>110
直前の結果が1なのでfact(n-1)に与えられてfact(1-1)
特に問題ないはずだけどもこれだけなら
結果は結果、引数は引数です
結果を引数に入れたり、引数を結果にいれたりしていないのですよ
123
(1): ◆QZaw55cn4c [sage] 2019/02/03(日) 23:03:47.98 ID:t4xt++Qj(20/20) AAS
>>118
118(3): デフォルトの名無しさん [sage] 2019/02/03(日) 23:01:37.23 ID:5bolWXfM(34/36) AAS
>>112
なっ
まさかそういう意味なの?

fact 0 = 1
fact n = n * fact(n - 1)

のどちらかしか評価されないとか見ただけじゃわからないって!!
あーそういうことかー
そこでしたか!
うーん、それは見抜けなかったですね、いろいろしつこい質問をしてごめんなさい
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.057s