2016-04-09 7 views
1
sequence :: (Monad m) => [m a] -> m [a] 
sequence []  = return [] 
sequence (x:xs) = x >>= \v -> sequence xs >>= \vs -> return (v:vs) 

私が質問のカップルを持っている:シーケンスの定義におけるリターンのアプリケーションはどれくらい柔軟性がありますか?

  1. mMonadです。しかし、リストに「異なる種類」のモナドが含まれている場合、つまりタイプMonadのコンストラクターの値が異なる場合はどうなりますか?

  2. returnと呼ぶことができますか?少なくとも2つの可能性があるため、私は理解しません。[]と一致する場合はreturn、空でないリストと照合した場合はreturnです。

答えて

4
  1. リストのすべての要素は同じ型を持っている必要がありますので、それらは同じモナドmのためのすべてのタイプm aです。
  2. 希望のタイプはm [a]なので、mreturnが使用されます。リストモナドのreturnが使用された場合、return []のタイプは[[]]となります。これは宣言された結果ではなく、2番目のケースのタイプとも一致しません。
+0

ありがとうございました。今はすべてがクリアです! :) – Gilgamesz

+0

だから、関数型の戻り値の型に基づいたコンパイラは、どの戻り値を呼び出すべきかを推測します。 – Gilgamesz

+2

@Gilgameszタイプが何であるかについて何を知っているかに基づいて決定します。これにはタイプシグネチャが含まれますが、この場合、シグネチャが書き込まれていない場合は、同じタイプを取得します。これは、2番目のケースのタイプから判断できるためです。つまり、シグネチャなしで 'sequence [] = return []'があっただけで、2番目のケースがなければ、 'sequence :: Monad m => [a] - > m [b]'という推論型を取得し、結果はどんなモナドでもあり得る。しかし、リストにはモナドの値が含まれており、2番目のケースの結果はリストの要素と同じモナドにあることがわかります(... – sepp2k

1

mは、任意の具体的なモナドすることができますが、それが具体的なモナドに特化したいたら、すべての出現は、その具体的な型になります。したがって、[m a]がある場合、リストのすべての値は同じコンクリートモナドに特化する必要があります。したがって、あなたの質問は本当に意味をなさない。

関連する問題