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: