0

現在、モナドを使った計算の基礎を学んでいます。私はコードのスニペットを調べており、それらが何をするかはわかっていると思いますが、明確にする必要があるかもしれません. これには Maybe モナドのインスタンスが含まれます。

末尾を計算しようとする関数と、リストの先頭を計算しようとする関数があります。以下の関数は、リストで呼び出されたときに同等の結果を生成します[1,2,3,4,5] = Just 3

この関数func3は、余分な計算ステップを 'スキップ' しているように見えますfunc2func3計算の結果を受け取り、それを下のテール計算に送り、テールを計算し、その計算の結果を下の関数に渡し、ヘッドを計算するというのは正しいですか?

もしそうなら、なぜ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))
4

2 に答える 2

1

はい、あなたは正しいです。func1、func2、func3 の 3 つの関数は同じことを行います。func2 には、不要な余分なステップが 1 つあります。func1 は do 表記を使用して、func3 とまったく同じ計算を表現します。ただし、func1 と func2 の a、b、c は同じではありません。

于 2014-05-11T11:30:50.353 に答える