2016-03-24 11 views
3

私はハスケルでモナドを計算しようとしていますが、あまりにも遠くには達していません。モナドの型コンストラクタとリターン関数の相違点(Haskell)

私はhttps://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1と他のいくつかのチュートリアル/説明を見つけましたが、タイプコンストラクタとリターン関数の違いについては説明していないようです。

Iは

  • 型コンストラクタを理解できるように、基本的なデータ・タイプの指定された値からモナドを構築します。つまり、Javaのような通常のコンストラクタのようなものです。これは、指定されたパラメータから新しいインスタンスを構築します。
  • return関数は、基本データ型の指定された値に型コンストラクタを適用し、構築されたモナドを返します。

2つの機能が基本的に同じである点は何ですか?だから、たぶん、モナドの例を使用して

EDIT

  • country = Just "China":(コンストラクタ)が値 "中国" のためのモナドを作成します。
  • return "China":中国の値に対応するモナドを返します。したがって、基本的に"China"値を含むモナドです。

私はモナドを値のコンテナとして理解しています。 モナドの1つの使用方法は、単純/既存の計算をより複雑な計算に結合することです。

+0

[]Just一般化で、Leftと...おそらくこれをもう少し具体的にするでしょうか?これを簡単にするための 'Maybe'モナドについて話しましょう - ' Maybe'は型のコンストラクタです、 'return = Just'なので、あなたはこれを使ってあなたの質問を言い換えることができますか? – Carsten

+0

btw:これらは決して同じことをしません - タイプコンストラクタを関数として見ることはできますが、それは型レベルの関数です - 返り値はモナドに値をラップします – Carsten

+1

私は同意すれば分かりません重複...ここで理解のレベルとは異なる問題であると思われる – Carsten

答えて

6

型コンストラクタは型を返す型レベル関数です。 Maybeは、単一の型パラメータを取り、型を返す型コンストラクタです。 Maybe String,Maybe Intなど

データコンストラクタは、特定の型の値を作成するために使用されます。ある種Maybe aために、これらのコンストラクタはreturn関数が例えば「普通」の値から単項値を構築JustNothingすなわち

data Maybe a = Just a | Nothing 

あります

return 1 :: Maybe Int 
return "s" :: [String] 

そこで

class Monad m where 
    return :: a -> m a 

mMonadクラスの定義の中に、例えば型コンストラクタであります(,Maybe,[])であり、returnaの値からm a型のモナド値を構成する関数である。

Maybeのモナドインスタンスの場合、returnは、値がMaybe aとなり、つまり、あなたはMaybeを扱っている知っていれば

instance Monad Maybe where 
    return x = Just x 

ので、あなたが使用している問題ではありません。しかし、returnは、いくつかのモナドのために任意の値m aを構築するために使用できるので、より一般的な型です。m

+0

国を比較して質問から「中国」を返すと、違いは何ですか? Maybeはモナドなので、モナドの価値があるはずです。しかし、 "中国"の返還の結果もそうです。 – Jonas

+0

@Jonas - 'Just'はコンストラクタ、' Maybe'は型コンストラクタです。 'Just x'と' return x'は 'Maybe'と同じですが、' return'はどのモナドにも適用できるという点でより一般的な型です。一般的に使うことができます。 – Lee

+0

戻り関数は、単にモナドに含まれる基本のインスタンスを作成しますか? (基本型のインスタンスを作成する抽象的な方法ですか?) – Jonas

2

タイプコンストラクタは、他のタイプの型を構築します。それは関数ではなく、値とは関係がありません。

ハスケルでは、[]は型コンストラクタです。タイプに適用されると、Int、別のタイプが[Int]になります。

なお、Javaでは[]も型コンストラクタです。新しいタイプのInt[]を既存のタイプIntから外すことができます。

おそらく、データコンストラクタについて質問したかったでしょう。実際には、[]もデータコンストラクタ(タイプコンストラクタのスペルが[]とは異なります)であり、特定の状況ではreturnに相当します。なぜreturnが必要なのですか? returnは、どのモナドに対しても機能し、どのモナドに対しても機能する汎用モナシコードを記述するために使用できます。それはすることができます...私はそれは本当にあなたが尋ねるしようとしているものを理解していなかったと私は理解しなかったいくつかのことは私には間違っているようで怖い

+0

'return' /' pure'は値コンストラクタの一般化です。それは簡単です。これは受け入れられた答えでなければなりません。 – ftor

関連する問題