5

テキスト エディタRasaの作業を続けています。

現時点では、ビューポート/分割を追跡するためのシステムを構築しています (vim 分割に似ています)。この構造をツリーとして表現するのは、私には自然に思えました。

data Dir = Hor
         | Vert
         deriving (Show)

data Window a =
  Split Dir SplitInfo (Window a) (Window a)
    | Single ViewInfo a
    deriving (Show, Functor, Traversable, Foldable)

これはうまく機能し、s をツリーに保存Viewし、それらをトラバース/fmap して変更することができます。これは、レンズ パッケージとも非常によく適合します!

私は最近再帰スキームについて学んでいますが、ツリーは再帰的なデータ構造であるため、これはそれらに適したユースケースのようです。

Fixpoint バージョンを構築するのに十分なほどよく理解できました。

data WindowF a r =
  Split Dir SplitInfo r r
    | Single ViewInfo a
    deriving (Show, Functor)

type Window a = Fix (WindowF a)

rただし、現在、Functor インスタンスは;によって使い果たされています。

私はいくつかのバリエーションを試しました

deriving instance Functor Window

しかし、 window は型シノニムであるため、チョークします。

と:

newtype Window a = Window (Fix (WindowF a)) deriving Functor

そしてそれも失敗します。

• Couldn't match kind ‘* -> *’ with ‘*’
    arising from the first field of ‘Window’ (type ‘Fix (WindowF a)’)
• When deriving the instance for (Functor Window)
  1. fmap/traverse over を定義することはまだ可能aですか? それとも、再帰スキームのプリミティブを使用してこれらの操作を行う必要がありますか? Bifanctor を実装しますか? インスタンスの実装はどのようになりますか?

残りの型はここにあります。ウィンドウ用の適切な Functor インスタンスがないため、プロジェクトはコンパイルされません...

ありがとう!!

4

2 に答える 2