[過去ログ] 関数型プログラミング言語Haskell Part32 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
600: デフォルトの名無しさん [] 2019/10/22(火) 02:26:17.25 ID:Y6ckqEQv(1/2) AAS
>>595
数学教室 πの焼き方と、プログラマーのための圏論。
ただ、読んだ後に意味を吟味して閃きが必要だった。
まず普通の関数とモナドな関数を同じと見做す考え。
IOモナドの入力は基本、文字列を受け取るので数文字列を受け取って、整数に変換後2倍する関数を作るとする。
getLine >>= \s -> return $ 2 * read s
これと同じ効果の普通の関数を作ってみる。
getLine’ s = 2 * read s
このgetLineとgetLine’をそれぞれ部分適用で見かけの変数を減らす形に変形。
getLine >>= return.(2*).read
getLine’ = (2*).read
この場合、2つの関数は型と引数からの入力か入力装置からの入力かしか違いがない。
関数の中身から見れば、いつ、どんな文字列が来るか分からない。同じ数文字列が来たら同じ結果を返すと言う意味では同じと見なせる。
601(2): デフォルトの名無しさん [] 2019/10/22(火) 02:26:29.61 ID:Y6ckqEQv(2/2) AAS
そして、圏論の主張は変数は引数無しの関数でも有ると言う事。
以下は関数である。
f x = 2 * x
しかし、部分適用されたカリー化関数は関数でもあり、変数でもある。
f = (2*) (関数でもあり、関数という値を返す変数でもある)
すなわち、x = 1のようなただの変数も、つねに1を返すxと言う引数の無い関数と見なせる。
x = 1 (1と言う値の入った変数であり、常に1を返す引数無しの関数でもある)
Haskellでは表現できないものの、さらに言えば数そのものも圏論では値であり、変数であり、関数である。
単純に書くと以下の通りだが、
1 = 1
ペアノの公理(ペアノ数)を使った方が概念的に分かりやすいかも知れない。
data Nat = Zero | Succ Nat
1 = Succ Zero
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.047s