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

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

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 ()って事が特殊)

15 :デフォルトの名無しさん:2019/09/21(土) 11:08:02.46 ID:bVmF0csi.net
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 の部分で致命的エラーとしてログを出して停止
必要ないし可能であれば代用処置後再開
モナドの連鎖引継ぎデータのモーフィング形態変化状態変化

16 :デフォルトの名無しさん:2019/10/14(月) 15:30:20.82 ID:3KpFdUuX.net
>>9
最近モナド理解したけどこの結論に至ったわ
もちろんエラーの分岐を暗黙的にできるとかあるけど
その程度なら普通にif書けばええやんと思った

17 ::2019/10/15(Tue) 12:33:47 ID:mvFnq9AH.net
毎回書くのめんどいじゃん

書けば書くほどバグを入れ込む確率も上がるし

18 :デフォルトの名無しさん:2020/08/04(火) 11:30:27.15 ID:mujhBu6G.net
オブジェクト指向のデザインパターンとかに相当する再利用性ノウハウ的なのは、数学で言うところの抽象化とか一般化とか言うやつじゃ無いかな。

ペアノの公理とリストは、構造的には要素に値を持つかどうかしか違いが無い。
ペアノの公理を整数型に変換する事と、リストの長さを求める事は本質的に同じである。

なら、一見関連が無さそうな2つに共通の関数が作れるぞ?
否、長さを持つ構造全てに共通の関数が作れるはずだ。

そんか感じで長さ型クラスを作って、ペアノの公理とリストをそのインスタンスにして、共通の関数を書く。
元からそう言う型クラスがあれば、共通の関数を書く必要すらなく、インスタンスにするだけで自動的に関数を書いてくれる。

19 :デフォルトの名無しさん:2021/03/03(水) 18:44:18.88 ID:Uz8SJ7eh.net
>ペアノの公理とリストは、構造的には要素に値を持つかどうかしか違いが無い。
このスレにはぶらっと立ち寄っただけだったが、なるほど勉強になった。感謝。

7 KB
新着レスの表示

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

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