現在、モナドを使った計算の基礎を学んでいます。私はコードのスニペットを調べており、それらが何をするかはわかっていると思いますが、明確にする必要があるかもしれません. これには Maybe モナドのインスタンスが含まれます。
末尾を計算しようとする関数と、リストの先頭を計算しようとする関数があります。以下の関数は、リストで呼び出されたときに同等の結果を生成します[1,2,3,4,5] = Just 3
この関数func3
は、余分な計算ステップを 'スキップ' しているように見えますfunc2
。func3
計算の結果を受け取り、それを下のテール計算に送り、テールを計算し、その計算の結果を下の関数に渡し、ヘッドを計算するというのは正しいですか?
もしそうなら、なぜfunc2
最初の計算の結果を無視する必要があるのでしょうか? myTail xs
計算を実行してから、その値を関数に渡し、末尾の計算の結果ではなく初期リストを使用するように私には思えます。
したがって、これはそれぞれを説明するための単なる冗長な手順a, b, c
ですか? func3
も と同等だと思いますがfunc1
、最上位の計算のみが ですa
。
どうもありがとうございました。
--computes head
myHead :: [a] -> Maybe a
myHead [] = Nothing
myHead (x:xs) = Just x
--computes tail
myTail :: [a] -> Maybe [a]
myTail [] = Nothing
myTail (x:xs) = Just xs
--below are all equivalent
func1 :: [a] -> Maybe a
func1 xs =
do a <- myTail xs
b <- myTail a
c <- myHead b
return c
func2 :: [a] -> Maybe a
func2 xs =
myTail xs >>=
(\a -> myTail xs >>=
(\b -> myTail b >>=
(\c -> myHead c)))
func3 :: [a] -> Maybe a
func3 xs =
myTail xs >>=
(\a -> myTail a >>=
(\b -> myHead b))