10

私はtype-aligned sequenceで遊んでいます。特に、それらを折りたたむというアイデアをいじっています。折り畳み可能な型整列シーケンスは次のようになります。

class FoldableTA fm where
  foldMapTA :: Category h =>
                (forall b c . a b c -> h b c) ->
                fm a b d -> h b d
  foldrTA :: (forall b c d . a c d -> h b c -> h b d) ->
             h p q -> fm a q r -> h p r
  foldlTA :: ...

最初に を使用して、単純な方法でシーケンスを型整列リストに変換し (つまり、型整列リスト カテゴリを使用)、次にそのリストを折りたたむfoldrTAという点で、実装は非常に簡単です。残念ながら、長いリストは短いリストの前に追加される可能性があるため、これは非常に非効率的です。右と左の折り目をより効率的に定義するために使用したのと同様のトリックを使用する方法を見つけようとしていますが、そのタイプにはめまいがします。トリックを実行するのに十分なほど一般的ではないようであり、他の方向に進むたびに、追跡できるよりも多くの型変数につながります.foldMapTAfoldMapTAData.FoldableEndo

4

1 に答える 1

7

私はこれがタイプチェックすることを発見しました:

{-# LANGUAGE RankNTypes #-}
module FoldableTA where

import Control.Category
import Prelude hiding (id, (.))

class FoldableTA fm where
  foldMapTA :: Category h => (forall b c . a b c -> h b c) -> fm a b d -> h b d
  foldrTA :: (forall b c d . a c d -> h b c -> h b d) -> h p q -> fm a q r -> h p r
  foldrTA f z t = appEndoTA (foldMapTA (\x -> TAEndo (f x)) t) z

newtype TAEndo h c d = TAEndo { appEndoTA :: forall b. h b c -> h b d  }

instance Category (TAEndo h) where
    id = TAEndo id
    TAEndo f1 . TAEndo f2 = TAEndo (f1 . f2)

意味があるかどうかはわかりませんが、非常に多くの型インデックスがあるため、意味をなさない型チェック コードがたくさんあるとは思えませ

于 2015-06-22T17:23:20.953 に答える