質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Q&A

解決済

3回答

2228閲覧

純粋関数と副作用はトレードオフ?

退会済みユーザー

退会済みユーザー

総合スコア0

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

0グッド

1クリップ

投稿2019/02/09 05:55

関数型プログラミングにおける事前知識

全く持ち合わせていない

疑問の生じたとき

「ReduxにおけるReducersは純粋関数であること」と知りました

一方で、絶対にしてはならないこととして

  • 引数に手を加えない
  • 副作用を起こさない
  • 純粋でない関数をcallしない

とありました。ここで疑問が生じました

疑問

「純粋関数であること=副作用を起こさない」という認識は間違いですか?

Reduxの説明からいくと間違っているように思います。しかし、そうすると、純粋関数とは何かはっきりしません。

「純粋関数=参照透過性を持つ=副作用を起こさない」とはならないのでしょうか?

引数に手を加えるということは副作用に含まれますか?副作用とは別ですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「ReduxにおけるReducersは純粋関数であること」と知りました

一方で、絶対にしてはならないこととして(中略)とありました。

JavaScriptでは言語内でこれらが保証できないがゆえの、説明のための注意書きです。

「純粋関数であること=副作用を起こさない」という認識は間違いですか?

何も間違っていません。

投稿2019/02/09 06:34

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/02/09 06:35

「Reduxの説明からいくと間違っているように思います」という判断がどのような論理から導かれたのかが気になります。
maisumakun

2019/02/09 06:38

引数に手を加えるということは副作用に含まれますか?> 引数の破壊的変更は副作用に含まれます。
退会済みユーザー

退会済みユーザー

2019/02/09 11:16

>「Reduxの説明からいくと間違っているように思います」という判断がどのような論理から導かれたのかが気になります。 「絶対にしてはならないこと(Things you should never do inside a reducer:)」として副作用を起こさないと書かれていましたが、「そもそも副作用を起こしてしまっては、純粋関数にならないはずでは?」と感じたためです。英語のニュアンスをうまく汲み取れていないという問題かもしれません。
guest

0

ベストアンサー

以下の認識で回答してみます( wikipedia の受け売りです)。

  • 純粋関数 = pure function
  • 副作用 = side effect

「純粋関数であること=副作用を起こさない」という認識は間違いですか?

「純粋関数 ⇒ 副作用を起こさない」は真ですが、その逆は真とはかぎらないと思います。

Wikipedia によると

pure function とは、次の 2 つの特性を持つ関数のことを言います。

  1. 同じ引数が与えられれば必ず同じ戻り値を返す
  2. 副作用を持たない

とのことです。

引数に手を加えるということは副作用に含まれますか?副作用とは別ですか?

副作用に含まれると思います。これも Wikipedia の受け売りですが、

「副作用を持つ」とは、ローカル環境の外の状態変数を変更すること。つまり、戻り値を返すこと以外に観測可能な影響を持つ、ということ。

とのことです。

(上の引用はいずれも意訳です。正確なニュアンスは各ページをご覧ください)
(私は関数型プログラミングの専門家ではないので間違っている可能性があります。その点を踏まえた上で参考にしてください)

投稿2019/02/09 06:24

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/09 11:17

>「純粋関数 ⇒ 副作用を起こさない」は真ですが、その逆は真とはかぎらないと思います。 逆の例とはどのようなものでしょうか?
miyabi-sun

2019/02/10 03:01 編集

「同じ引数が与えられれば必ず同じ戻り値を返す」は「参照透過」というのだけど、 この条件を満たさないやつがある。 例えばこんなやつ。 const random = max => Math.floor(Math.random() * max); 外の変数は何も汚してないから副作用は出してない。 でも結果はランダムなので参照透過ではない。 他にも外部の変数スコープで結果変わるけどね?みたいなのも参照透過とは言えない。 var test = "test-string"; const tag = tagName => `<${tagName}>${test}</${tagName}>`;
gh640

2019/02/10 03:21

miyabi-sun さんありがとうございます :D > 逆の例とはどのようなものでしょうか? 「逆」というのは「副作用は起こさないけれど、戻り値が引数以外の要素の影響を受けて決まるもの」ですよね。さまざまなパターンがあるかと思いますが、私がここでパッと思いつくのは、乱数を返すもの、システムの現在日時を返す(あるいは現在時刻に関連した値を生成する)もの、カレントユーザの情報を取得するもの、ミドルウェアや外部システムの状態に依存するもの、ユーザ入力に依存するもの等でしょうか。
guest

0

こんにちは。

https://redux.js.org/basics/reducers#handling-actions
ここの説明ですが、Reducerは純粋に保つことが必要で、その具体例として質問文に書かれた三項目を満たすことを求めているように読み取れます。
つまり、「純粋関数であること=副作用を起こさない」という認識は間違いではないと思います。
「Reduxの説明からいくと間違っているように思います」の方が解釈違いなのだと思います。

投稿2019/02/09 16:31

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問