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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
9
(11): 2019/02/03(日)12:58 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度続いたら処理を止めるとか変な仕組みでも入ってるのかねー
13
(3): 2019/02/03(日)20:51 ID:5bolWXfM(2/36) AAS
>>12
それじゃ納得できないんだけども
終わるから大丈夫仕様ですってもやっとするから

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

そもそもどの値が来たら終わるか全く記述がないよね
そういうところも納得できないっていうかおかしい
15
(3): 2019/02/03(日)21:13 ID:5bolWXfM(3/36) AAS
>>14
あの説明で納得するようならここ来てないから
あれだとブログの説明と何も変わらない

まさか1かtrueを返したら問答無用で終わる仕様だったりするのかねー
18
(1): 2019/02/03(日)21:19 ID:5bolWXfM(4/36) AAS
>>16
それじゃ終わらない
終了条件が書いていないから

なんどもいうように * 1がずーっと続くようにしか見えない
だからこの例題見たときにイライラしてたんだよね
前提となってる仕様があるけど説明省いたとかそれ系かなと
23
(4): 2019/02/03(日)21:25 ID:5bolWXfM(5/36) AAS
>>19
理解したのは>>9の通りで
仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる

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

としか見えないんだよね
25
(3): 2019/02/03(日)21:27 ID:5bolWXfM(6/36) AAS
>>22
ということはやっぱり1を返したら必ず再帰は止まる仕様であってるのかな?
だったらすっきりするんだけども
33
(4): 2019/02/03(日)21:33 ID:5bolWXfM(7/36) AAS
>>28
いやいやfact(1)の評価は0なんだし
fact 0の定義があるからまた1
どう考えても続くんだよね

そもそも再起から脱出するためのコードがどこにもないから怪しいとも踏んでる
何か前提となってる仕様がありそうだ
34
(1): 2019/02/03(日)21:34 ID:5bolWXfM(8/36) AAS
>>29
やっぱりそうなんだ
そういう重要なことは早めに説明書きしといてくれないと大混乱だわ
まースッキリしたありがと

そういう仕様なら色々めんどくさいな・・・
42
(4): 2019/02/03(日)21:39 ID:5bolWXfM(9/36) AAS
>>35
教えてもらったからもう大丈夫だよ
1で再起が止まる仕様なら納得だし

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

1で止まる仕様らしいからそれを前提にコード考えないといかんのか・・
ややこしいことになるねこれ
44
(2): 2019/02/03(日)21:41 ID:5bolWXfM(10/36) AAS
>>39
どーゆーこと
もうそれで覚えちゃったんだけども・・
50
(2): 2019/02/03(日)21:46 ID:5bolWXfM(11/36) AAS
>>45
それだと>>9の通りで揺らがない

>>46
この記述だと無限に *1が続くわけだから
なにか終了条件が必要なわけで
1を返したら再帰が止まる仕様ならなるほど納得
53
(1): 2019/02/03(日)21:49 ID:5bolWXfM(12/36) AAS
>>48
大混乱してきた
1で再帰は必ず止まるんでないならさらにわからなくなるんだけども
55: 2019/02/03(日)21:51 ID:5bolWXfM(13/36) AAS
>>51
fact(1)はfact(n-1)によってfact(0)になるよね
実は式自体が予想外の評価するってことなのかな?
いやまさかね・・
60
(4): 2019/02/03(日)21:57 ID:5bolWXfM(14/36) AAS
>>56
ごめん意味不明わからん

>>57
もちろんそのように考えてる
fact 0 = 1の結果はすぐ反映されるんじゃないの?
64
(2): 2019/02/03(日)22:02 ID:5bolWXfM(15/36) AAS
>>63
いやいや終了条件が何も書かれてないから結局は続くよ
どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ
間違ってないはずなんだけど何か使ってる人には常識的なお約束事とかあるのかな
66
(1): 2019/02/03(日)22:06 ID:5bolWXfM(16/36) AAS
>>65
いやただのカウンターだったとしても止まらないし
やっぱりおかしいとは思う
何か前提がありそうな気はする
70
(2): 2019/02/03(日)22:10 ID:5bolWXfM(17/36) AAS
>>67
= 3 * 2 * 1 * 1
= 3 * 2 * 1 * 1 * fact( 1 - 1 )
= 3 * 2 * 1 * 1 * 1 * fact ( 1 - 1)

