bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

リストモナドの非決定性 続き

ああ、つまり昨日のコードを抽象化・簡略化して、

nonDet :: (a -> b) -> [a] -> [b]
nonDet f xs = do
	x <- xs
	return (f x)

を考えると、f :: a -> b がモナドに乗っかった世界でいろんな値を返し得ると言うこと?でも入力のxがそもそもいろんな値取ってくるんだし、ってそうか、

nonDet :: (a -> b) -> [a] -> [b]
nonDet f xs = xs >>= (\x -> return (f x))

こう書きなおしたときに、最後のλ式のxに入ってくる値が何来るかわからん(複数入ってくる)よ、ってことですか。要はリストモナドのときの
(>>=) : List(a) -> (a -> List(b)) -> List(b)*1
のaんとこが「多値」、だからList(a)を受け取ったときの戻り値である
g:(a -> List(b)) -> List(b)
も「多値」、とどのつまり、(>>=)が「多値関数」になるよって事なんですかね。*2…なんて朝風呂入りながら何を考えているんだろう、俺w

でも、やっぱわかんね。これ非決定性って言っていいのかなぁ。非決定性の模倣はできると思うけど。*3

って大元の議論はこちらのコメントからです。

*1:Haskellの正しい表記じゃないです。

*2:「多値関数」の用法に自信なし。数学でいう多値関数はこれで正しいんだろうか。

*3:また用語法の問題に帰着してしまうのかな〜

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。