Ink

Contents related to tech, hobby, etc

XMonad.Layoutのリスト

|

XMonad.Layoutのリスト

xmonadのレイアウトは、 LayoutClass のインスタンスであることが条件になっており、逆にいうと様々な型によって個別に実装されている。

type LayoutClass :: (* -> *) -> * -> Constraint
class Show (layout a) => LayoutClass layout a where
      ...

instance LayoutClass Tall a where
      ...
instance LayoutClass Full a
...

これはつまり、以下のようなことが出来ないことになる

alist :: LayoutClass layout a => [layout a]
alist = [Full, Tall def def def]

これは以下のようなエラーになる

• Couldn't match type ‘layout’ with ‘Full’ ‘layout’ is a rigid type variable bound by the type signature for: alist :: forall (layout :: * -> *) a. LayoutClass layout a => [layout a] at /tmp/vpWQTsV/198/xmonad.hs:125:1-43 Expected type: layout a Actual type: Full a • In the expression: Full In the expression: [Full, Tall def def def] In an equation for ‘alist’: alist = [Full, Tall def def def] • Relevant bindings include alist :: [layout a] (bound at /tmp/vpWQTsV/198/xmonad.hs:126:1) | 126 | alist = [Full, Tall def def def] | ^^^^

私の理解が正しければ、「 Full の型と Tall の型ちゃうやんけ!??」ってことかなと。 正直よくわからん

Rank2Types 使ってみたけど上手く動かず

alist :: [forall l a. (LayoutClass l a) => l a]

解法

XMonad.Core.Layoutを使う。

alist :: [Layout Window]

なら大丈夫

参考までに

data Layout a = forall l. (LayoutClass l a, Read (l a)) => Layout (l a)