4

たとえば、次のようなタイプが与えられます

data Tree a = Branch (Tree a) (Tree a)
            | Leaf a

Functor、Applicative、Monadなどのインスタンスを簡単に作成できます。

ただし、「含まれる」タイプが事前に決定されている場合、たとえば

data StringTree = Branch StringTree StringTree
                | Leaf String

これらのインスタンスを作成する機能が失われます。

StringTreeタイプの関数を作成する場合

stringTreeReturn :: String -> StringTree
stringTreeBind   :: String -> (String -> StringTree) -> StringTree
stringTreeFail   :: String -> StringTree
-- etc.

それはモナドの法則を満たしていましたが、それでもモナドであると言えStringTreeますか?

4

3 に答える 3

3

Tree a一般的にも特定の場合でも、モナドではなくaTree それ自体がモナドです。モナドはタイプではなく、任意のタイプとそのタイプの「モナドバージョン」との間の対応です。たとえば、Integerは整数のタイプであり、はモナドMaybe Integerの整数のタイプです。Maybe

したがって、StringTree型である、はモナドになることはできません。それは同じようなことではありません。モナドの文字列のタイプとして想像することはできますが、関数stringTreeReturnなどは、モナド特派員のタイプと一致しません。モナドのタイプを見てください>>=Maybe

Maybe a -> (a -> Maybe b) -> Maybe b

2番目の引数は、モナド( )の一部aから任意の型への関数です。タイプがあります:MaybeMaybe bstringTreeBind

String -> (String -> StringTree) -> StringTree

2番目の引数は、任意のタイプのモナディックバージョンではなく、Stringのモナディックバージョンへの関数のみにすることができます。String

したがって、任意のモナディックタイプの値に対して実行できるすべてのことを値に対して実行することはできません。そのためStringTree、インスタンスにすることはできません。どういうわけかそれをモナドとして扱うことができたとしても、一般的なモナドコードが意味をなさない方法で一般的なモナド操作を使用できると期待すると、事態はうまくいかなくなりますStringTree

最終的に、モナドコンテナと同様に動作できるコンテナ内にあるため、モナドのように考える場合String、最も簡単な方法は、任意のタイプの汎用コンテナにすることです(Tree a)。文字列のツリーであることに特に依存する補助機能が必要な場合は、Tree String値のみを操作するようにそのコードを記述できます。これは、で一般的に機能するコードと一緒にうまく共存しTree aます。

于 2012-08-23T01:17:51.503 に答える
2

いいえ。タイプ種類の違いを見ています。簡単に言えば、種類はHaskellが型を分類する方法であるため、型よりも抽象化のレベルです。ghci助けられる。

:type stringReturn
stringReturn :: String -> StringTree
:type Functor
<interactive>:1:1: Not in scope: data constructor `Functor'

つまり、すぐに、型を持つ関数は、種類を持つ型とはまったく異なるものであることがわかります。

ghci種類についてもお伺いできます。

:kind Functor
Functor (* -> *) -> Constraint
:kind StringTree
StringTree :: *
:kind Tree
Tree :: * -> *

*表記の変数には種類が使用されます。上記の相互作用から、Functor1つの引数でパラメーター化された型を期待していることがわかります。StringTreeまた、パラメータを使用せず、パラメータを使用していることもわかりますTree

それはあなたの質問を表現し、開梱する長い道のりですが、うまくいけば、それはタイプと種類の違いを示しています。

于 2012-08-22T13:16:36.277 に答える
0

いいえ、それはモナドではありません。それについて考えてみてください、あなたはモナドを書くことができるmので、これまでにのみm String可能ですか?

于 2012-08-22T13:05:07.520 に答える