関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part31
https://mevius.5ch.net/test/read.cgi/tech/1506447188/
探検
関数型プログラミング言語Haskell Part32
■ このスレッドは過去ログ倉庫に格納されています
2019/01/29(火) 09:05:47.90ID:gJP/u7IJ
2019/02/03(日) 22:19:53.64ID:RwDwNYzW
2019/02/03(日) 22:21:37.72ID:5bolWXfM
>>74
Cで再帰させるなら終了条件にヒットしたらフラグたててreturnで戻ってく
関数定義の仕方ならサッと見たけど特に疑問はなかったよ
パターンマッチっていってもマクロ定義みたいなもんだし特にどうということも
Cで再帰させるなら終了条件にヒットしたらフラグたててreturnで戻ってく
関数定義の仕方ならサッと見たけど特に疑問はなかったよ
パターンマッチっていってもマクロ定義みたいなもんだし特にどうということも
2019/02/03(日) 22:22:31.24ID:RwDwNYzW
>>75
上に書いたけど、漸化式は理解している?
同じ書き方をします
Haskellは数学を基盤としているので、数学的な記述方法でプログラムが書けます
「再帰から脱出するならそのためのコードは絶対必要なはずなんだ」とあるけど、
もう書かれているよ
fact 0 = 1 って
上に書いたけど、漸化式は理解している?
同じ書き方をします
Haskellは数学を基盤としているので、数学的な記述方法でプログラムが書けます
「再帰から脱出するならそのためのコードは絶対必要なはずなんだ」とあるけど、
もう書かれているよ
fact 0 = 1 って
2019/02/03(日) 22:24:44.77ID:5bolWXfM
2019/02/03(日) 22:25:28.82ID:RwDwNYzW
>fact 0は1なんだからその次はfact(1)になるでしょ
その次はもうないよ
その次はもうないよ
2019/02/03(日) 22:26:23.52ID:5bolWXfM
2019/02/03(日) 22:26:31.18ID:DdA3Wm74
>>79
ならないよ。そこが間違ってるんだよ。
ならないよ。そこが間違ってるんだよ。
2019/02/03(日) 22:28:21.00ID:RwDwNYzW
84デフォルトの名無しさん
2019/02/03(日) 22:28:40.54ID:I0qputsI >>42
1で止まる仕様と言うか。。。
掛け算だから1を返すだけ(掛けても変わらない数)で、足し算なら0を返すよ。
sum1toN 0 = 0
sum1toN n = n + sum1toN (n - 1)
1で止まる仕様と言うか。。。
掛け算だから1を返すだけ(掛けても変わらない数)で、足し算なら0を返すよ。
sum1toN 0 = 0
sum1toN n = n + sum1toN (n - 1)
2019/02/03(日) 22:28:53.80ID:DdA3Wm74
2019/02/03(日) 22:30:37.00ID:5bolWXfM
2019/02/03(日) 22:30:46.46ID:o+jOfHnE
この人の脳内だと、
fact 0 = 1
が
fact 0 = fact 1
になってるんじゃないだろうか
fact 0 = 1
が
fact 0 = fact 1
になってるんじゃないだろうか
2019/02/03(日) 22:32:38.86ID:5bolWXfM
>>85
PythonやJavaは知らないのでなんとも
PythonやJavaは知らないのでなんとも
2019/02/03(日) 22:33:23.20ID:DVkCUlxV
この人 77で書いてるけど、文法まともに読んでないんだよ
Haskell 文法自体は一見綺麗で簡単そうに見えるけど
実際には、理解するのが非常に難しい(今回の再帰のとこじゃないんだけど)
適当に文法流し読みして理解しようとするのが 間違っている
もっとも、階乗の再帰は、他の人の説明で理解できるだろうと思うが
Haskell 文法自体は一見綺麗で簡単そうに見えるけど
実際には、理解するのが非常に難しい(今回の再帰のとこじゃないんだけど)
適当に文法流し読みして理解しようとするのが 間違っている
もっとも、階乗の再帰は、他の人の説明で理解できるだろうと思うが
2019/02/03(日) 22:34:03.06ID:DdA3Wm74
>>86
fact 0は1なんだから、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0 -- fact 0が・・
= 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの?
= 6
はい!ここで一旦休憩!君に問題。
3 * 2 * 1 * 1はいくつだ?
fact 0は1なんだから、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0 -- fact 0が・・
= 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの?
= 6
はい!ここで一旦休憩!君に問題。
3 * 2 * 1 * 1はいくつだ?
2019/02/03(日) 22:34:30.64ID:RwDwNYzW
うーん、C言語だと
int fact(int n)
{
if (n == 0) return 1;
else return n * fact (n - 1);
}
と書くのと同じなんだけどねえ
int fact(int n)
{
if (n == 0) return 1;
else return n * fact (n - 1);
}
と書くのと同じなんだけどねえ
2019/02/03(日) 22:37:00.44ID:5bolWXfM
>>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)
=3 * 2 * 1 * 1 * 1*fact(1-1)
=3 * 2 * 1 * 1 * 1*1*fact(1-1)
という具合にいつまでもfactは続くよ
だから色々納得いかないことあるんだけど
2019/02/03(日) 22:37:36.15ID:QPZpvG6g
もうHaskellはあきらめるんだ……
2019/02/03(日) 22:39:05.88ID:RwDwNYzW
>>92
この1行目はどこから出てきたの?
=3 * 2 * 1 * 1 * fact(1-1)
この辺を脳内でテキトーに処理してるからわからないんだよ
fact 3
のところから地道に書きながら置き換えてみな
この1行目はどこから出てきたの?
=3 * 2 * 1 * 1 * fact(1-1)
この辺を脳内でテキトーに処理してるからわからないんだよ
fact 3
のところから地道に書きながら置き換えてみな
2019/02/03(日) 22:41:48.43ID:5bolWXfM
2019/02/03(日) 22:42:17.34ID:DdA3Wm74
>>92
算数のテストで
3 * 2 * 1 * 1は?って問題に、
3 * 2 * 1 * 1 * fact(1-1)って答えるの?
それは算数でも数学でもプログラミング言語でも間違いだよ。
算数でも数学でもプログラミング言語でも答えは6だよ。
算数のテストで
3 * 2 * 1 * 1は?って問題に、
3 * 2 * 1 * 1 * fact(1-1)って答えるの?
それは算数でも数学でもプログラミング言語でも間違いだよ。
算数でも数学でもプログラミング言語でも答えは6だよ。
2019/02/03(日) 22:42:33.19ID:RwDwNYzW
2019/02/03(日) 22:43:47.92ID:5bolWXfM
>>96
そこはどうでもいいところだから書かなかった
そこはどうでもいいところだから書かなかった
2019/02/03(日) 22:43:59.88ID:RwDwNYzW
100デフォルトの名無しさん
2019/02/03(日) 22:44:48.18ID:RwDwNYzW >>98
どうでもよくないから君は間違っている
どうでもよくないから君は間違っている
101デフォルトの名無しさん
2019/02/03(日) 22:45:27.31ID:5bolWXfM102デフォルトの名無しさん
2019/02/03(日) 22:45:46.73ID:wI7xL3t+ >>95
左辺から右辺に書き換えるって分かってる?
左辺から右辺に書き換えるって分かってる?
103デフォルトの名無しさん
2019/02/03(日) 22:49:36.42ID:5bolWXfM >>99
=3 * 2 * 1 * 1
=3 * 2 * 1 * 1 * 1
=3 * 2 * 1 * 1 * 1 * 1
・・・
やっぱり変わんないよ?
何かやってる人には常識だからあえて書いていないとかのお約束ごととかある言語なんじゃないかなぁ・・
パッと見た感じそんなに難しい言語には見えないけど内容に納得できない
=3 * 2 * 1 * 1
=3 * 2 * 1 * 1 * 1
=3 * 2 * 1 * 1 * 1 * 1
・・・
やっぱり変わんないよ?
何かやってる人には常識だからあえて書いていないとかのお約束ごととかある言語なんじゃないかなぁ・・
パッと見た感じそんなに難しい言語には見えないけど内容に納得できない
104デフォルトの名無しさん
2019/02/03(日) 22:50:08.66ID:PKgH5/Eo >>98
どうでもよくないよ。正しい流れは、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
= 6
なのに、>>92によるとあなたは、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
= 3 * 2 * 1 * 1 * fact(1-1)
= 3 * 2 * 1 * 1 * 1 * fact(1-1)
= 3 * 2 * 1 * 1 * 1 * 1 * fact(1-1)
であるという。
正しい答え6にたどり着かない原因はあなたが
3 * 2 * 1 * 1
= 3 * 2 * 1 * 1 * fact(1-1)
と変形(?)してしまっているところなのは明らか。
どうでもよくないよ。正しい流れは、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
= 6
なのに、>>92によるとあなたは、
fact 3
= 3 * fact 2
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1
= 3 * 2 * 1 * 1 * fact(1-1)
= 3 * 2 * 1 * 1 * 1 * fact(1-1)
= 3 * 2 * 1 * 1 * 1 * 1 * fact(1-1)
であるという。
正しい答え6にたどり着かない原因はあなたが
3 * 2 * 1 * 1
= 3 * 2 * 1 * 1 * fact(1-1)
と変形(?)してしまっているところなのは明らか。
106デフォルトの名無しさん
2019/02/03(日) 22:51:48.54ID:5bolWXfM >>102
普通にやったけど特に問題なかったよ
普通にやったけど特に問題なかったよ
>>79
>fact 0は1なんだからその次はfact(1)になるでしょ
ちがいますよ。なんども言っていますが「fact 0 は 1 」、っていう言葉が不正確ですね、fact 0 の「何が」 1 なんでしょうか?
>fact 0は1なんだからその次はfact(1)になるでしょ
ちがいますよ。なんども言っていますが「fact 0 は 1 」、っていう言葉が不正確ですね、fact 0 の「何が」 1 なんでしょうか?
108デフォルトの名無しさん
2019/02/03(日) 22:54:17.35ID:5bolWXfM111デフォルトの名無しさん
2019/02/03(日) 22:56:02.92ID:5bolWXfM >>107
不正確と言われても他に言いようがないし
不正確と言われても他に言いようがないし
112デフォルトの名無しさん
2019/02/03(日) 22:56:26.62ID:o+jOfHnE Cでこんな感じに書いてあげれば分かるのだろうか。
int fact(int n) {
switch(n) {
case 0: return 1; // fib 0 = 1
default: return n * fact(n-1); // fib n = n * fact (n-1)
}
}
int fact(int n) {
switch(n) {
case 0: return 1; // fib 0 = 1
default: return n * fact(n-1); // fib n = n * fact (n-1)
}
}
113デフォルトの名無しさん
2019/02/03(日) 22:57:55.66ID:o+jOfHnE あっとボケた。>>112のfibはfactの間違い
114デフォルトの名無しさん
2019/02/03(日) 22:58:05.17ID:5bolWXfM >>111
あなたは 「fact 0 が 1 」といっていますが、我々は「fact 0 の値が 1」と「fact の引数が 1」とを別のものとして区別しているのです
あなたは区別していますか?あるいは「fact 0 が 1」というけれども fact 0 の何が 1 なんですか?
あなたは 「fact 0 が 1 」といっていますが、我々は「fact 0 の値が 1」と「fact の引数が 1」とを別のものとして区別しているのです
あなたは区別していますか?あるいは「fact 0 が 1」というけれども fact 0 の何が 1 なんですか?
116デフォルトの名無しさん
2019/02/03(日) 22:59:39.94ID:RwDwNYzW118デフォルトの名無しさん
2019/02/03(日) 23:01:37.23ID:5bolWXfM119デフォルトの名無しさん
2019/02/03(日) 23:01:49.80ID:PKgH5/Eo >>108
> fact 0 = 1とか定義されちゃってるから変形もなにもあの形にしかならんでしょう
いいえその形には絶対になりません。
「fact 0 = 1とか定義されちゃってるから」
= 3 * 2 * 1 * fact 0
は
= 3 * 2 * 1 * 1
になります。うん、これはいい。次。
「fact 0 = 1とか定義されちゃってるから」
= 3 * 2 * 1 * 1
は
= 3 * 2 * 1 * 1 * fact(1-1)
になります?いいえ、なりません。勝手に足した「 * fact(1-1)」どっから出てきたんだ。
3 * 2 * 1 * 1は6です。
> fact 0 = 1とか定義されちゃってるから変形もなにもあの形にしかならんでしょう
いいえその形には絶対になりません。
「fact 0 = 1とか定義されちゃってるから」
= 3 * 2 * 1 * fact 0
は
= 3 * 2 * 1 * 1
になります。うん、これはいい。次。
「fact 0 = 1とか定義されちゃってるから」
= 3 * 2 * 1 * 1
は
= 3 * 2 * 1 * 1 * fact(1-1)
になります?いいえ、なりません。勝手に足した「 * fact(1-1)」どっから出てきたんだ。
3 * 2 * 1 * 1は6です。
120デフォルトの名無しさん
2019/02/03(日) 23:03:02.44ID:RwDwNYzW 理解できたようで良かったけど、結局は
>>57 がわかってなかったということだなあ
>>57 がわかってなかったということだなあ
121デフォルトの名無しさん
2019/02/03(日) 23:03:24.76ID:5bolWXfM これは説明書きに書いておいて欲しかったなー
これじゃわかりようがないわ
これじゃわかりようがないわ
122デフォルトの名無しさん
2019/02/03(日) 23:03:29.59ID:PKgH5/Eo >>118
よかったね。君へのレスで「パターンマッチ」を検索してごらん
よかったね。君へのレスで「パターンマッチ」を検索してごらん
124デフォルトの名無しさん
2019/02/03(日) 23:04:21.15ID:RwDwNYzW125デフォルトの名無しさん
2019/02/03(日) 23:04:27.74ID:5bolWXfM 完全解決してスッキリ
みんな時間とらせてしまってごめん
そしてありがとう
みんな時間とらせてしまってごめん
そしてありがとう
126デフォルトの名無しさん
2019/02/03(日) 23:06:11.09ID:RwDwNYzW >>125 がんばれよー
127デフォルトの名無しさん
2019/02/03(日) 23:06:13.09ID:9SI0qp6C fact 0 = 1 は、fact 0 = fact (fact 0)ではありません。
128デフォルトの名無しさん
2019/02/03(日) 23:06:37.09ID:PKgH5/Eo129デフォルトの名無しさん
2019/02/03(日) 23:11:25.99ID:RwDwNYzW >>122 が言っている「パターンマッチ」を彼が調べてくれるといいね
130デフォルトの名無しさん
2019/02/04(月) 07:18:20.69ID:eX/1kX5o >>92
だから、fact 1-1になった後、fact 0になるだろ?
そしたらfact 0 = 1になるんだよ。
数学の数学的帰納法ググれ。
fact 0 = 1
これはfactの引数が0なら強制的に1になると言ってる。
fact n = n * fact (n - 1)
これはfact nを解くには引数のnに、nより1つ小さい数をfactに渡したものを掛けたものと等しいと言っている。
(そして最終的にfact 0で1が返って全体の値が求まる)
fact 3
= 3 * fact (3 - 1)
= 3 * fact 2
= 3 * 2 * fact (2 - 1)
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact (1 - 1)
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1 ― fact 0 = 1より
= 6
だから、fact 1-1になった後、fact 0になるだろ?
そしたらfact 0 = 1になるんだよ。
数学の数学的帰納法ググれ。
fact 0 = 1
これはfactの引数が0なら強制的に1になると言ってる。
fact n = n * fact (n - 1)
これはfact nを解くには引数のnに、nより1つ小さい数をfactに渡したものを掛けたものと等しいと言っている。
(そして最終的にfact 0で1が返って全体の値が求まる)
fact 3
= 3 * fact (3 - 1)
= 3 * fact 2
= 3 * 2 * fact (2 - 1)
= 3 * 2 * fact 1
= 3 * 2 * 1 * fact (1 - 1)
= 3 * 2 * 1 * fact 0
= 3 * 2 * 1 * 1 ― fact 0 = 1より
= 6
131デフォルトの名無しさん
2019/02/04(月) 07:24:43.06ID:eX/1kX5o ただし、fact 0の様な特殊な条件を上に書く必要がある(Haskellに限らず、どの言語も)
132デフォルトの名無しさん
2019/02/04(月) 07:30:26.48ID:eX/1kX5o スタック消費しない末尾再帰とか、まだ先があるのに先が思いやられる。。。
(末尾再帰も最近じゃCやJavaScriptでも効くらしい。実質ループだから使った事ないけど)
(末尾再帰も最近じゃCやJavaScriptでも効くらしい。実質ループだから使った事ないけど)
133デフォルトの名無しさん
2019/02/04(月) 11:21:38.86ID:66n6O4Xc 遅延評価や並行並列がデフォルトの言語ならばスタック消費しないのは当たり前である
134デフォルトの名無しさん
2019/02/04(月) 11:34:48.97ID:nZpfKraZ へっ?
135デフォルトの名無しさん
2019/02/04(月) 11:56:25.98ID:66n6O4Xc 人間の読解力なんて順調に行っても1日1行程度でしかない
136デフォルトの名無しさん
2019/02/04(月) 22:09:21.20ID:fVmYxPyX >>133
代わりにスペースリークするけどな
代わりにスペースリークするけどな
137デフォルトの名無しさん
2019/02/05(火) 00:47:55.71ID:YW+7XZmL リストや配列には複数の要素がある
オブジェクトにも複数のメンバーがある
その一部が不要になってもメモリは全部残る
ここまでは言語に依存しない
オブジェクトにも複数のメンバーがある
その一部が不要になってもメモリは全部残る
ここまでは言語に依存しない
138デフォルトの名無しさん
2019/02/05(火) 02:19:00.11 数日ぶりに覗いたらすっごいスレ伸びてる
139デフォルトの名無しさん
2019/02/05(火) 03:02:15.20ID:/sjztfrr ごいごいすー!
140デフォルトの名無しさん
2019/02/05(火) 05:35:54.03ID:H17BJwTV >>9,112,118 だけ読めばおk
141デフォルトの名無しさん
2019/02/11(月) 10:04:55.57ID:3SqS2rDH HaskelでWindowsアプリケーション作りたいですけどできるんですか?
142デフォルトの名無しさん
2019/02/11(月) 22:30:07.24ID:njsDRqJy 問題は、何十年か前にそれができた人のコードを今コンパイルできるか
今できた人のコードを何十年後にコンパイルできるか
それができるのがC/C++で
他の言語はそれを不可能にして新しい言語を普及させたい
今できた人のコードを何十年後にコンパイルできるか
それができるのがC/C++で
他の言語はそれを不可能にして新しい言語を普及させたい
143デフォルトの名無しさん
2019/02/15(金) 14:13:18.51ID:ZHz1cA+u さようなら遅延評価 2019-02-15
https://kazu-yamamoto.hatenablog.jp/entry/2019/02/15/115630
Haskellがとっつきにくい原因の一つに遅延評価がある。入門書では、無限リストと遅延
評価がことさら強調される。しかし、Haskellを業務で使ってみると、遅延評価が煩わしく
なってくる。遅延評価なしでもほとんどのことは実現できるし、メモリーの使用量は推測
できないし、あまりいいことはない。(中略)
、GHC 8.0 では、言語拡張 Strict と StrictData が提供された。この二つを使えば、
デフォルトの評価戦略が正格評価となる。
つまり、以下のコードの評価戦略は遅延評価だが、Strict と StrictData を用いると
正格評価となる。(中略)
Strict と StrictData をもう少しく知りたい人はStrict Haskellを読んでほしい。
純粋関数型データ構造を読んだ諸君、Haskellではデフォルトが遅延評価だからイマイチ
例題をうまく実装できないと思ったことだろう。でも、今なら簡単にできるのだ!(後略)
https://kazu-yamamoto.hatenablog.jp/entry/2019/02/15/115630
Haskellがとっつきにくい原因の一つに遅延評価がある。入門書では、無限リストと遅延
評価がことさら強調される。しかし、Haskellを業務で使ってみると、遅延評価が煩わしく
なってくる。遅延評価なしでもほとんどのことは実現できるし、メモリーの使用量は推測
できないし、あまりいいことはない。(中略)
、GHC 8.0 では、言語拡張 Strict と StrictData が提供された。この二つを使えば、
デフォルトの評価戦略が正格評価となる。
つまり、以下のコードの評価戦略は遅延評価だが、Strict と StrictData を用いると
正格評価となる。(中略)
Strict と StrictData をもう少しく知りたい人はStrict Haskellを読んでほしい。
純粋関数型データ構造を読んだ諸君、Haskellではデフォルトが遅延評価だからイマイチ
例題をうまく実装できないと思ったことだろう。でも、今なら簡単にできるのだ!(後略)
144デフォルトの名無しさん
2019/02/15(金) 14:59:49.72ID:h0RhILR4 ムグググググググ
145デフォルトの名無しさん
2019/02/15(金) 16:33:48.53ID:iAmk1lDo xcodeで使えないのが致命的なんだよな・・
リンクはできるがUIがらみのコードは書けないわけで
リンクはできるがUIがらみのコードは書けないわけで
146デフォルトの名無しさん
2019/02/16(土) 07:21:27.63ID:6iOnrs/B147デフォルトの名無しさん
2019/02/16(土) 09:09:45.75ID:pHmZSgK3 もういいだろう ただ単に基本的文法すら知らない子じゃん
148デフォルトの名無しさん
2019/02/16(土) 13:13:23.08ID:aQjbCKoN とっつきにくいも聞き飽きたな
パワハラ上司に同じこと言えるのかと
本当にとっつきにくい相手はそういう輩だ
パワハラ上司に同じこと言えるのかと
本当にとっつきにくい相手はそういう輩だ
149デフォルトの名無しさん
2019/02/16(土) 13:16:38.83ID:CJGMkJvN ややこしいことをややこしい方法で簡単にするのがhaskell
150デフォルトの名無しさん
2019/02/16(土) 14:01:52.10ID:aQjbCKoN Pythonのように型を書かないやつはゴミクズ
とかいうハラスメントが一番の問題だから遅延評価は誤差の範囲内
とかいうハラスメントが一番の問題だから遅延評価は誤差の範囲内
151デフォルトの名無しさん
2019/02/17(日) 00:52:21.04ID:jxnSJIL4 一回しか変数に代入しない場合は副作用になりますか?
YES か NOでお答えください。
JavaScriptで言えばこういうコードです。
const a = foo(), b = bar(a), c = baz(b);
(const変数は再代入ができません)
YES か NOでお答えください。
JavaScriptで言えばこういうコードです。
const a = foo(), b = bar(a), c = baz(b);
(const変数は再代入ができません)
152デフォルトの名無しさん
2019/02/17(日) 00:52:52.45ID:KFkN1Yft Haskellスレの皆さんこんにちは✨😃❗
突然ですがこのたびWeb制作板JavaScript質問スレにて、スレ民の総意により、
[1,2,3].map(v => (v += 2, v * v));
のv += 2は副作用ではない。
と決定しました!
ありがとう!ありがとう!
突然ですがこのたびWeb制作板JavaScript質問スレにて、スレ民の総意により、
[1,2,3].map(v => (v += 2, v * v));
のv += 2は副作用ではない。
と決定しました!
ありがとう!ありがとう!
153デフォルトの名無しさん
2019/02/17(日) 00:55:14.71ID:jxnSJIL4154デフォルトの名無しさん
2019/02/17(日) 01:04:11.22ID:KFkN1Yft >>153
?別の方と勘違いされているのでは??
話はシンプル。質問をして、その答えを得た。以下が全てです。この質問と答えに、前後の文脈など関係ありますか??
904 Name_Not_Found sage 2019/02/17(日) 00:42:09.09 ID:???
>>901
悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね?
[1,2,3].map(v => (v += 2, v * v));
のv += 2は(ア)である
1. 副作用である
2. 副作用ではない
907 Name_Not_Found sage 2019/02/17(日) 00:44:40.52 ID:???
>>904
Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ
908 907 sage typo 2019/02/17(日) 00:45:33.97 ID:???
× 2. は迷惑だろ
〇 2. であることは明白だろ
?別の方と勘違いされているのでは??
話はシンプル。質問をして、その答えを得た。以下が全てです。この質問と答えに、前後の文脈など関係ありますか??
904 Name_Not_Found sage 2019/02/17(日) 00:42:09.09 ID:???
>>901
悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね?
[1,2,3].map(v => (v += 2, v * v));
のv += 2は(ア)である
1. 副作用である
2. 副作用ではない
907 Name_Not_Found sage 2019/02/17(日) 00:44:40.52 ID:???
>>904
Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ
908 907 sage typo 2019/02/17(日) 00:45:33.97 ID:???
× 2. は迷惑だろ
〇 2. であることは明白だろ
155デフォルトの名無しさん
2019/02/17(日) 01:06:42.19ID:jxnSJIL4 あの?Haskellスレを荒らさないでくれますか?
関係ない話はJavaScriptスレに戻ってください
関係ない話はJavaScriptスレに戻ってください
156デフォルトの名無しさん
2019/02/17(日) 01:13:02.79ID:KFkN1Yft157デフォルトの名無しさん
2019/02/17(日) 01:15:49.49ID:jxnSJIL4 >>151は単なる質問です。
158デフォルトの名無しさん
2019/02/17(日) 01:25:17.93ID:KFkN1Yft フフッw
159デフォルトの名無しさん
2019/02/17(日) 01:47:05.17ID:bP6HzLuJ うるせ〜〜〜〜一生代入してろ
160デフォルトの名無しさん
2019/02/17(日) 03:04:30.74ID:lVDDSVXk Haskellスレ民の方々どうも!
Web制作板JavaScript質問スレにて、
https://en.wikipedia.org/wiki/Side_effect_(computer_science)
の以下の文章について…
> One common demonstration of side effect behavior is that of the assignment operator in C++.
副作用の振る舞いの一般的なデモとしては、C++の代入演算子があります。
> For example, assignment returns the right operand and has the side effect of assigning that value to a variable.
例えば代入は右オペランドを返し、かつそれと同じ値を変数に代入するという副作用を持ちます。
スレ民の叡智を結集した結果、
・C++の代入演算子は副作用があるが、JavaScriptの代入演算子は副作用がない
・[1,2,3].map(v => (v += 2, v * v));
のv += 2は主作用を使っているのであって、副作用など使っていない!
と決定しました!
パチパチパチ〜
ありがとー!!
Web制作板JavaScript質問スレにて、
https://en.wikipedia.org/wiki/Side_effect_(computer_science)
の以下の文章について…
> One common demonstration of side effect behavior is that of the assignment operator in C++.
副作用の振る舞いの一般的なデモとしては、C++の代入演算子があります。
> For example, assignment returns the right operand and has the side effect of assigning that value to a variable.
例えば代入は右オペランドを返し、かつそれと同じ値を変数に代入するという副作用を持ちます。
スレ民の叡智を結集した結果、
・C++の代入演算子は副作用があるが、JavaScriptの代入演算子は副作用がない
・[1,2,3].map(v => (v += 2, v * v));
のv += 2は主作用を使っているのであって、副作用など使っていない!
と決定しました!
パチパチパチ〜
ありがとー!!
161デフォルトの名無しさん
2019/02/17(日) 13:09:25.08ID:C3KvaR2D 初期化と代入の違いはC++でさんざんやったやつだろ
C++には遅延評価がないから余裕じゃないのか
C++には遅延評価がないから余裕じゃないのか
162デフォルトの名無しさん
2019/02/17(日) 17:34:05.11ID:HZyuZSmb runSTという魔法がある
163デフォルトの名無しさん
2019/02/20(水) 10:51:29.01ID:FaK+gznk Cのマクロ
#define fact(n) (((n)==0)?1:(n)*(fact((n)-1))
これだったら一見まともに見えて
実は無限ループする罠
fact(0)は
((0==0)?1:(0)*((((0)-1)==0)?1:((0)-1)*(....
となって無限ループ。
(ややこしいんで括弧の数とか間違って
るかもしれないけど)
C++でインライン関数で定義した場合は
論理式短絡評価で動くかもしれんが
#define fact(n) (((n)==0)?1:(n)*(fact((n)-1))
これだったら一見まともに見えて
実は無限ループする罠
fact(0)は
((0==0)?1:(0)*((((0)-1)==0)?1:((0)-1)*(....
となって無限ループ。
(ややこしいんで括弧の数とか間違って
るかもしれないけど)
C++でインライン関数で定義した場合は
論理式短絡評価で動くかもしれんが
164デフォルトの名無しさん
2019/02/20(水) 11:35:48.52ID:FaK+gznk 再帰を含む関数がインライン展開されることを
期待するほうが間違いだったか...
期待するほうが間違いだったか...
165デフォルトの名無しさん
2019/02/20(水) 11:43:51.95ID:KVaXFVJv スレチ
166デフォルトの名無しさん
2019/02/20(水) 16:55:25.36ID:xw22aw45 テンプレートメタプログラミングでもしてろクソ
167デフォルトの名無しさん
2019/02/22(金) 10:09:30.67ID:ioyynd1U 花粉の時期に入るとみんなこれやり始めるよね
168デフォルトの名無しさん
2019/02/22(金) 19:18:12.74ID:ioyynd1U だめだわからん
fold_left :: (a -> b -> a) -> a -> [b] -> a
fold_left _ a [] = a
fold_left f a (x:xs) = fold_left f (f a x) xs
リストが a1 a2 a3のとき
folder_left f (f a a1) [a2 a3]
になることはわかる
その先の展開が何時間考えてもわからん
f(f(f(a,a1),a2),a3)になるってゆーんだが
イメージに繋がらない
お前らこんな難解なの本当に使いこなせてるの?
ここまでわかりにくいと有用なのか疑わしく思えて来る
fold_left :: (a -> b -> a) -> a -> [b] -> a
fold_left _ a [] = a
fold_left f a (x:xs) = fold_left f (f a x) xs
リストが a1 a2 a3のとき
folder_left f (f a a1) [a2 a3]
になることはわかる
その先の展開が何時間考えてもわからん
f(f(f(a,a1),a2),a3)になるってゆーんだが
イメージに繋がらない
お前らこんな難解なの本当に使いこなせてるの?
ここまでわかりにくいと有用なのか疑わしく思えて来る
169デフォルトの名無しさん
2019/02/22(金) 19:43:58.95ID:LKaW/yz7 >>168
foldlなんて単なるループみたいなもんだし
今どきJavaでもやるくらい
分かるまでは変に抽象化しないで、具体例で考えるといいよ
folder_left f a [a1 a2 a3]
じゃなくて
folder_left (+) 0 [1, 2, 3]
で考えるとか
そしたら
folder_left f (f a a1) [a2, a3]は
folder_left (+) ((+) 0 1) [2, 3]になる
要は最初に
int sum = 0
for(int a : xs) sum = sum + a
と書くのと変わらない
sumへの蓄積を、変数への再代入ではなく次の関数への引数として書いてるだけ
どちらかというと、いわゆる関数型っぽいのはこういうのよりfoldrでリスト作ったりするときの方かな
foldlなんて単なるループみたいなもんだし
今どきJavaでもやるくらい
分かるまでは変に抽象化しないで、具体例で考えるといいよ
folder_left f a [a1 a2 a3]
じゃなくて
folder_left (+) 0 [1, 2, 3]
で考えるとか
そしたら
folder_left f (f a a1) [a2, a3]は
folder_left (+) ((+) 0 1) [2, 3]になる
要は最初に
int sum = 0
for(int a : xs) sum = sum + a
と書くのと変わらない
sumへの蓄積を、変数への再代入ではなく次の関数への引数として書いてるだけ
どちらかというと、いわゆる関数型っぽいのはこういうのよりfoldrでリスト作ったりするときの方かな
170デフォルトの名無しさん
2019/02/22(金) 19:47:35.11ID:ioyynd1U >>169
まったくわからない
例題載ってるとこにも似たようなことは書いてあるんだけども
ループで書くならすぐ終わる話だけど
ややこしすぎてイメージがつかめない
イメージがつかめたらその時点で理解終了なんだけど
まったくわからない
例題載ってるとこにも似たようなことは書いてあるんだけども
ループで書くならすぐ終わる話だけど
ややこしすぎてイメージがつかめない
イメージがつかめたらその時点で理解終了なんだけど
171デフォルトの名無しさん
2019/02/22(金) 19:51:15.80ID:ioyynd1U a2とa3が分離されそうなことはわかるんだけども
folder_left f (f a a1) [a2 a3]
^^^^
こいつがどこ行くのっていうのと
どこをどうやったら()で括られることになるのかイメージできない
folder_left f (f a a1) [a2 a3]
^^^^
こいつがどこ行くのっていうのと
どこをどうやったら()で括られることになるのかイメージできない
172デフォルトの名無しさん
2019/02/22(金) 20:17:22.94ID:LKaW/yz7 >>171
folder_left f (f a a1) [a2, a3]
になるところまではわかるんだよね?
そしたらまず括弧の中から先に計算するのはどの言語も普通だよね
だから先に(f a a1)の答えが出る
fは引数を2つとる関数だから、答えを出すのに支障はないよね
ここで(f a a1)の計算結果をz1としようか
そしたら上の式は
folder_left f z1 [a2, a3]になるよね?
そうすると、f、z1、[a2, a3]の3つの引数を使って、folder_leftがまた呼び出されるのがわかる?ここが再帰ね
folder_leftの定義は2つあるけど、[a2 a3]は空リスト([])じゃないから、下の
folder_left f a (x:xs)の方が呼ばれるよね?
ここでaはz1、xはa2、xsは [a3]だよね
だからベタで書くと
folder_left f (f z1 a2) [a3]になるよね?
同じように括弧の中が先に計算されるから、(f z1 a2)をz2としようか
そしたら
folder_left f z2 [a3]となる
また全く同じようにfolder_leftを呼び出すと、次は
folder_left f (f z2 a3) []となる
そして同じように(f z2 a3)をz3とすると、
folder_left f z3 []と書ける
ここでまたまたfolder_leftを呼び出してるわけだけど、最後のリストが空リストだよね
だからfolder_leftの2つの定義の内、上の方のfolder_left _ a [] = aが呼ばれる
上から順に呼び出し条件を見てるからね
ここでaはz3のことだから、最終的にz3が答えになる
じゃあz3が何かっていうと、(f z2 a3)だよね。そしてz2が何かっていうと、(f z1 a2)だよね
つまりz3は(f (f z1 a2) a3)のことだ
そして最後にz1は(f a a1)だから、結局
z3 == f (f (f a a1) a2) a3となる
これでどうだ
folder_left f (f a a1) [a2, a3]
になるところまではわかるんだよね?
そしたらまず括弧の中から先に計算するのはどの言語も普通だよね
だから先に(f a a1)の答えが出る
fは引数を2つとる関数だから、答えを出すのに支障はないよね
ここで(f a a1)の計算結果をz1としようか
そしたら上の式は
folder_left f z1 [a2, a3]になるよね?
そうすると、f、z1、[a2, a3]の3つの引数を使って、folder_leftがまた呼び出されるのがわかる?ここが再帰ね
folder_leftの定義は2つあるけど、[a2 a3]は空リスト([])じゃないから、下の
folder_left f a (x:xs)の方が呼ばれるよね?
ここでaはz1、xはa2、xsは [a3]だよね
だからベタで書くと
folder_left f (f z1 a2) [a3]になるよね?
同じように括弧の中が先に計算されるから、(f z1 a2)をz2としようか
そしたら
folder_left f z2 [a3]となる
また全く同じようにfolder_leftを呼び出すと、次は
folder_left f (f z2 a3) []となる
そして同じように(f z2 a3)をz3とすると、
folder_left f z3 []と書ける
ここでまたまたfolder_leftを呼び出してるわけだけど、最後のリストが空リストだよね
だからfolder_leftの2つの定義の内、上の方のfolder_left _ a [] = aが呼ばれる
上から順に呼び出し条件を見てるからね
ここでaはz3のことだから、最終的にz3が答えになる
じゃあz3が何かっていうと、(f z2 a3)だよね。そしてz2が何かっていうと、(f z1 a2)だよね
つまりz3は(f (f z1 a2) a3)のことだ
そして最後にz1は(f a a1)だから、結局
z3 == f (f (f a a1) a2) a3となる
これでどうだ
173デフォルトの名無しさん
2019/02/22(金) 20:22:50.89ID:ioyynd1U174デフォルトの名無しさん
2019/02/22(金) 20:30:54.11ID:LKaW/yz7 >>173
そこらへんは評価戦略の話であって別件だね
再帰の本質ではないよ
Haskellといえば遅延評価みたいなところがあるから混乱しやすいけどね
上で言うならz3こと(f (f (f a a1) a2) a3)を、最後までこの形で持って行って、最後にまとめて計算するのが遅延評価
上で書いたみたく適宜評価していくのが正格評価
Haskellだとfolder_leftは二種類あって、
遅延評価版がfoldl
正格評価版がfoldl'
ぶっちゃけ左畳み込みに関してはfoldlを使うことはない
全部foldl'でいい
そこらへんは評価戦略の話であって別件だね
再帰の本質ではないよ
Haskellといえば遅延評価みたいなところがあるから混乱しやすいけどね
上で言うならz3こと(f (f (f a a1) a2) a3)を、最後までこの形で持って行って、最後にまとめて計算するのが遅延評価
上で書いたみたく適宜評価していくのが正格評価
Haskellだとfolder_leftは二種類あって、
遅延評価版がfoldl
正格評価版がfoldl'
ぶっちゃけ左畳み込みに関してはfoldlを使うことはない
全部foldl'でいい
175デフォルトの名無しさん
2019/02/23(土) 00:41:48.52ID:RiBir1w3 カリー化関数の意図がわからん
sum_of :: (Integer -> Integer, Integer, Integer) -> Integer
sum_of (f, n, m)
| n > m = 0
| otherwise = f n + sum_of (f, n + 1, m)
これはわかる
sum_of' :: (Integer -> Integer) -> Integer -> Integer -> Integer
sum_of' f n m
| n > m = 0
| otherwise = f n + sum_of' f (n + 1) m
どう見ても書き換えただけにしか見えないんだけどこれ意味あって書いてるのかな
カリー化って引数可変で動作する関数を定義するためのものって理解したけど
後者にはそんな意図が含まれてるように見えない
sum_of :: (Integer -> Integer, Integer, Integer) -> Integer
sum_of (f, n, m)
| n > m = 0
| otherwise = f n + sum_of (f, n + 1, m)
これはわかる
sum_of' :: (Integer -> Integer) -> Integer -> Integer -> Integer
sum_of' f n m
| n > m = 0
| otherwise = f n + sum_of' f (n + 1) m
どう見ても書き換えただけにしか見えないんだけどこれ意味あって書いてるのかな
カリー化って引数可変で動作する関数を定義するためのものって理解したけど
後者にはそんな意図が含まれてるように見えない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【芸能】俳優・野村宏伸 テレビドラマの制作費やギャラの現状訴え 「比べものにならない位、今は低くて…」 [冬月記者★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【悲報】資産400億投資家「日本円ガチホはアホ、アベノミクス並みの自国通貨安売り後進国狙い政策でみんな貧乏外国からの仕事で頑張って [733893279]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 【悲報】自民党のヒゲ、外務省局長と中国高官の写真にブチギレwwwwwwwwwwwwww [834922174]
- 麻生太郎、腹をくくる「日本国民が高市を総理に選んだ。であるならば最期まで支えるのが私たちの役目」 [329329848]
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- おじゃる丸実況をするためのお🏡
