2016-09-10 9 views
3

リストモナド(フラットリストを持つもの、リストとマップ要素を連結したもの)はフリーモナドではないことを自信を持って考えています(正確には、フリーモナドファンクタT)。私の知る限り理解し、私は フラットリストとフリーモナド

  • は、この関係にはないことを示し、

    • 最初の通常の事業者のFMAP間モナドリストの関係を見つけることによって、などに参加することを達成することができるはずです無料モナド一線を画している、リストモナドに保持している独特の関係でどのようなすべてのT.

    ために、関手T以上の任意の空きモナドで開催?私はTが何であるか分からない場合、どのようにstep2を処理できますか?フラットリストが無料でないことを示すための他の戦略はありますか?

    用語の衝突を解消するには、ペアファンクタに関連付けられたフリーモナドがツリーモナド(またはネストされたリストモナド)であることに注意しましょう。フラットリストモナドではありません。

    編集者:haskellプログラミング言語を知っている人には、次のように公式化することができます:List a = Free T a(すべてのTと最大モナド同型異性)?

  • +0

    無料モナドは、外部標識の木を一般化しています。 'a'は' Free'コンストラクタではなく 'Return'コンストラクタに現れます。リストは内部でラベル付けされています。彼らは葉の上だけでなく、リストに沿ってすべてを持っています。 –

    +0

    @ Hodgson私はあなたのコメントを理解しているかどうかはわかりません。木ではない無料のモナドがあります。例えば、整数のモノイドは、1つのオブジェクトのカテゴリ(および単一のモーフ)で識別ファンクタに関連付けられたフリーモナドとして実現できます。 – stackman

    +0

    あなたは 'type Nat = Free Identity()'を参照していますか?これは分岐係数が1のツリーです( 'Identity a'には' a'が含まれているため)。 'Free(( - >)r)'はブランチングファクター 'r'のツリー、' Free(Const Void) 'はブランチングファクターが0のツリーです。その他 –

    答えて

    1

    あなたはコメントで与えられたNat例を考える方法与えられたケースのように思われる特定のタイプに適用されている無料のモナドで大丈夫だ場合、Listが実際Freeを用いて記述することができます。

    ここで
    type List a = Free ((,) a)() 
    

    基礎となる考え方は、List aSucノードはa(したがって(a,)ファンクタの使用ではなくIdentityもの)で標識されたNatであることです。ここで

    は一例と一緒に同型を目撃小さなモジュールです:

    module FreeList where 
    
    import Data.Function 
    import Control.Monad.Free 
    
    type List a = Free ((,) a)() 
    
    toList :: [a] -> List a 
    toList = foldr (curry Free) (Pure()) 
    
    fromList :: List a -> [a] 
    fromList = iter (uncurry (:)) . fmap (const []) 
    
    append :: List a -> List a -> List a 
    append xs ys = xs >>= const ys 
    
    example :: [Integer] 
    example = fromList $ (append `on` toList) [1..5] [6..10] 
    
    +1

    'List a'のbindは' [] 'のバインドではないと考えられます。だから、 'Nat'のような固定型に' Free f'を適用することを再考したいかもしれません。 – gallais

    +0

    それは賢いです! '' ''フリー ''演算子がリストを追加することに対応しているのは非常に驚くべきことです。この構造がモナド同型写像であれば、 'Free(<<)'は標準の '[] 'に対応するでしょう。(<<) '演算子は、追加とはまったく異なります。それでも動作するインスタンス、つまり 'a =()'のインスタンスがあります。この場合、Natをリカバリします。 – stackman

    関連する問題