toyboot4e
こんにちは。セグメント木を実装中で、型クラスのコンパイルエラーで困っております。
関連型の使い方が良くないみたいです (gist) が、どう直したら良いでしょうか……?
関連型の使い方が良くないみたいです (gist) が、どう直したら良いでしょうか……?
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-}
type M a :: *
の方が良いかも知れません。
上記のコードを見て
M`の役割がはっきりと理解できていなくて、どう言ったtype familyが相応しいかは分かりません。type M :: * -> * type M = IO
M
のカインドが * -> *
になってしまって型クラスの a
との関係がわからなくなってしまうんですよね。だからtype M a :: * -> * -- クラス定義の中 type M (RMQ RealWorld) = IO -- インスタンス定義の中
a
の関数だとわかる形で定義しないといけないのです。Self
型 (ここでは a
) を受け取るイメージでしょうか。<RMQ<RealWorld> as SegmentTree>::M
みたいに書けないので、 M (RMQ RealWorld)
と書く必要がある気がしました :thinking_face: