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]
解法
alist :: [Layout Window]
なら大丈夫
参考までに
data Layout a = forall l. (LayoutClass l a, Read (l a)) => Layout (l a)