どこまでも続くじゃない・・
73
(2): 2019/02/03(日)22:14 ID:5bolWXfM(18/36) AAS
>>69
fact 0 = 1で終了するというのが納得いってない
もしそうであれば1を返せば再帰は終了すると仮定したんだ

そもそもfact 0 = 1ってマクロ定義みたいなもんだし
直ちに評価されて式に代入されるよね
75
(1): 2019/02/03(日)22:18 ID:5bolWXfM(19/36) AAS
>>72
プログラミング言語は数学じゃないから
再帰から脱出するならそのためのコードは絶対必要なはずなんだ
それがないってことは仕掛けがあるはずで
その仮定が1を返せば再帰から脱出できるという考え
でも違うらしいから大混乱してる
77: 2019/02/03(日)22:21 ID:5bolWXfM(20/36) AAS
>>74
Cで再帰させるなら終了条件にヒットしたらフラグたててreturnで戻ってく
関数定義の仕方ならサッと見たけど特に疑問はなかったよ
パターンマッチっていってもマクロ定義みたいなもんだし特にどうということも
79
(2): 2019/02/03(日)22:24 ID:5bolWXfM(21/36) AAS
>>76
いやだから・・
fact 0は1なんだからその次はfact(1)になるでしょ
何も間違ってないと思うんだけど。
81
(2): 2019/02/03(日)22:26 ID:5bolWXfM(22/36) AAS
>>78
それは終了条件じゃないよね
何が正解なのかさらに混乱して来た
86
(2): 2019/02/03(日)22:30 ID:5bolWXfM(23/36) AAS
>>83
だから・・
fact 0は1なんだから続くじゃない?
延々と再帰するようにしか見えない
88: 2019/02/03(日)22:32 ID:5bolWXfM(24/36) AAS
>>85
PythonやJavaは知らないのでなんとも
92
(5): 2019/02/03(日)22:37 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は続くよ
だから色々納得いかないことあるんだけど
95
(3): 2019/02/03(日)22:41 ID:5bolWXfM(26/36) AAS
>>94
それで地道にやったら >>9になったよ
あれ以外どうしろと・・
98
(2): 2019/02/03(日)22:43 ID:5bolWXfM(27/36) AAS
>>96
そこはどうでもいいところだから書かなかった
101: 2019/02/03(日)22:45 ID:5bolWXfM(28/36) AAS
>>97
あれでいいんだけど似たような制御構造がないよね
haskellのコードは全く別物に見える
103: 2019/02/03(日)22:49 ID:5bolWXfM(29/36) AAS
>>99

=3 * 2 * 1 * 1
=3 * 2 * 1 * 1 * 1
=3 * 2 * 1 * 1 * 1 * 1
・・・

やっぱり変わんないよ?
何かやってる人には常識だからあえて書いていないとかのお約束ごととかある言語なんじゃないかなぁ・・
パッと見た感じそんなに難しい言語には見えないけど内容に納得できない
106: 2019/02/03(日)22:51 ID:5bolWXfM(30/36) AAS
>>102
普通にやったけど特に問題なかったよ
108
(1): 2019/02/03(日)22:54 ID:5bolWXfM(31/36) AAS
>>104
fact 0 = 1とか定義されちゃってるから変形もなにもあの形にしかならんでしょう

>>105
fact 0の結果が1だからそれはすぐ反映されるので
111
(1): 2019/02/03(日)22:56 ID:5bolWXfM(32/36) AAS
>>107
不正確と言われても他に言いようがないし
114
(2): 2019/02/03(日)22:58 ID:5bolWXfM(33/36) AAS
>>110
直前の結果が1なのでfact(n-1)に与えられてfact(1-1)
特に問題ないはずだけどもこれだけなら
118
(3): 2019/02/03(日)23:01 ID:5bolWXfM(34/36) AAS
>>112
なっ
まさかそういう意味なの?

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

のどちらかしか評価されないとか見ただけじゃわからないって!!
あーそういうことかー
121
(1): 2019/02/03(日)23:03 ID:5bolWXfM(35/36) AAS
これは説明書きに書いておいて欲しかったなー
これじゃわかりようがないわ
125
(1): 2019/02/03(日)23:04 ID:5bolWXfM(36/36) AAS
完全解決してスッキリ
みんな時間とらせてしまってごめん
そしてありがとう
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.051s