アプリケーションの開発において状態を扱うことから逃れることはできません
オブジェクト指向では状態をオブジェクト内部に保持します。
一方、関数型ではモナドを使用します。
モナドは理解が難しいと言われ、そのため関数型の利用は
状態を持たなくて良い一部のライブラリや処理での利用に
とどまっているようです。
さてでは本当に関数型で状態を扱うのは大変なのでしょうか?
このスレでは関数型に詳しい人が、状態をどのように扱っているのかを解説し、
オブジェクト指向と関数型で状態を管理するのは、どちらが簡潔に記述でき
理解やテストがしやすいかを討論するスレです。
禁止事項
関数型言語では状態がなくなるんだ(嘘)だから簡単なんだ。
みたいな嘘、もしくは根拠が無い書き込みはやめてください
探検
状態管理技術★オブジェクト指向 VS モナド(関数型)
■ このスレッドは過去ログ倉庫に格納されています
2018/09/28(金) 05:33:54.48ID:KzZzOQh5
2デフォルトの名無しさん
2018/09/28(金) 06:40:37.49ID:hR0VEh+R 関数型はモナドを使用するとか言う嘘もやめろよ
2018/09/28(金) 11:13:01.04ID:ZPUH9RAL
自分は関数型は全く知らないけど
オブジェクト指向プログラミングだけで切り込もうと思う
多分あっちのスレからのスピンアウトだよね?
オブジェクト指向プログラミングだけで切り込もうと思う
多分あっちのスレからのスピンアウトだよね?
4デフォルトの名無しさん
2018/09/28(金) 18:15:42.06ID:jC6aEKFB コモンリスプオブジェクトシステム
略称 CLOS
略称 CLOS
5デフォルトの名無しさん
2018/11/24(土) 16:11:38.86ID:+zOeUKp1 モナーて関数なの?
6デフォルトの名無しさん
2018/12/01(土) 05:38:07.94ID:bGikX0J0 関数が状態持てたら関数型の意味がないような気がするが、そうでもないの?
2018/12/01(土) 06:14:54.83ID:qTwx0ygK
stateモナドとかか?
8デフォルトの名無しさん
2019/01/17(木) 00:51:53.19ID:rro3H2AR 誰もモナドなんて分からないのに無理してこんなスレ立てるから…
2019/01/17(木) 09:58:52.91ID:3QkeoDD1
モナドとは関数型言語を手続き型言語にする手法だから
はじめから手続き型を使えばよろしい
終了
はじめから手続き型を使えばよろしい
終了
10デフォルトの名無しさん
2019/03/13(水) 22:25:47.01ID:vPzmbHWs >>9
モナドは逐次処理を関数型言語にもたらすものではあるけど、モナドのインスタンスIO(アクション)やリストは単純な再帰でもループとして処理出来る。(スタック消費しない)
ループ命令より再帰の方が単純になり易い。
純粋関数型言語限定だろうが、逐次処理を式として扱えるので定理証明システムとかでバグが無いことを証明できる。
(テストを通ってもバグがないと言い切れない手続き型言語との大きな違い)
モナドは逐次処理を関数型言語にもたらすものではあるけど、モナドのインスタンスIO(アクション)やリストは単純な再帰でもループとして処理出来る。(スタック消費しない)
ループ命令より再帰の方が単純になり易い。
純粋関数型言語限定だろうが、逐次処理を式として扱えるので定理証明システムとかでバグが無いことを証明できる。
(テストを通ってもバグがないと言い切れない手続き型言語との大きな違い)
2019/03/14(木) 01:05:16.15ID:cU9OQC8I
バグはテストが足りない、テストが間違ってることによって起きるのがほとんどなので
純粋関数型言語だろうが、バグの発生率は変わらない
純粋関数型言語だろうが、バグの発生率は変わらない
2019/03/14(木) 01:06:24.79ID:cU9OQC8I
> ループ命令より再帰の方が単純になり易い。
末尾再帰になってるものは、ループのほうが単純になる
末尾再帰になってるものは、ループのほうが単純になる
13デフォルトの名無しさん
2019/03/14(木) 06:38:37.07ID:TPG8S2ma >>12
同程度になる。なら聞いた事あるが。。。
末尾再帰自体がもう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 ()って事が特殊)
同程度になる。なら聞いた事あるが。。。
末尾再帰自体がもう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 ()って事が特殊)
2019/09/21(土) 11:08:02.46ID:bVmF0csi
a = 1 + 1 + 1
a = は入出力IO
1 + 1 + 1
(1 + 1) + 1
+ は 1 1 を引数として受け取り 2に変形して返すモナド
2 + 1
+ は 2 1 を以下同文
a = 3
入出力で a に 3 を渡す
(1 + 1) / 0
モナド連鎖の過程で / 0 の部分で致命的エラーとしてログを出して停止
必要ないし可能であれば代用処置後再開
モナドの連鎖引継ぎデータのモーフィング形態変化状態変化
a = は入出力IO
1 + 1 + 1
(1 + 1) + 1
+ は 1 1 を引数として受け取り 2に変形して返すモナド
2 + 1
+ は 2 1 を以下同文
a = 3
入出力で a に 3 を渡す
(1 + 1) / 0
モナド連鎖の過程で / 0 の部分で致命的エラーとしてログを出して停止
必要ないし可能であれば代用処置後再開
モナドの連鎖引継ぎデータのモーフィング形態変化状態変化
2019/10/14(月) 15:30:20.82ID:3KpFdUuX
2019/10/15(火) 12:33:47.81ID:mvFnq9AH
毎回書くのめんどいじゃん
書けば書くほどバグを入れ込む確率も上がるし
書けば書くほどバグを入れ込む確率も上がるし
17デフォルトの名無しさん
2020/08/04(火) 11:30:27.15ID:mujhBu6G オブジェクト指向のデザインパターンとかに相当する再利用性ノウハウ的なのは、数学で言うところの抽象化とか一般化とか言うやつじゃ無いかな。
ペアノの公理とリストは、構造的には要素に値を持つかどうかしか違いが無い。
ペアノの公理を整数型に変換する事と、リストの長さを求める事は本質的に同じである。
なら、一見関連が無さそうな2つに共通の関数が作れるぞ?
否、長さを持つ構造全てに共通の関数が作れるはずだ。
そんか感じで長さ型クラスを作って、ペアノの公理とリストをそのインスタンスにして、共通の関数を書く。
元からそう言う型クラスがあれば、共通の関数を書く必要すらなく、インスタンスにするだけで自動的に関数を書いてくれる。
ペアノの公理とリストは、構造的には要素に値を持つかどうかしか違いが無い。
ペアノの公理を整数型に変換する事と、リストの長さを求める事は本質的に同じである。
なら、一見関連が無さそうな2つに共通の関数が作れるぞ?
否、長さを持つ構造全てに共通の関数が作れるはずだ。
そんか感じで長さ型クラスを作って、ペアノの公理とリストをそのインスタンスにして、共通の関数を書く。
元からそう言う型クラスがあれば、共通の関数を書く必要すらなく、インスタンスにするだけで自動的に関数を書いてくれる。
2021/03/03(水) 18:44:18.88ID:Uz8SJ7eh
>ペアノの公理とリストは、構造的には要素に値を持つかどうかしか違いが無い。
このスレにはぶらっと立ち寄っただけだったが、なるほど勉強になった。感謝。
このスレにはぶらっと立ち寄っただけだったが、なるほど勉強になった。感謝。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 高市内閣「支持」64%「不支持」19% NHK世論調査 ★2 [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 高市首相「多様なコメの増産を進める」 方針転換への懸念払拭狙いか ★2 [どどん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 初めて顔パックしたけど凄いなこれ
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 巨大地震 [957955821]
- 千晴の住所教えてよ!
- 【🏡】岩手ビックウェーブ🏄うおおおおおおおおおおお🌊
- 【速報】高市早苗、起床 [779938112]
