haskell-jp / questions #102 at 2022-11-07 12:13:27 +0900

こんにちは。セグメント木を実装中で、型クラスのコンパイルエラーで困っております。
関連型の使い方が良くないみたいです (gist) が、どう直したら良いでしょうか……?
Viktor Kronvall
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
Viktor Kronvall
type M a :: *
Viktor Kronvall
それでRMQのインスタンスが表現出来なくなるかも知れないので、`type M a :: -> の方が良いかも知れません。 上記のコードを見てM`の役割がはっきりと理解できていなくて、どう言ったtype familyが相応しいかは分かりません。
M は IO に相当するつもりです。帰宅次第試してみますね。ありがとうございます!
補足しておくと、
type M :: * -> *
type M = IO

だと定義される M のカインドが * -> * になってしまって型クラスの a との関係がわからなくなってしまうんですよね。だから
type M a :: * -> * -- クラス定義の中
type M (RMQ RealWorld) = IO -- インスタンス定義の中

という感じで型クラスの a の関数だとわかる形で定義しないといけないのです。
コンパイルできました! ありがとうございます!
Rust で喩えると、明示的に Self 型 (ここでは a) を受け取るイメージでしょうか。
Haskell では <RMQ<RealWorld> as SegmentTree>::M みたいに書けないので、 M (RMQ RealWorld) と書く必要がある気がしました :thinking_face: