編集:これは本当に簡単な例です。下のこの例の動機。 これはコンパイル: {-# LANGUAGE TypeFamilies #-}
type family F a b
f :: a -> F a b
f = undefined
f' [a] = f a
そして、GHCiのがいることを報告します *Main> :t f'
f' :: [a] -> F a b
をしかし、我々は
既定の型インスタンスを相互に定義する方法はありますか?私はこの作業のようなものを取得しようとしている: {-# LANGUAGE DataKinds, KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
data Tag = A | B | C
class Foo (
私の質問は、おそらく例の形で説明するのが最も簡単です: type family Take (n :: Nat) (xs :: [k]) :: [k]
type instance Take 0 xs = '[]
type instance Take (n+1) (x ': xs) = x ': Take n xs
(+)は、タイプファミリー自体されているため、ここで第二のインスタンスが、
をINTに、私はこのコードを持っている: type family Id obj :: *
type instance Id Box = Int
をそして私は、私は常にID型ファミリーからのIntを得ることができるので、それを作りたいです。私は変換が必要であることを認識しています。 私は多分クラスを作成することは働くだろうと思った: class IdToInt a where
idT
を理解し、私は次のようなコードを書いてきた: data Name = Name; type instance TypeOf Name = Text
type NameRecord = FieldOf Name;
私が見つけた: instance I NameRecord where
...
は、コンパイルエラーがスローされます、すなわち: Illegal type synony
Wen関数の依存関係を使用して、私は頻繁にのカバレッジ条件にヒットしました。 UndecidableInstancesで持ち上げることは可能ですが、通常はその延長部分から遠ざかります。私は、結果の型は、より汎用的にするとき {-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
data