2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

状態管理技術★オブジェクト指向 VS モナド(関数型)

1 :デフォルトの名無しさん:2018/09/28(金) 05:33:54.48 ID:KzZzOQh5.net
アプリケーションの開発において状態を扱うことから逃れることはできません
オブジェクト指向では状態をオブジェクト内部に保持します。
一方、関数型ではモナドを使用します。

モナドは理解が難しいと言われ、そのため関数型の利用は
状態を持たなくて良い一部のライブラリや処理での利用に
とどまっているようです。

さてでは本当に関数型で状態を扱うのは大変なのでしょうか?
このスレでは関数型に詳しい人が、状態をどのように扱っているのかを解説し、
オブジェクト指向と関数型で状態を管理するのは、どちらが簡潔に記述でき
理解やテストがしやすいかを討論するスレです。

禁止事項
関数型言語では状態がなくなるんだ(嘘)だから簡単なんだ。
みたいな嘘、もしくは根拠が無い書き込みはやめてください

2 :デフォルトの名無しさん:2018/09/28(金) 06:40:37.49 ID:hR0VEh+R.net
関数型はモナドを使用するとか言う嘘もやめろよ

3 :デフォルトの名無しさん:2018/09/28(金) 11:13:01.04 ID:ZPUH9RAL.net
自分は関数型は全く知らないけど
オブジェクト指向プログラミングだけで切り込もうと思う
多分あっちのスレからのスピンアウトだよね?

4 :デフォルトの名無しさん:2018/09/28(金) 18:15:42.06 ID:jC6aEKFB.net
コモンリスプオブジェクトシステム
略称 CLOS

5 :デフォルトの名無しさん:2018/11/24(土) 16:11:38.86 ID:+zOeUKp1.net
モナーて関数なの?

6 :デフォルトの名無しさん:2018/12/01(土) 05:38:07.94 ID:bGikX0J0.net
関数が状態持てたら関数型の意味がないような気がするが、そうでもないの?

7 :デフォルトの名無しさん:2018/12/01(土) 06:14:54.83 ID:qTwx0ygK.net
stateモナドとかか?

8 :デフォルトの名無しさん:2019/01/17(木) 00:51:53.19 ID:rro3H2AR.net
誰もモナドなんて分からないのに無理してこんなスレ立てるから…

9 :デフォルトの名無しさん:2019/01/17(木) 09:58:52.91 ID:3QkeoDD1.net
モナドとは関数型言語を手続き型言語にする手法だから
はじめから手続き型を使えばよろしい
終了

10 :デフォルトの名無しさん:2019/03/11(月) 08:51:45.01 ID:9skrQpxpu
分岐=パターンマッチやガード
繰り返し=再帰(特に末尾再帰)
逐次処理=モナド

全ての処理の流れが式として扱えるので、証明器などでバグがない事を証明できる。

11 :デフォルトの名無しさん:2019/03/13(水) 22:25:47.01 ID:vPzmbHWs.net
>>9
モナドは逐次処理を関数型言語にもたらすものではあるけど、モナドのインスタンスIO(アクション)やリストは単純な再帰でもループとして処理出来る。(スタック消費しない)
ループ命令より再帰の方が単純になり易い。

純粋関数型言語限定だろうが、逐次処理を式として扱えるので定理証明システムとかでバグが無いことを証明できる。
(テストを通ってもバグがないと言い切れない手続き型言語との大きな違い)

12 :デフォルトの名無しさん:2019/03/14(木) 01:05:16.15 ID:cU9OQC8I.net
バグはテストが足りない、テストが間違ってることによって起きるのがほとんどなので
純粋関数型言語だろうが、バグの発生率は変わらない

13 :デフォルトの名無しさん:2019/03/14(木) 01:06:24.79 ID:cU9OQC8I.net
> ループ命令より再帰の方が単純になり易い。

末尾再帰になってるものは、ループのほうが単純になる

14 :デフォルトの名無しさん:2019/03/14(木) 06:38:37.07 ID:TPG8S2ma.net
>>13
同程度になる。なら聞いた事あるが。。。
末尾再帰自体がもうfoldlやfoldrとして関数化されてるし。

sum xs = sum’ 0 xs ― 部分適用でxsを省いてsum = sum’ 0とも書ける
where
sum’ a [] = a
sum’ a (x:xs) = sum’ (a + x) xs ― ここのsum’が末尾再帰関数

sum = foldl (+) 0

そしたら、似た構造の関数もfoldlに渡す引数を差し替えるだけ。

product = foldl (*) 1

reverse = foldl (\ns x -> x:ns) []

length = foldl (\a _ -> a + 1) 0

んで、IOモナド(アクション)もIO a型と副作用がある以外は普通の関数なので、普通の関数(自作関数含む)と関数合成も出来るし、普通の関数と同じく部分適用も出来る。
(do使って手続き型っぽくするから関数っぽく見えないだけで、doを使わずモナド演算子で書けばただの式)

main = prs [[1,2,3],[4,5,6]]
where prs = mapM_ print.reverse ― printアクションを含む関数の関数合成&部分適用の例

普通の関数も型に気をつけるので、扱いとしては普通の関数と変わらん。
(どっちかと言うのと特別扱いなのはmain変数の型がIO ()って事が特殊)

5 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★